プログラミング学習ノート

プログラミング学習の記録用です。

ループ処理から抜けられない(決着がつかない)

実現したいこと

どちらかの残り枚数がゼロになって勝敗がつくようにしたい。

問題

何回やってもどちらかの残り枚数がゼロにならない。

考えたこと

  1. カードがシャッフルできていない?
  2. 引き分けたときのカードが正しく渡っていない?
  3. 最初に均等に分けて配られて、その後固定した順番で回しているのが問題?

自分でやったこと

1. カードがシャッフルされているか?

pメソッドで2つに分けたカード束の中身がシャッフルされているかを確認しました。

# models/deck.rb
deck = Deck.new
p deck.separate_cards
[card_game]$ ruby models/deck.rb
{true=>[["スペード", "9"], ["クラブ", "J"], ["ダイヤ", "6"], ["スペード", "A"], ["ハート", "2"], ["クラブ", "6"], ["クラブ", "4"], ["クラブ", "3"], ["クラブ", "Q"], ["クラブ", "8"], ["スペード", "7"], ["ハート", "8"], ["ダイヤ", "K"], ["ハート", "K"], ["スペード", "5"], ["クラブ", "7"], ["クラブ", "10"], ["ダイヤ", "9"], ["ダイヤ", "2"], ["ハート", "9"], ["ハート", "3"], ["ハート", "Q"], ["ダイヤ", "A"], ["スペード", "Q"], ["クラブ", "A"], ["ハート", "4"]], false=>[["スペード", "6"], ["ハート", "5"], ["ダイヤ", "5"], ["スペード", "8"], ["スペード", "J"], ["クラブ", "2"], ["ダイヤ", "10"], ["クラブ", "5"], ["スペード", "4"], ["ダイヤ", "3"], ["ダイヤ", "J"], ["ダイヤ", "4"], ["スペード", "10"], ["スペード", "2"], ["ハート", "7"], ["ハート", "J"], ["ダイヤ", "Q"], ["クラブ", "9"], ["スペード", "K"], ["スペード", "3"], ["ダイヤ", "8"], ["ハート", "A"], ["ダイヤ", "7"], ["ハート", "10"], ["ハート", "6"], ["クラブ", "K"]]}

2. 引き分けたときのカードが正しく渡っているか?

pメソッドで引き分けたときにたまったカードが勝者の手札束配列の最後尾に追加されていることを確認しました。

戦争!
プレイヤー1のカードはクラブの2です。
プレイヤー2のカードはスペードの2です。
引き分けです。
[["クラブ", "2"]]
[["クラブ", "2"], ["スペード", "2"]] #引き分けのカードは@draw_cardsに保存される
戦争!
プレイヤー1のカードはクラブのAです。
プレイヤー2のカードはクラブのQです。
今回はプレイヤー1が勝ちました。
# カードが付与される前
[["スペード", "J"], ["ハート", "Q"], ["スペード", "A"], ["ダイヤ", "J"], ["クラブ", "3"], ["ダイヤ", "3"], ["ダイヤ", "Q"], ["クラブ", "K"], ["ハート", "3"], ["ハート", "8"], ["ダイヤ", "9"], ["クラブ", "10"], ["ハート", "2"], ["スペード", "Q"], ["ハート", "7"], ["クラブ", "4"], ["ハート", "6"], ["スペード", "10"], ["クラブ", "J"], ["スペード", "8"], ["スペード", "4"], ["ハート", "9"], ["スペード", "6"], ["スペード", "3"], ["ダイヤ", "2"]]
# カードが付与された後
[["スペード", "J"], ["ハート", "Q"], ["スペード", "A"], ["ダイヤ", "J"], ["クラブ", "3"], ["ダイヤ", "3"], ["ダイヤ", "Q"], ["クラブ", "K"], ["ハート", "3"], ["ハート", "8"], ["ダイヤ", "9"], ["クラブ", "10"], ["ハート", "2"], ["スペード", "Q"], ["ハート", "7"], ["クラブ", "4"], ["ハート", "6"], ["スペード", "10"], ["クラブ", "J"], ["スペード", "8"], ["スペード", "4"], ["ハート", "9"], ["スペード", "6"], ["スペード", "3"], ["ダイヤ", "2"], ["クラブ", "A"], ["クラブ", "Q"]] # 直近で出したカードと引き分けのカードが付与されている
プレイヤー1は29枚もっています。
プレイヤー2は23枚もっています。

3. 毎回出すカードをランダムで選択するとどうなるか?

固定した順番ではなく、毎回ランダムでカードを選ぶようにした結果、勝敗がつきました。

