All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
gameManager.cc
Go to the documentation of this file.
1 /* gameManager.cc
2  */
8 #include "osl/record/csaRecord.h"
9 #include "osl/sennichite.h"
10 #include <iostream>
11 
14  CsaLogger *l)
15  : state(new GameState(SimpleState(HIRATE))), logger(l),
16  byoyomi(0)
17 {
18  players[BLACK] = black;
19  players[WHITE] = white;
20  computers[BLACK] = false;
21  computers[WHITE] = false;
22 }
23 
26 {
27 }
28 
30 GameManager::setComputerPlayer(Player turn, bool is_computer)
31 {
32  computers[turn] = is_computer;
33  if (players[turn])
34  players[turn]->allowSpeculativeSearch(is_computer);
35 }
36 
39 {
40  logger.reset(l);
41 }
42 
44 GameManager::setTimeLeft(int black_time, int white_time)
45 {
46  time_keeper.reset(black_time, white_time);
47 }
48 
50 GameManager::load(const char *csa_filename, bool verbose)
51 {
52  if (state->moves())
53  {
54  std::cerr << "GameManager: game already started, load failure\n";
55  return;
56  }
57  if (verbose)
58  std::cerr << "loading " << csa_filename << "\n";
59  CsaFile csa_file(csa_filename);
60  state.reset(new GameState(csa_file.getInitialState()));
61  logger->init(csa_file.getRecord().getPlayer(BLACK).c_str(),
62  csa_file.getRecord().getPlayer(WHITE).c_str(), state->state());
63  if (player(BLACK))
64  player(BLACK)->setInitialState(state->state());
65  if (player(WHITE))
66  player(WHITE)->setInitialState(state->state());
67  vector<Move> moves;
68  vector<int> times;
69  csa_file.getRecord().getMoves(moves, times);
70  assert(moves.size() == times.size());
71  for (size_t i=0; i<moves.size(); ++i)
72  {
73  if (verbose)
74  std::cerr << record::csa::show(moves[i]) << "\n"
75  << "T" << times[i] << "\n";
76  if ((! state->state().isValidMove(moves[i]))
77  || (! pushMove(MoveWithComment(moves[i]), times[i]).isNormal()))
78  {
79  std::cerr << "invalid move " << i << " " << moves[i] << "\n";
80  break;
81  }
82  }
83 }
84 
87 {
88  const Player turn = state->state().turn();
90  const MoveWithComment best_move
91  = player(turn)->selectBestMove(*state, time_keeper.timeLimit(turn), time_keeper.timeElapsed(turn), byoyomi);
92  consumed = timer.read();
93  return best_move;
94 }
95 
97 GameManager::pushMove(const MoveWithComment& move, int seconds)
98 {
99  assert(state->state().isValidMove(move.move));
100  time_keeper.pushMove(move.move.player(), seconds);
101  logger->pushMove(move, seconds);
102  logger->showTimeLeft(time_keeper);
103  const Sennichite result = state->pushMove(move.move, move.value);
104  if (player(BLACK))
105  player(BLACK)->pushMove(move.move);
106  if (player(WHITE))
107  player(WHITE)->pushMove(move.move);
108  return result;
109 }
110 
113 {
114  time_keeper.popMove();
115  logger->popMove();
116  logger->showTimeLeft(time_keeper);
117  state->popMove();
118  if (player(BLACK))
119  player(BLACK)->popMove();
120  if (player(WHITE))
121  player(WHITE)->popMove();
122 }
123 
124 /* ------------------------------------------------------------------------- */
125 // ;;; Local Variables:
126 // ;;; mode:c++
127 // ;;; c-basic-offset:2
128 // ;;; End: