/** * @param Game $game * @return array */ public function getMove(Game $game) { $maximizingPlayerMark = $game->getCurrentPlayerMark(); $minimizingPlayerMark = $game->getOtherPlayerMark(); /* * Initial revenue has to be worse than in the worse case game scenario */ $currentRevenue = -self::MAX_REVENUE * 2; $currentColumn = null; $currentRow = null; $boardState = $game->getBoard(); $emptyFields = $boardState->getEmptyFields(); foreach ($emptyFields as $column => $rows) { foreach ($rows as $row => $emptyValue) { $boardState->markField($column, $row, $maximizingPlayerMark); $newRevenue = $this->calculateMiniMaxRevenue($boardState, $maximizingPlayerMark, true, $minimizingPlayerMark); $boardState->clearField($column, $row); if ($newRevenue > $currentRevenue) { $currentRevenue = $newRevenue; $currentColumn = $column; $currentRow = $row; } } } return [$currentColumn, $currentRow]; }
/** * @param Game $game */ private function moveCurrentPlayer(Game $game) { list($randomCol, $randomRow) = $game->getRandomBoardCoordinates(); $msg = sprintf("%s's [%s] move (e.g. %s %s): ", $game->getCurrentPlayerName(), $game->getCurrentPlayerMark(), $randomCol, $randomRow); $this->ioService->printMessageLine($msg); while (true) { try { $game->moveCurrentPlayer(); break; } catch (GameException $e) { $msg = sprintf("%s, try again: ", $e->getMessage()); $this->ioService->printMessage($msg); } } }
public function test_it_returns_starting_player_mark_for_new_game_when_retrieving_current_player_mark() { $this->assertEquals(self::STARTING_MARK, $this->game->getCurrentPlayerMark()); }