gameManager.cc
Go to the documentation of this file.
00001 /* gameManager.cc
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().turn();
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 // ;;; Local Variables:
00126 // ;;; mode:c++
00127 // ;;; c-basic-offset:2
00128 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines