Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
//初期化
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();
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
//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;
}