ゲームの終了条件を実装します。
終了条件を考えよう
三目並べの継続条件を考えてメソッドを実装しましょう。
# 説明: ゲームが終了しているかどうかを返却する
# 引数: player: プレイヤーを表す。1 or 2の数値
# board: ゲーム板, 3 x 3の二次元配列
# 戻り値: ゲームが続いている場合 => false
# ゲームが終わった場合 => true
def over? player, board
end
終了条件を実装する
ゲームの終了条件を実装していきます。
ゲームの終了条件を考えてみます。
勝利部分の条件に関しては、既に実装したメソッドを再利用できますね。
私は以下のように実装しました。
# 説明: ゲームが終了しているかどうかを返却する
# 引数: player: プレイヤーを表す。1 or 2の数値
# board: ゲーム板, 3 x 3の二次元配列
# 戻り値: ゲームが続いている場合 => false
# ゲームが終わった場合 => true
def over? player, board
return true if win?(player, board)
return false
end
さて、残る部分は引き分けです。
どういう状態になったら引き分けといえるのかを考えてみましょう。
どちらの状態を使っても引き分けということを判定できますが
今回は「コマを置く場所がまだ存在する」を採用してみたいと思います。
# 説明: ゲームが終了しているかどうかを返却する
# 引数: player: プレイヤーを表す。1 or 2の数値
# board: ゲーム板, 3 x 3の二次元配列
# 戻り値: ゲームが続いている場合 => false
# ゲームが終わった場合 => true
def over? player, board
return true if win?(player, board)
return false if board.any?{|row| row.any?{|a| 0 == a} }
return true
end
ちょっと可読性が悪いので「コマを置く場所がまだ存在する」を別メソッドに切り出したいと思います。
# 説明: コマを配置する場所があるかどうかを判定する
# 引数: board: ゲーム板, 3 x 3の二次元配列
# 戻り値: コマを配置する場所がある => true
# コマを配置する場所がない => false
def can_plase_piece? board
return board.any?{|row| row.any?{|a| 0 == a} }
end
このメソッドを適用して最終的には以下のような形にしました。
# 説明: ゲームが終了しているかどうかを返却する
# 引数: player: プレイヤーを表す。1 or 2の数値
# board: ゲーム板, 3 x 3の二次元配列
# 戻り値: ゲームが続いている場合 => false
# ゲームが終わった場合 => true
def over? player, board
return true if win?(player, board)
return false if can_plase_piece?(board)
return true
end
これで基本的なロジック部分の実装が完了しました。
今まで実装してきたパーツを使ってゲームのメイン部分を実装してきましょう!