Newer
Older
Ruby / Game_Health record.rb
require 'csv'
require 'prawn'

# 家族メンバーごとのポイントとバッチを管理するハッシュ
points = Hash.new(0)
badges = Hash.new{ |hash, key| hash[key] = []}
entries = Hash.new(0)# データ入力回数を管理

def add_points(member_name, points,badges, additional_points, entries)
 points[member_name] += additional_points
 entries[member_name] += 1
 check_for_badges(member_name, points, badges, entries)
end

def check_for_badges(member_name, points, badges, entries)
  if points[member_name] >= 50 && !badges[member_name].include?("新米記録者")
   badges[mamber_name] << "新米記録者"
   puts "おめでとう!! #{member_name}がバッジ『新米記録者』を獲得しました!"
  end
  if points[member_name] >= 100 && !badges[member_name].include?("熟練記録者")
   badges[member_name] << "熟練記録者"
   puts "スゴーイ!!\(^o^)/#{member_name}がバッジ『熟練記録者』を獲得しました!まだいけるよね……?(ΦωΦ)ミテルヨ…"
  end
  if entries[member_name] >= 7 && !badges[member_name].include?("継続記録者")
   badges[mamber_name] << "継続記録者"
   puts "素晴らしい!!!\\\(・o・)/// #{member_name}がバッジ『継続記録者』を獲得しました!"
  end
  if entries[member_name] >= 100 && !badges[member_name].include?("マイルストーン達成者")
    badges[mamber_name] << "マイルストーン達成者"
    puts "お見事!!!\\\\\\\\\工エエェェ(´д`)ェェエエ工 スゴーーー #{member_name}がバッジ『マイルストーン達成者』を獲得しました!これからも健康に生活しよう!!!"
  end
end

def save_health_data(mamber_name, bate, weight, blood_pressure, note, steps, sleep_hours)
  CSV.open('health_records..csv', 'a') do |csv|
    csv << [menber_name, date, weight || " ", blood_pressure || " ", nate, steps || " ", sleep_hours || " " ]
    end
  end

def get_health_data(mamber_name)
 data = {}

 print"日付を入力してください (例:2024-10-15):"
 data[:date] = gets.chomp

 print"体重を入力してください (kg)"
 weight_input = gets.chomp
 data[:weight] = weight_input.empty? ? nil : weight_input.to_f

 print"血圧を入力してください (例: 120\80):"
 data[:blood_pressure] = gets.chomp

 print"気づいたことや変化を記録してください (任意):"
 data[:nate] = gets.chomp

 print "昨日の万歩計の歩数を入れてください:"
 steps_input = gets.chomp
 data[:steps] = steps_input.empty? ? nil : steps_input.to_i

 print "昨日の睡眠時間を入力してください (時間): "
 sleep_hours_input = gets.chomp
 data[:sleep_hours] = sleep_hours_input.empty? ? nil : sleep_hours_input.to_f
  
 data.merge(member_name: member_name)
end

def display_family_data
 puts"家族全員の健康観察記録:"
 CSV.foreach('health_records.csv',headers: true) do |row|
   puts "メンバー: #{rou['Member']}, 日付: #{rou['Data']}, 体重: #{rou['Weightz']}kg, 血圧: #{rou['Blood Pressure']}, メモ: #{row['Note']}, 歩数: #{row['Steps']}, 睡眠時間: #{row['Sleep Hours']}時間"
 end
end

def create_pdf_report_for_member(member_name)
 health_data = []
 CSV.fortach('health_records.csv', headers: true) do |row|
   if row['Member'] == member_name
     health_data << { data: row['Date'], weight: row['Weight'], blood_perssure: row['Blood Perss'], note: row['Note'], steps: row['steps'], sleep_hours: row['Sleep Hours'] }
   end
 end

 health_data.sort_by! { |record| record[:date] }

 Prawn::Document.generate("#{member_name}_health_report.pdf") do |pdf|
  pdf.text "#{member_name}の健康レポート", size: 30, style: :bold
  pdf.move_down 20

  
  health_data.each do |record|
    pdf.text "日付: #{record[:date]}"
    pdf.text "体重: #{record[:weight]}kg"
    pdf.text "血圧: #{record[:blood_pressure]}"
    pdf.text "メモ: #{record[:note]}"
    pdf.text "歩数: #{record[:steps]}"
    pdf.text "睡眠時間: #{record[:sleep_hours]}"
    pdf.move_down 10
   end
  end
 end
# メインプログラムレープ
loop do
 puts "1: 健康データを入力する"
 puts "2: 健康データを表示する"
 puts "3: ポイントとバッジを確認する"
 puts "4: 家族全員のリーダーボードを表示する"
 puts "5: PDFレポートを生成する"
 puts "6: 終了する"
 choice = gets.chomp.to_i

 case choice
 when 1
   puts "データを入力するメンバーを選んでください: おばあちゃん, お父さん, お母さん, 子ども①, 子ども②"
   member_name = gets.chomp
   data = get_health_data(member_name)
   save_health_data(data[:member_name], data[:data], data[:weight], data[:blood_pressure], data[:note], data[:steps], data[:sleep_hours])
   add_points(member_name,points,badges,10,entries)
   puts "薬のんだ?忘れないで飲んでね!"
 when 2
   display_family_data
 when 3
  points.each do |member_name, point|
   puts "#{menber_name}のポイント: #{point}"
   puts "#{member_name}の取得したバッジ: #{badges[member_name].join(',')}"
  end
 when 4
  puts "家族全員のリーダーボード:"
  points.sort_by {|_, point| -point }.each do |member_name, point|
   puts "#{member_name}: #{point} ポイント"
  end
 when 5
  puts "PDFレポートを生成するメンバーを選んでください: おばあちゃん, お父さん, お母さん, 子ども①, 子ども②"
  member_name = gets.chomp
  create_pdf_report_for_member(member_name)
  puts "PDFレポートが作成されました: #{member_name}_health_report.pdf"
 when 6
  puts "今日も一日楽しく過ごそう!ヽ(`▽´)/"
  break
 else
  puts "無効な選択です。もう一度試してください。"
 end
end