class Player
  def submit_card
    puts "#{name}のカードは#{hand.first[0]}#{hand.first[1]}です。"
    # 変更前:裏向きの手札束の一番上のカードを出す(問題文のとおり)
    @submitted_card = hand.first
    # 変更後:シャッフルして選ぶ(問題文と異なる)
    @submitted_card = hand.shuffle!.first
    # 場に出すカードは手札束からなくなる
    hand.shift(1)
  end
end
(省略)
戦争!
プレイヤー1のカードはスペードの2です。
プレイヤー2のカードはダイヤの6です。
今回はプレイヤー2が勝ちました。
プレイヤー1は0枚もっています。
プレイヤー2は52枚もっています。
プレイヤー2が勝ちました。
戦争を終了します。

他に確認したこと

1. 毎回の合計枚数が52枚になっているかを確認

毎回2人合計して52枚になっていることを確認しました。

戦争を開始します。
カードが配られました。
戦争!
プレイヤー1のカードはハートのJです。
プレイヤー2のカードはスペードの2です。
今回はプレイヤー1が勝ちました。
プレイヤー1は27枚もっています。
プレイヤー2は25枚もっています。
戦争!
プレイヤー1のカードはダイヤの4です。
プレイヤー2のカードはダイヤの10です。
今回はプレイヤー2が勝ちました。
プレイヤー1は26枚もっています。
プレイヤー2は26枚もっています。
戦争!
プレイヤー1のカードはダイヤの3です。
プレイヤー2のカードはダイヤのKです。
今回はプレイヤー2が勝ちました。
プレイヤー1は25枚もっています。
プレイヤー2は27枚もっています。
戦争!
プレイヤー1のカードはスペードのAです。
プレイヤー2のカードはハートの10です。
今回はプレイヤー1が勝ちました。
プレイヤー1は26枚もっています。
プレイヤー2は26枚もっています。
戦争!
プレイヤー1のカードはクラブの10です。
プレイヤー2のカードはハートの5です。
今回はプレイヤー1が勝ちました。
プレイヤー1は27枚もっています。
プレイヤー2は25枚もっています。
戦争!
プレイヤー1のカードはスペードの8です。
プレイヤー2のカードはクラブの6です。
今回はプレイヤー1が勝ちました。
プレイヤー1は28枚もっています。
プレイヤー2は24枚もっています。
戦争!
プレイヤー1のカードはダイヤの8です。
プレイヤー2のカードはクラブのKです。
今回はプレイヤー2が勝ちました。
プレイヤー1は27枚もっています。
プレイヤー2は25枚もっています。
戦争!
プレイヤー1のカードはダイヤのJです。
プレイヤー2のカードはダイヤのAです。
今回はプレイヤー2が勝ちました。
プレイヤー1は26枚もっています。
プレイヤー2は26枚もっています。
戦争!
プレイヤー1のカードはスペードのQです。
プレイヤー2のカードはハートのQです。
引き分けです。
戦争!
プレイヤー1のカードはスペードの5です。
プレイヤー2のカードはスペードの6です。
今回はプレイヤー2が勝ちました。
プレイヤー1は24枚もっています。
プレイヤー2は28枚もっています。

2.毎回の枚数の増減は正しいか?

勝った人は1枚増え、負けた人は1枚減ります。
引き分けをはさんで勝敗がついた場合、引き分け回数分のカードが付与されます。

[card_game]$ ruby main.rb
戦争を開始します。
カードが配られました。
戦争!
プレイヤー1のカードはスペードのQです。
プレイヤー2のカードはスペードのKです。
今回はプレイヤー2が勝ちました。
プレイヤー1は25枚もっています。
プレイヤー2は27枚もっています。
戦争!
プレイヤー1のカードはダイヤの9です。
プレイヤー2のカードはスペードの2です。
今回はプレイヤー1が勝ちました。
プレイヤー1は26枚もっています。
プレイヤー2は26枚もっています。
戦争!
プレイヤー1のカードはスペードのAです。
プレイヤー2のカードはダイヤのAです。
引き分けです。
戦争!
プレイヤー1のカードはクラブのJです。
プレイヤー2のカードはクラブの6です。
今回はプレイヤー1が勝ちました。
プレイヤー1は28枚もっています。
プレイヤー2は24枚もっています。

何ができていて、何ができていないのか

できていること

勝敗はつくようになった。

できていないこと

カードを出すたびにシャッフルしてから出すのは不自然なので、一度配り終えたら順番を変えずに勝敗がつくようにしたい。

何がわからないのか

なぜシャッフルして配っているのに、勝敗がつかないのか?
なぜ毎回ランダムでカードを配ると勝敗がつくのか?