じゃんけんコード


プログラムとじゃんけんをするプログラムを実装。

勝った場合 "あなたの勝ちです"と表示させる
負けた場合 "あなたの負けです"と表示させる
あいこの場合 "あいこで"と表示させたあともう一度じゃんけんをさせる


```:ターミナル
最初はグー、じゃんけん...
[0]:グー
[1]:チョキ
[2]:パー
# 入力待ち
```
出す手を入力したあと(勝った場合)

```:ターミナル
最初はグー、じゃんけん...
[0]:グー
[1]:チョキ
[2]:パー
0
あなたの手:グー, わたしの手:チョキ
あなたの勝ちです
```

出す手を入力したあと(あいこの場合)

```:ターミナル
最初はグー、じゃんけん...
[0]:グー
[1]:チョキ
[2]:パー
0
あなたの手:グー, わたしの手:グー
あいこで
[0]:グー
[1]:チョキ
[2]:パー
# 入力待ち
```

雛形
-
```rb
 def janken
  puts "[0]:グー\n[1]:チョキ\n[2]:パー"

  # ターミナルからじゃんけんの手を入力
  player_hand = 

  # 乱数でプログラム側の手を決定
  program_hand = 

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

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

  # あいこの判定はplayer_handとprogram_handの値が等しいとき
  if 
    puts "あいこで"
    # 返り値を返す

 # じゃんけんに勝つパターンを全て並べる
  elsif
    puts "あなたの勝ちです"
   # 返り値を返す

  else
    puts "あなたの負けです"
    # 返り値を返す

  end
end

next_game = true

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

while next_game do
# jankenメソッドの返り値をnext_gameに代入
end
```

乱数の作り方

rand(欲しい乱数の数)
-
randメソッドを使うと手軽に乱数を生成できます。randメソッドに引数として数を渡すと「0」から「渡した数 - 1」の間でランダムに数を返します。

```
  rand(100) # => 0〜99の中から１つ数字をランダムに返す
```

これを使えばランダムにじゃんけんの手を出すことができます。

```rb:完成コードquestion.rb
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 "あいこで"
    return true
  elsif (player_hand == 0 && program_hand == 1) || (player_hand == 1 && program_hand == 2) || (player_hand == 2 && program_hand == 0)
    puts "あなたの勝ちです"
    return false
  else
    puts "あなたの負けです"
    return false
  end
end

next_game = true

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

while next_game do
  next_game = janken
end
```


まずはじゃんけん用のメソッドを定義。これはまだ次のゲームがあるか、すなわちあいこかどうかをtrueかfalseで返します。あいこならtrue、決着がついたらfalseです。

```rb:question.rb
  def janken
    if あいこのとき
      puts "あいこで"
      return true
    elsif 勝ったとき
      puts "あなたの勝ちです"
      return false
    else
      puts "あなたの負けです"
      return false
    end
  end
```

次にじゃんけんの決着がつくまでjankenメソッドを呼び出すようにします。

```rb:question.rb
  def janken
    if あいこのとき
      puts "あいこで"
      return true
    elsif 勝ったとき
      puts "あなたの勝ちです"
      return false
    else
      puts "あなたの負けです"
      return false
    end
  end

  next_game = true # 1回目を実行するためにtrueを代入

  puts "最初はグー、じゃんけん..." # 最初の表示

  while next_game do # next_gameがfalseまで繰り返す
    next_game = janken # jankenメソッドの返り値は結果なのでnext_gameに代入
  end
```

次に、jankenメソッドの中に実際にじゃんけんをする処理を書きます。まずは自分の手を入力。ターミナルからじゃんけんの手を入力させてその入力を変数player_handに代入。

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

    if あいこのとき
      puts "あいこで"
      return true
    elsif 勝ったとき
      puts "あなたの勝ちです"
      return false
    else
      puts "あなたの負けです"
      return false
    end
  end

  next_game = true

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

  while next_game do
    next_game = janken
  end
```
次にプログラム側の出す手を乱数で決定。決定したらそれぞれの手を表示。「グー、チョキ、パー」はそれぞれ「0, 1, 2」という数字に対応しているため、rand(3)で0〜2の乱数を生成。生成した乱数の値をプログラムの手である変数program_handに代入。

また、「グー、チョキ、パー」のじゃんけんの手である文字列を配列jankensで定義。数値と値が対応している場合、配列オブジェクトを使うとソースコードを簡潔に書くことが出来る場合が多い。

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

    program_hand = rand(3) # 乱数でプログラム側の手を決定

    jankens = ["グー", "チョキ", "パー"] # じゃんけんの手を配列で管理

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

    if あいこのとき
      puts "あいこで"
      return true
    elsif 勝ったとき
      puts "あなたの勝ちです"
      return false
    else
      puts "あなたの負けです"
      return false
    end
  end

  next_game = true

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

  while next_game do
    next_game = janken
  end
```

最後に「勝ち、負け、あいこ」の判定。if文の先頭を「あいこのとき」にしたのはあいこの判定が最も簡単だから。あいこの判定はplayer_handとprogram_handの値が等しいとき。勝ちはそれぞれの手によってパターンが3つにわかれます。負けはそれ以外のとき。

```question.rb
  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 "あいこで"
      return true
    elsif (player_hand == 0 && program_hand == 1) || (player_hand == 1 && program_hand == 2) || (player_hand == 2 && program_hand == 0)
      puts "あなたの勝ちです"
      return false
    else
      puts "あなたの負けです"
      return false
    end
  end

  next_game = true

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

  while next_game do
    next_game = janken
  end
```