はじめに
自分とプログラム側で行う「じゃんけんゲーム」を作成。記述したコードや気づいた点などをまとめました。
じゃんけんゲームの仕様
- 標準入力で引数を指定し自分の「手」を決定
- 相手(プログラム側)の手はrand()関数の乱数で決定
- 勝負を判定し結果を表示
- こちらの勝ち、若しくは、負けの場合は結果を表示して終了。引き分けの場合は勝負を続行
クラスの設定と勝負の判定
### 自分の手とプログラムの手を決定
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