LoginSignup
0
0

More than 3 years have passed since last update.

じゃんけんコード

Last updated at Posted at 2021-05-22

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

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

ターミナル
最初はグー、じゃんけん...
[0]:グー
[1]:チョキ
[2]:パー
# 入力待ち

出す手を入力したあと(勝った場合)

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

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

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

雛形

 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の中から1つ数字をランダムに返す

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

完成コード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です。

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

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

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に代入。

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で定義。数値と値が対応している場合、配列オブジェクトを使うとソースコードを簡潔に書くことが出来る場合が多い。

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
0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0