じゃんけんアプリの試作

#元のひな型
http://tech-drill.in/questions/34

```ruby
def janken
    puts "[0]:グー\n[1]:チョキ\n[2]:パー"
    player_hand = gets.to_i

    program_hand = rand(3)

    jankens = ["グー", "チョキ", "パー"]

    puts "あなたの手:#{jankens[player_hand]}, わたしの手:#{jankens[program_hand]}"

    if player_hand == program_hand
      puts "あいこで"
      # 返り値を返す
    elsif (勝ちの条件)
      puts "あなたの勝ちです"
      # 返り値を返す
    else
      puts "あなたの負けです"
      # 返り値を返す
    end
  end

  next_game = true

  puts "最初はグー、じゃんけん..."

  # じゃんけんを繰り返す
  while next_game do
    next_game = janken
  end
```
#プロセス・気づいたこと
##判定部分
まず勝敗の判定部分から考えた。
ひな型では乱数をrand(3)と発生させていたが、0から数えるのでrand(2)に書き換えた。（0,1,2の3パターン）

```ruby
program_hand = rand(2)
```

ひな型では0,1,2以外の数字が入力された場合の分岐がなかったので、勝敗判定の前に他の数が入力された場合の分岐を追加した。

```ruby
if player_hand != 0 && player_hand != 1 && player_hand != 2
puts "0か1か2を入力してください"
```

次に、勝敗の判定部分を考えた。プレイヤーが勝利するのは
(a)program_handに代入される乱数が0（グー）でプレイヤーの入力した値が2（パー）
または
(b)program_handに代入される乱数が1（チョキ）でプレイヤーの入力した値が0（グー）
または
(c)program_handに代入される乱数が2（パー）でプレイヤーの入力した値が1(チョキ)
の時である。
まとめると(a)または、player_hand < program_handの時、プレイヤーが勝利する。よって勝利の条件は

```ruby
player_hand == 2 && program_hand == 0 || player_hand < program_hand
```
とした。
無効な入力でなく、あいこでなく、勝ちではない時にプレイヤーの負けなので、負け部分はひな型を改変しなかった。
##jankenメソッドの切り分け
ひな型のjankenメソッドは同一メソッド内でプレイヤーの入力待ちと勝敗の判定を行っていたので入力部分と判定部分を別のメソッドに分けた。
メソッドを分けると、入力部分で定義したplayer_handやprogram_handは、スコープの問題で判定部分では使えなくなるので、Jankenクラスにまとめ、player_handとprogram_handをクラス内の全メソッドで使えるインスタンス変数@player_hand,@program_handに書き換えた。
##ループ処理
next_gameの初期値はtrueで、while文で返り値がtrueかfalseかによって処理を続行するか否かを判定したい。jankenメソッドを二つに分けてJankenクラスでまとめたので、Jankenクラスのオブジェクトをnewメソッドで作る。
変数next_gameに代入されるのはJankenクラスの判定部分であるメソッドjudge_jankenの返り値である。

```ruby
  next_game = true
  while next_game do
    next_game = Janken.new.judge_janken
  end
```
入力部分の処理はオブジェクトを作成した時に自動的に呼び出したいのでinitializeメソッドとする。
while文の繰り返しが行われる条件はnext_gameがtrueの時なので、judge_jankenメソッドでは無効な入力、またはあいこの時にはtrueを、プレイヤーが勝った場合、負けた場合にはfalseを返り値として返すように改変した。

```ruby
  class Janken
    def initialize
      puts "[0]:グー\n[1]:チョキ\n[2]:パー"
      @player_hand = gets.to_i

      @program_hand = rand(2)

      jankens = ["グー", "チョキ", "パー"]

      puts "あなたの手:#{jankens[@player_hand]}, わたしの手:#{jankens[@program_hand]}"
    end

    def judge_janken
      if @player_hand != 0 && @player_hand != 1 && @player_hand != 2
        puts "0か1か2を入力してください"
        return true

      elsif @player_hand == @program_hand
        puts "あいこで"
        return true
        # 返り値を返す

      elsif @player_hand == 2 && @program_hand == 0 || @player_hand < @program_hand
        puts "あなたの勝ちです"
        return false
        # 返り値を返す
      else
        puts "あなたの負けです"
        return false
        # 返り値を返す
      end
    end
  end
```


#ひな型を改変したコード（完成品）
```ruby
  class Janken
    def initialize
      puts "[0]:グー\n[1]:チョキ\n[2]:パー"
      @player_hand = gets.to_i

      @program_hand = rand(2)

      jankens = ["グー", "チョキ", "パー"]

      puts "あなたの手:#{jankens[@player_hand]}, わたしの手:#{jankens[@program_hand]}"
    end

    def judge_janken
      if @player_hand != 0 && @player_hand != 1 && @player_hand != 2
        puts "0か1か2を入力してください"
        return true

      elsif @player_hand == @program_hand
        puts "あいこで"
        return true
        # 返り値を返す

      elsif @player_hand == 2 && @program_hand == 0 || @player_hand < @program_hand
        puts "あなたの勝ちです"
        return false
        # 返り値を返す
      else
        puts "あなたの負けです"
        return false
        # 返り値を返す
      end
    end
  end

  puts "最初はグー、じゃんけん..."
  next_game = true
  while next_game do
    next_game = Janken.new.judge_janken
  end

```