00001
00002
00003 #include "osl/game_playing/gameManager.h"
00004 #include "osl/game_playing/gameState.h"
00005 #include "osl/game_playing/computerPlayer.h"
00006 #include "osl/game_playing/csaLogger.h"
00007 #include "osl/game_playing/csaStopwatch.h"
00008 #include "osl/record/csaRecord.h"
00009 #include "osl/sennichite.h"
00010 #include <iostream>
00011
00012 osl::game_playing::
00013 GameManager::GameManager(ComputerPlayer *black, ComputerPlayer *white,
00014 CsaLogger *l)
00015 : state(new GameState(SimpleState(HIRATE))), logger(l),
00016 byoyomi(0)
00017 {
00018 players[playerToIndex(BLACK)] = black;
00019 players[playerToIndex(WHITE)] = white;
00020 computers[playerToIndex(BLACK)] = false;
00021 computers[playerToIndex(WHITE)] = false;
00022 }
00023
00024 osl::game_playing::
00025 GameManager::~GameManager()
00026 {
00027 }
00028
00029 void osl::game_playing::
00030 GameManager::setComputerPlayer(Player turn, bool is_computer)
00031 {
00032 computers[playerToIndex(turn)] = is_computer;
00033 if (players[playerToIndex(turn)])
00034 players[playerToIndex(turn)]->allowSpeculativeSearch(is_computer);
00035 }
00036
00037 void osl::game_playing::
00038 GameManager::resetLogger(CsaLogger *l)
00039 {
00040 logger.reset(l);
00041 }
00042
00043 void osl::game_playing::
00044 GameManager::setTimeLeft(int black_time, int white_time)
00045 {
00046 time_keeper.reset(black_time, white_time);
00047 }
00048
00049 void osl::game_playing::
00050 GameManager::load(const char *csa_filename, bool verbose)
00051 {
00052 if (state->moves())
00053 {
00054 std::cerr << "GameManager: game already started, load failure\n";
00055 return;
00056 }
00057 if (verbose)
00058 std::cerr << "loading " << csa_filename << "\n";
00059 CsaFile csa_file(csa_filename);
00060 state.reset(new GameState(csa_file.getInitialState()));
00061 logger->init(csa_file.getRecord().getPlayer(BLACK).c_str(),
00062 csa_file.getRecord().getPlayer(WHITE).c_str(), state->state());
00063 vector<Move> moves;
00064 vector<int> times;
00065 csa_file.getRecord().getMoves(moves, times);
00066 assert(moves.size() == times.size());
00067 for (size_t i=0; i<moves.size(); ++i)
00068 {
00069 if (verbose)
00070 std::cerr << record::csa::show(moves[i]) << "\n"
00071 << "T" << times[i] << "\n";
00072 if ((! state->state().isValidMove(moves[i]))
00073 || (! pushMove(MoveWithComment(moves[i]), times[i]).isNormal()))
00074 {
00075 std::cerr << "invalid move " << i << " " << moves[i] << "\n";
00076 break;
00077 }
00078 }
00079 }
00080
00081 const osl::game_playing::MoveWithComment osl::game_playing::
00082 GameManager::computeMove(int& consumed)
00083 {
00084 const Player turn = state->state().getTurn();
00085 const int time_left = time_keeper.timeLeft(turn);
00086 CsaStopwatch timer;
00087 const MoveWithComment best_move
00088 = player(turn)->selectBestMove(*state, time_left, byoyomi);
00089 consumed = timer.read();
00090 return best_move;
00091 }
00092
00093 const osl::Sennichite osl::game_playing::
00094 GameManager::pushMove(const MoveWithComment& move, int seconds)
00095 {
00096 assert(state->state().isValidMove(move.move));
00097 time_keeper.pushMove(move.move.player(), seconds);
00098 logger->pushMove(move, seconds);
00099 logger->showTimeLeft(time_keeper);
00100 const Sennichite result = state->pushMove(move.move);
00101 if (player(BLACK))
00102 player(BLACK)->pushMove(move.move);
00103 if (player(WHITE))
00104 player(WHITE)->pushMove(move.move);
00105 return result;
00106 }
00107
00108 void osl::game_playing::
00109 GameManager::popMove()
00110 {
00111 time_keeper.popMove();
00112 logger->popMove();
00113 logger->showTimeLeft(time_keeper);
00114 state->popMove();
00115 if (player(BLACK))
00116 player(BLACK)->popMove();
00117 if (player(WHITE))
00118 player(WHITE)->popMove();
00119 }
00120
00121
00122
00123
00124
00125