#!/usr/koeki/bin/ruby
# -*- coding: utf-8 -*-

def help
  print"---限定じゃんけん説明---\n"
  print"参加者は全て3つのトークンを持ってゲームをスタートします。\n"
  print"一度の対戦で3回勝負し、勝数の多い方がその対戦の勝利者となりトークンを一つ相手から奪うことができます。\n"
  print"[グー][チョキ][パー]は全試合を通してそれぞれ3回までしか選択できず、使いきらなくてはいけません。\n"
  print"トークンが0になった時点で失格となります。\n"
end

def mtxt(txt,speed) #文字送りを行うtxtに表示したいテキスト speedに停止測度
  txt.split
  length=txt.length
  0.upto(length-1) do |i|
    STDERR.print "\r" + " "*(length-1-i) + txt[0..i] + "  "
    sleep(speed)
  end
end

def win(d)
  if d < 1
    print"残念!あなたはトークンを失ってしまった!!"
    printf("強制労働%d年!地下行き確定!!",rand(1..10)*10)
  end
end
round = 1

era =[3,3,3]
token = 3
spd = 0.09
print"「限定じゃんけん」へようこそ!!\n"
print"説明を見たい場合は[help]と入力して下さい。\n始める場合はそのままReturnして下さい。\n"
sel = gets.chomp
if sel == "help"
  help
end

while true
  i = 1
    printf("第%d戦...",round)
    round += 1
    result = 0
    enresult = 0
    while i < 4
      printf("%d回目",i)
      i += 1
      print("出す手を決めて下さい。\nグー=0 チョキ=1 パー=2 \n")
      sel = gets.chomp.to_i
      if era[sel] < 1

      print"その手はもう選択できません。\n"
        redo
      else
        mtxt("じゃんけん...",spd)
        print"ポン!!\n"
        sleep(0.2)
        ench = rand(3)
        if sel == 0
          era[sel] -= 1
          if ench == 0
            print"あいこ\n"
          elsif ench == 1
            print"勝ち!\n"
            result += 1
          elsif ench == 2
            print "負け!\n"
            enresult += 1
          end
        elsif sel == 1
          era[1] -= 1
          if ench == 0
            print"負け!\n"
            enresult += 1
          elsif ench == 1
            print"あいこ\n"
          elsif ench == 2
            print"勝ち!\n"
            result += 1
          end
        elsif sel == 2
          era[2] -= 1
          if ench == 0
            print "勝ち!\n"
            result += 1
          elsif ench == 1
            print"負け!\n"
	     enresult += 1
          elsif ench == 2
            print"あいこ\n"
          end
        else
          print"指定された数字を入力して下さい。"
          redo
        end
      end
    end
    if result > enresult 
      token += 1
      mtxt("おめでとうございます!あなたの勝ちです!トークンを1獲得します。",spd)
      printf("\n現在あなたが持っているトークンは%d個です。\n",token)
      next
    elsif result = enresult
      mtxt("引分だったためトークンの移動はありません。\n",spd)
      next
    elsif result < enresult
      token -= 1
      mtxt("勝負に負けてしまった!",spd)
      mtxt("トークンを1失った!",spd)
      win(token)
    end
    if rock + scissors + paper <= 0
      mtxt("これにて終了!!",spd)
      printf("\nあなたはトークンを%d個持っています!\n",token)
      print"とねがわ「"
      mtxt("そのトークンを一つ100万で買い取ろう",spd)
      print"」\n"
      rate = token * 1000000
      printf("あなたはトークンを売って%d円の現金を手に入れた!!",rate)
      mtxt("おわり",1)
    end
end

動作結果
「限定じゃんけん」へようこそ!!
説明を見たい場合は[help]と入力して下さい。
始める場合はそのままReturnして下さい。

第1戦...1回目出す手を決めて下さい。
グー=0 チョキ=1 パー=2 
1
じゃんけん...  ポン!!
勝ち!
2回目出す手を決めて下さい。
グー=0 チョキ=1 パー=2 
1
じゃんけん...  ポン!!
あいこ
3回目出す手を決めて下さい。
グー=0 チョキ=1 パー=2 
1
じゃんけん...  ポン!!
あいこ
おめでとうございます!あなたの勝ちです!トークンを1獲得します。  
現在あなたが持っているトークンは4個です。
第2戦...1回目出す手を決めて下さい。
グー=0 チョキ=1 パー=2 
ー以下第3戦が終わるまで省略ー
これにて終了!!
あなたはトークンを5個持っています!
とねがわ「そのトークンを一つ100万で買い取ろう」
あなたはトークンを売って500万円の現金を手に入れた!
おわり

説明
mtxtというメソッドの内部に引数として入力した文字列を第二引数として入力し
た数値のぶんだけ遅延をかけて一文字づつ表示するように設定した。

helpメソッドではメソッドに引数を必要とせずにいつでもゲームの説明を呼び出せ
るようにした。

win(d)メソッドではトークン数を表す引数を一つ指定し、これによりトークンが0以下になったかどうかを判別し、その結果に応じてゲーム終了を指定するようにした。

プログラム本体では、ハッシュを利用して、グーチョキパーそれぞれをkeyに、
それぞれ3枚づつ保有している設定なのでvalueを3に設定した。
これを利用することによって、すべての勝負を通して特定のカードを使用する回
数に制限を掛けることができる。
あいての出す手はrand変数を利用することで毎回異なる値を返すように設定した。
result,enresult変数を利用して勝敗を判定し、その結果に応じてトークンを獲
得、喪失、維持の状態を返すようにした。

感想
今回のプログラムでもっとも工夫したことはmtxtメソッドを作成したことです。
これにより文字をconsole上で一文字づつ表示することを非常に簡単に実現し、
行数も抑えることに成功したためです。
しかし、それ以外のメソッドはあまり活用することができていないので、最終発
表に向けて、知識をたくわえ、簡略化できる部分を見つけ、それを上手くメソッ
ド作成に取り入れて行きたい。

5.