GameManagerClassの実装
GameManagerClassを実装します。
ゲームの進行知識を一つのクラスに
tic_tac_toe.rbから継続条件やゲーム板の更新などのゲームの管理の処理を抽出して
一つのクラスにまとめたいと思います。game_manager.rbを作成していきましょう。
# frozen_string_literal: true
require_relative "const"
require_relative "tic_tac_toe_input_error"
require_relative "tic_tac_toe_validator"
# ゲームの進行状況を管理する
class GameManager
def initialize(player1:, player2:, board:)
@player1 = player1
@player2 = player2
@current_player = @player1
@board = board
end
# 概要: ゲームが終了しているかどうかを返却する
# 引数: なし
# 戻り値: ゲームが続いている場合 => false
# ゲームが終わった場合 => true
def over?
return false if @board.win?(opponent_player(@current_player).piece)
return true if @board.can_plase_piece?
false
end
# 概要: 現在プレイ中のプレイヤーと相手プレイヤーを入れ替える
# 引数: なし
# 戻り値: なし
def change_to_opponent_turn
@current_player = opponent_player(@current_player)
end
# 概要: ゲームの結果をコンソールに出力する
# 引数: なし
# 戻り値: なし
def print_result
if @board.win?(@player1.piece)
puts "Player1が勝利しました!"
elsif @board.win?(@player2.piece)
puts "Player2が勝利しました!"
else
puts "引き分けです!"
end
end
# 説明: ゲーム板の状態をコンソールに出力する
# 引数: なし
# 戻り値: なし
def print_board
@board.print_board
end
# 説明: プレイヤーがコマを配置する場所を取得してターンを進める
# 引数: なし
# 戻り値: なし
def player_turn
row, col = @current_player.gets_piece_location
@board.update(row, col, @current_player.piece)
rescue TicTacToeInputError => e
puts ""
puts e.message
puts ""
player_turn
rescue e
raise e
end
private
# 概要: 対戦中の相手プレイヤーを返却する
# 引数: なし
# 戻り値: PLAYER_1の時 => PLAYER_2
# PLAYER_2の時 => PLAYER_1
def opponent_player(player)
@player1.equal?(player) ? @player2 : @player1
end
end
テストの実装
ターンの更新や継続条件などを新たにgamter_manager_test.rbを作成してテストしてきましょう。
ほとんどのテストメソッドは既に実装しているはず!
参考コードは以下のURLから参照してください
最終更新