bool Board::isGameOver() const { // 60手に達していたらゲーム終了 if(Turns == MAX_TURNS) return true; // 打てる手があるならゲーム終了ではない if(MovablePos[Turns].size() != 0) return false; // // 現在の手番と逆の色が打てるかどうか調べる // Disc disc; disc.color = -CurrentColor; for(int x=1; x<=BOARD_SIZE; x++) { disc.x = x; for(int y=1; y<=BOARD_SIZE; y++) { disc.y = y; // 置ける箇所が1つでもあればゲーム終了ではない if(checkMobility(disc) != NONE) return false; } } return true; }
void Board::initMovable() { Disc disc(0, 0, CurrentColor); int dir; MovablePos[Turns].clear(); for(int x=1; x<=BOARD_SIZE; x++) { disc.x = x; for(int y=1; y<=BOARD_SIZE; y++) { disc.y = y; dir = checkMobility(disc); if(dir != NONE) { // 置ける MovablePos[Turns].push_back(disc); } MovableDir[Turns][x][y] = dir; } } }
//現在の局面で、現在の番手(黒or白)が置ける場所を計算する //MovableDirとMovablePosを再計算する void Board::initMovable() { Disc disc(0, 0, CurrentColor);//構造体のインスタンスを現在色で作成 int dir; //ポジションクリア MovablePos[Turns].clear(); //盤の全ての目において、置けるかどうかを調べる。 for(int x=1; x<=BOARD_SIZE; x++)//x=0の時は壁なので1から開始する { disc.x = x; for(int y=1; y<=BOARD_SIZE; y++) { disc.y = y; //石を置ける場所か判定 dir = checkMobility(disc); //discの位置に置けるなら、discから見て石が返る方向を表したビットを取得 if(dir != NONE) { // 置ける MovablePos[Turns].push_back(disc); //末尾に格納(discのコピーが格納される?) } MovableDir[Turns][x][y] = dir; //置ける方向を表したビット(NONEでもNONE以外でも結果を格納) } } }