LoginSignup
3
0

More than 3 years have passed since last update.

Rubyでチンチロゲームを作る  第4回 ゲーム進行の処理の作成

Posted at

1. はじめに

 いよいよゲーム進行にかかわる処理を書いていきます。あらかじめ各メソッドを実装しているので、なにもない状態から書き始めるよりも楽にできるはずです。それではやってみましょう。

2. main.rbの作成

 各ファイルと同じフォルダに main.rbを作成します。まずは以下のように流れを書いてみましょう。


# チンチロゲーム

# プレイヤーの作成

# ----決着が着くまでループ
#  賭け金の設定(自分)
#  賭け金の設定(相手)
#  サイコロを振る
#  役の決定
#  勝敗判定
#  賭け金の移動
# 最終的な勝敗判定
# ----決着が着くまでループ

 ちょっとずつ付け足していきます。 transfer_money.rbplayer_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ちっくなものならなんでも発表できる。

 資料はこちら。
 https://www.slideshare.net/Kkondo2/ruby-234646600?ref=https://hmcn.connpass.com/event/175209/presentation/

5. 改善点がたくさんある!

 無事にコードが書けましたが、まだまだ改善するところがあります。エンジニアの方々にレビューを依頼したらたくさんのフィードバックをいただきました。ひとまずgithubのissueに入れておいて、どんどん対応することにしました。

 やっていくぞ!
https://github.com/kyokucho1989/ruby-game/issues

 あと、こちらのソースコードは自由に使ってください。cloneして改造してもOKです。
https://github.com/kyokucho1989/ruby-game

3
0
0

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