1. はじめに
いよいよゲーム進行にかかわる処理を書いていきます。あらかじめ各メソッドを実装しているので、なにもない状態から書き始めるよりも楽にできるはずです。それではやってみましょう。
2. main.rbの作成
各ファイルと同じフォルダに main.rb
を作成します。まずは以下のように流れを書いてみましょう。
# チンチロゲーム
# プレイヤーの作成
# ----決着が着くまでループ
# 賭け金の設定(自分)
# 賭け金の設定(相手)
# サイコロを振る
# 役の決定
# 勝敗判定
# 賭け金の移動
# 最終的な勝敗判定
# ----決着が着くまでループ
ちょっとずつ付け足していきます。 transfer_money.rb
はplayer_class.rb
に変更しています。
require './player_class' # transfer_money.rbから変更
require './dice_roll'
# チンチロゲーム
# プレイヤーの作成
player_A = Player.new(money:1000,name:'カイジ')
player_B = Player.new(money:1000,name:'班長')
puts '---チンチロゲーム---'
# ----決着が着くまでループ
loop do
# 賭け金の設定(自分)
puts '掛け金を入力してください'
bet_money = gets.chomp
player_A.bet_money = bet_money.to_i
# 賭け金の設定(相手)
bet_money_B = rand(1..4) * 200
player_B.bet_money = player_B.money < bet_money_B ? player_B.money : bet_money_B
puts <<~TEXT
名前: #{player_A.name}
所持金:#{player_A.money} ペリカ
賭け金:#{player_A.bet_money} ペリカ
-
名前: #{player_B.name}
所持金:#{player_B.money} ペリカ
賭け金:#{player_B.bet_money} ペリカ
press enter
TEXT
teisi = gets
# サイコロを振る/役の決定
eye_on_the_dices1 = [rand(1..6),rand(1..6),rand(1..6)]
eye_on_the_dices2 = [rand(1..6),rand(1..6),rand(1..6)]
player_A.hand = roll_dice(eye_on_the_dices1)
player_B.hand = roll_dice(eye_on_the_dices2)
# 出た目の確認・役の決定
puts <<~TEXT
名前: #{player_A.name}
出目 #{eye_on_the_dices1}
役: #{player_A.hand}
-
名前: #{player_B.name}
出目 #{eye_on_the_dices2}
役: #{player_B.hand}
press enter
TEXT
teisi = gets
# 勝敗判定
win_or_lose = player_A.check_win_lose(player_B)
# 賭け金の移動
move_money = player_A.transfer_money(player_B,win_or_lose)
player_A.money += move_money
player_B.money -= move_money
puts <<~TEXT
名前: #{player_A.name}
所持金:#{player_A.money} ペリカ
-
名前: #{player_B.name}
所持金:#{player_B.money} ペリカ
--------------------------
TEXT
# 最終的な勝敗判定
if player_A.money <= 0
puts '所持金ゼロ。負けました…'
break
elsif player_B.money <= 0
puts '勝ちました!'
break
end
# ----決着が着くまでループ
end
いちおうこれで遊べるようになりました。しかし、まだ改善が必要ですね。
3.賭け金の例外処理
上記のコードでは賭け金の入力に制限がありません。この場合、所持金以上に賭け金を入力することもできますし、負の数や小数点、文字列も受け付けてしまいます。
改善しましょう。
# 賭け金の設定(自分)
while true
puts '掛け金を入力してください (終了するにはexitを入力)'
bet_money = gets.chomp
if bet_money == "exit"
puts '終了'
exit
end
if bet_money =~ /^[0-9]+$/
if bet_money.to_i > player_A.money
puts '所持金より多い金額は賭けられません'
elsif bet_money.to_i == 0
puts '0は無効です'
else
player_A.bet_money = bet_money.to_i
break
end
else
puts '正の整数で入力してください'
end
end
変更点は三つです。
-
exit
と入力するとゲームを終了できるように変更 -
=~ /^[0-9]+$/
で文字列や小数点がないことを確認 - 所持金より多い場合または0の場合はエラーが発生
これで問題なく動くはずです。
4. ゲームができた!
Rubyだけでゲームがつくれてしまった。ちょっと嬉しい。嬉しかったので勉強会で発表した。広島cluster というイベントで、広島県のITちっくなものならなんでも発表できる。
5. 改善点がたくさんある!
無事にコードが書けましたが、まだまだ改善するところがあります。エンジニアの方々にレビューを依頼したらたくさんのフィードバックをいただきました。ひとまずgithubのissueに入れておいて、どんどん対応することにしました。
やっていくぞ!
https://github.com/kyokucho1989/ruby-game/issues
あと、こちらのソースコードは自由に使ってください。cloneして改造してもOKです。
https://github.com/kyokucho1989/ruby-game