Newer
Older
Ruby / procon / mushi_miwake_game.rb
#usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'csv'
require 'io/console'
require 'io/console/size'
require 'timeout'
puts("虫見分けゲーム!")
puts("\n虫の写真が表示されます。")
puts("\nその虫が外来種か絶滅危惧種か固有種か見分けて、矢印キーで写真を移動させてそれぞれの箱に入れてください。")
puts("\n正しい箱に入れられたら+1ptです。")
puts("\n虫は全部で22匹用意されていて、出てくる虫はその中の5匹です。")
puts("\n実行するウィンドウはmltermで、なるべく大きくしておきましょう。")
puts("\n準備はいいですか?(Enter)")
print(">>")
gets
def byouga(y,box,r_mushi,a,tate,yoko,quiznum)
  system("clear")
  print("\e[1;1H")
  printf("\e[30;47m<%d種類目> %s[%s]\n\e[m",quiznum,r_mushi["和名"],r_mushi["学名"])
  (tate/64*49-1).times{print((" "*(a+1))*3," \n")}
  print("\e[#{tate/64*49};1H")
  (tate/64*16-2).times{print(("@"+" "*(a))*3,"@\n")}
  puts("@"*(3*a+4))
  print("\e[#{tate/64*65-2};#{a*0+2}H\e[34;47m外来種\e[#{tate/64*65-2};#{a*1+3}H絶滅危惧種\e[#{tate/64*65-2};#{a*2+4}H固有種\e[m")#tate/64*49-1+tate/64*16-2+1=tate/64*65-2
  print("\e[#{tate/64*65-1};1H<説明>\n",r_mushi["説明"])
  print("\e[#{y*1+2};#{box*a+2+box}H")
  system("img2sixel #{r_mushi["写真"]}")
end
def kekka(box,seikai,a,r_mushi,point)
  system("clear")
  print("\e[1;1H<結果発表!!>\n")
  sleep(1)
  printf("\e[47m%s\e[m\n",box==seikai ? "\e[31m正解!" : "\e[34m不正解…" )
  system("img2sixel #{box==seikai ? "mark_maru.png" : "mark_batsu.png" }")
  print("\e[2;46H#{r_mushi["和名"]}[#{r_mushi["学名"]}]は#{r_mushi["状態"]}でした。\e[4;46H")
  system("img2sixel #{r_mushi["写真"]}")
  puts("\e[37;1H<説明>\n#{r_mushi["説明"]}")
  puts("<分布地域画像>")
  system("img2sixel #{r_mushi["分布地域画像"]}")
  puts("灰色…絶滅\n赤色…絶滅危惧I類\nオレンジ…絶滅危惧II類\n黄色…準絶滅危惧種\n水色…情報不足") if r_mushi["状態番号"]=="1"
  print("説明文は#{r_mushi["説明出典"]}\n写真は#{r_mushi["画像出典"]}(横のpxが300になるようにアスペクト比を変えずに拡大・縮小しました。)")
  puts("\n現在のポイント:#{point}pt")
  return (box==seikai ? 1 : 0 )
end
mushi=CSV.read("虫データ.csv",:headers => true)
mushi_num=Array.new(mushi.length){|n| n }
tate,yoko=IO::console_size
a=(yoko-1)/4-1
point=0
quiznum=1
syu=22-5
while mushi_num.length>syu
  r=rand(mushi_num.length)
  r_mushi=mushi[mushi_num[r]]
  y=0
  box=0 #0:外来種,1:絶滅危惧種,2:固有種
  while true
    byouga(y,box,r_mushi,a,tate,yoko,quiznum)
    break if y==tate/64*65-2-r_mushi["写真サイズ"].to_i-2
    begin
      Timeout.timeout(0.5){
        key=STDIN.getch
        if key=="\e"&&STDIN.getch=="["
          key=STDIN.getch
          if key=="B" #↓
            break if y==tate/64*65-2-r_mushi["写真サイズ"].to_i-2
            y+=1
          elsif key=="C" #→
            if box==2
            else
              box+=1
            end
          elsif key=="D" #←
            if box==0
            else
              box-=1
            end
          end
        elsif key=="\C-c"
          exit
        end
      }
    rescue Timeout::Error
      y+=1
    end
  end
  sleep(0.5)
  mushi_num.delete_at(r)
  point+=kekka(box,r_mushi["状態番号"].to_i,a,r_mushi,point)
  quiznum=mushi.length-mushi_num.length+1
  print(mushi_num.length>syu ? "次の問題に行きますか?(yes:Enter no(中断):Ctrl+c)\n>>" : "結果のページを開きますか?\n>>")
  gets
end
kekka_html=File.read("kekka.html")
file="m_m_game_kekka.html"
open(file, "w") {|html| html.print kekka_html.gsub("_point_", point.to_s)}
system("firefox m_m_game_kekka.html")