LoginSignup
1
2

More than 5 years have passed since last update.

Rubyで「じゃんけんゲーム」を試作

Last updated at Posted at 2018-04-13

はじめに

自分とプログラム側で行う「じゃんけんゲーム」を作成。記述したコードや気づいた点などをまとめました。

じゃんけんゲームの仕様

  1. 標準入力で引数を指定し自分の「手」を決定
  2. 相手(プログラム側)の手はrand()関数の乱数で決定
  3. 勝負を判定し結果を表示
  4. こちらの勝ち、若しくは、負けの場合は結果を表示して終了。引き分けの場合は勝負を続行

クラスの設定と勝負の判定

 自分の手とプログラムの手を決定



class Game
  def janken
    puts "最初はグー、じゃんけん……"
    puts "[0]:グー\n[1]:チョキ\n[2]:パー"
    player_hand = gets.to_i

    program_hand = rand(3)
    jankens = ["グー", "チョキ", "パー"]

    puts "あなたの手:#{jankens[player_hand]}, プログラムの手:#{jankens[program_hand]}"
                ( 中略 )

rand(3)で「0から2」のいずれかの乱数をprogram_handに代入して相手の手をランダムに決め、自分の選択した手と相手の手を標準出力に表示させます。

 勝負の結果表示

if文を使って、「あいこの場合」→「自分が勝った場合」→「それ以外の場合(自分が負けた場合)」の流れで記述していきます。

あいこの場合

まずは、あいこの場合


    if player_hand == program_hand
          next_game = true

      puts "あいこで"

      # じゃんけんを繰り返す
     while next_game do
       next_game = janken
     end
            ( 中略 )

player_handとprogram_handにはそれぞれ自分の手と相手の手のデータ(0から2の整数)が入っています。

「あいこ」なのでif分の条件式は上記のように設定します。

また、「next_game」で勝負を継続するか判定します。先にtrueで初期化。

自分が勝った場合


    elsif (program_hand - player_hand == 1 || program_hand - player_hand == -2 )
      puts "あなたの勝ちです"
      janken = false # 返り値を返す

            ( 中略 )

program_handとplayer_handには、それぞれ「0」「1」「2」のいずれかの整数が入っているはずです。

最初にグー、チョキ、パーを以下のように決めています。


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

ですから、グー、チョキ、パーに対応する番号同士で引き算した結果で勝ち負けを判定することができます。

たとえば、自分が勝つ場合の組み合わせは、・・・

  • (自分がグー:0、相手がチョキ:1) … 1-0=「1」
  • (自分がチョキ:1、相手がパー:2) … 2-1 = 「1」
  • (自分がパー:2、相手がグー:0)  … 0-2 = 「-2」

と、このように自分が勝つ場合の引き算の結果は「1、または -2」なります。

ですので、自分が勝つ場合の条件式は以下のようにしました。


program_hand - player_hand == 1 || program_hand - player_hand == -2

自分が負けた場合

自分が負ける場合は上記以外の条件になりますので、elseで結果を表示します。



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

自分が負けた場合も勝った場合もそこでプログラムを終了するので、「janken」に 「false」を設定してプログラムを抜けます。

プログラム全文

じゃんけんプログラムの全体像です。



class Game
  def janken
    puts "最初はグー、じゃんけん……"
    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
          next_game = true

      puts "あいこで"

      # じゃんけんを繰り返す
     while next_game do
       next_game = janken
     end

    elsif (program_hand - player_hand == 1 || program_hand - player_hand == -2 )
      puts "あなたの勝ちです"
      janken = false # 返り値を返す
    else
      puts "あなたの負けです"
      janken = false # 返り値を返す
    end
  end
end

Game.new.janken

1
2
2

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