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[BLACK] = black;
00019 players[WHITE] = white;
00020 computers[BLACK] = false;
00021 computers[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[turn] = is_computer;
00033 if (players[turn])
00034 players[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 if (player(BLACK))
00064 player(BLACK)->setInitialState(state->state());
00065 if (player(WHITE))
00066 player(WHITE)->setInitialState(state->state());
00067 vector<Move> moves;
00068 vector<int> times;
00069 csa_file.getRecord().getMoves(moves, times);
00070 assert(moves.size() == times.size());
00071 for (size_t i=0; i<moves.size(); ++i)
00072 {
00073 if (verbose)
00074 std::cerr << record::csa::show(moves[i]) << "\n"
00075 << "T" << times[i] << "\n";
00076 if ((! state->state().isValidMove(moves[i]))
00077 || (! pushMove(MoveWithComment(moves[i]), times[i]).isNormal()))
00078 {
00079 std::cerr << "invalid move " << i << " " << moves[i] << "\n";
00080 break;
00081 }
00082 }
00083 }
00084
00085 const osl::search::MoveWithComment osl::game_playing::
00086 GameManager::computeMove(int& consumed)
00087 {
00088 const Player turn = state->state().getTurn();
00089 CsaStopwatch timer;
00090 const MoveWithComment best_move
00091 = player(turn)->selectBestMove(*state, time_keeper.timeLimit(turn), time_keeper.timeElapsed(turn), byoyomi);
00092 consumed = timer.read();
00093 return best_move;
00094 }
00095
00096 const osl::Sennichite osl::game_playing::
00097 GameManager::pushMove(const MoveWithComment& move, int seconds)
00098 {
00099 assert(state->state().isValidMove(move.move));
00100 time_keeper.pushMove(move.move.player(), seconds);
00101 logger->pushMove(move, seconds);
00102 logger->showTimeLeft(time_keeper);
00103 const Sennichite result = state->pushMove(move.move, move.value);
00104 if (player(BLACK))
00105 player(BLACK)->pushMove(move.move);
00106 if (player(WHITE))
00107 player(WHITE)->pushMove(move.move);
00108 return result;
00109 }
00110
00111 void osl::game_playing::
00112 GameManager::popMove()
00113 {
00114 time_keeper.popMove();
00115 logger->popMove();
00116 logger->showTimeLeft(time_keeper);
00117 state->popMove();
00118 if (player(BLACK))
00119 player(BLACK)->popMove();
00120 if (player(WHITE))
00121 player(WHITE)->popMove();
00122 }
00123
00124
00125
00126
00127
00128