bool Board::move(const Point& point) { if(point.x <= 0 || point.x > BOARD_SIZE) return false; if(point.y <= 0 || point.y > BOARD_SIZE) return false; if(MovableDir[Turns][point.x][point.y] == NONE) return false; flipDiscs(point); Turns++; CurrentColor = -CurrentColor; initMovable(); return true; }
//初期化 void Board::init() { // 全マスを空きマスに設定 for(int x=1; x <= BOARD_SIZE; x++) { for(int y=1; y <= BOARD_SIZE; y++) { RawBoard[x][y] = EMPTY; } } // 壁の設定(縦) for(int y=0; y < BOARD_SIZE + 2; y++) { RawBoard[0][y] = WALL; RawBoard[BOARD_SIZE+1][y] = WALL; } // 壁の設定(横) for(int x=0; x < BOARD_SIZE + 2; x++) { RawBoard[x][0] = WALL; RawBoard[x][BOARD_SIZE+1] = WALL; } // 初期配置 RawBoard[4][4] = WHITE; RawBoard[5][5] = WHITE; RawBoard[4][5] = BLACK; RawBoard[5][4] = BLACK; // 石数の初期設定 Discs[BLACK] = 2; Discs[WHITE] = 2; Discs[EMPTY] = BOARD_SIZE*BOARD_SIZE - 4; Turns = 0; // 手数は0から数える CurrentColor = BLACK; // 先手は黒 // updateを全て消去 UpdateLog.clear(); // initMovable(); }
bool Board::pass() { // 打つ手があればパスできない if(MovablePos[Turns].size() != 0) return false; // ゲームが終了しているなら、パスできない if(isGameOver()) return false; CurrentColor = -CurrentColor; // 空のupdateを挿入しておく std::vector<Disc> nullupdate; UpdateLog.push_back(nullupdate); initMovable(); return true; }
//pointで指定された位置に石を打つ。 //成功したら return true //及び、次のターンの計算結果を調査開始する。 bool Board::move(const Point& point) { //石が打てる位置か判定する if(point.x <= 0 || point.x > BOARD_SIZE) return false; if(point.y <= 0 || point.y > BOARD_SIZE) return false; if(MovableDir[Turns][point.x][point.y] == NONE) return false; //checkMobilityの結果。既に石があるか、置けない場所を指定したなら falseを返す //石を打つ、変更点追跡、石裏返す、石数カウント、UpdateLog記録 flipDiscs(point); //手数をインクリメント Turns++; CurrentColor = -CurrentColor;//白→黒 or 黒→白 //MovableDirとMovablePosを調べ直す。(再計算) initMovable(); //現在の局面で、現在の番手(黒or白)が置ける場所を計算する return true; }