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

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

# 2. main.rbの作成

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

```Ruby

# チンチロゲーム

# プレイヤーの作成

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

```

　ちょっとずつ付け足していきます。 `transfer_money.rb`は`player_class.rb`に変更しています。

```ruby
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.賭け金の例外処理
　上記のコードでは賭け金の入力に制限がありません。この場合、所持金以上に賭け金を入力することもできますし、負の数や小数点、文字列も受け付けてしまいます。
　改善しましょう。

```ruby
# 　賭け金の設定（自分）
    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://hmcn.connpass.com/event/175209/

　資料はこちら。
　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