元のひな型
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パターン)
program_hand = rand(2)
ひな型では0,1,2以外の数字が入力された場合の分岐がなかったので、勝敗判定の前に他の数が入力された場合の分岐を追加した。
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の時、プレイヤーが勝利する。よって勝利の条件は
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の返り値である。
next_game = true
while next_game do
next_game = Janken.new.judge_janken
end
入力部分の処理はオブジェクトを作成した時に自動的に呼び出したいのでinitializeメソッドとする。
while文の繰り返しが行われる条件はnext_gameがtrueの時なので、judge_jankenメソッドでは無効な入力、またはあいこの時にはtrueを、プレイヤーが勝った場合、負けた場合にはfalseを返り値として返すように改変した。
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
ひな型を改変したコード(完成品)
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