# ゲームの終了条件

ゲームの終了条件を実装します。

## 終了条件を考えよう

三目並べの継続条件を考えてメソッドを実装しましょう。

```ruby
# 説明: ゲームが終了しているかどうかを返却する
# 引数: player: プレイヤーを表す。1 or 2の数値
#       board: ゲーム板, 3 x 3の二次元配列
# 戻り値: ゲームが続いている場合 => false
#        ゲームが終わった場合 => true
def over? player, board
end
```

{% hint style="info" %}
**課題コーナー**

over?メソッドを実装してみましょう
{% endhint %}

## 終了条件を実装する

ゲームの終了条件を実装していきます。

ゲームの終了条件を考えてみます。

* 自分のターン完了後に自分が勝利した
* 自分のターン完了後に引き分けになった

勝利部分の条件に関しては、既に実装したメソッドを再利用できますね。&#x20;

私は以下のように実装しました。

```ruby
# 説明: ゲームが終了しているかどうかを返却する
# 引数: player: プレイヤーを表す。1 or 2の数値
#       board: ゲーム板, 3 x 3の二次元配列
# 戻り値: ゲームが続いている場合 => false
#        ゲームが終わった場合 => true
def over? player, board
  return true if win?(player, board)

  return false
end

```

さて、残る部分は引き分けです。

どういう状態になったら引き分けといえるのかを考えてみましょう。

* 勝敗がつかないままターン数が10ターン目を迎えた
* コマを置く場所がまだ存在する

どちらの状態を使っても引き分けということを判定できますが

今回は「コマを置く場所がまだ存在する」を採用してみたいと思います。

```ruby
# 説明: ゲームが終了しているかどうかを返却する
# 引数: 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
```

ちょっと可読性が悪いので「コマを置く場所がまだ存在する」を別メソッドに切り出したいと思います。

```ruby
# 説明: コマを配置する場所があるかどうかを判定する
# 引数: board: ゲーム板, 3 x 3の二次元配列
# 戻り値: コマを配置する場所がある => true
#        コマを配置する場所がない => false
def can_plase_piece? board
  return board.any?{|row| row.any?{|a| 0 == a} } 
end
```

このメソッドを適用して最終的には以下のような形にしました。

```ruby
# 説明: ゲームが終了しているかどうかを返却する
# 引数: 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
```

これで基本的なロジック部分の実装が完了しました。

今まで実装してきたパーツを使ってゲームのメイン部分を実装してきましょう！
