コード例 #1
0
ファイル: Board.cpp プロジェクト: alanjg/Chess
	ulong Board::GetSafeKingMoves(int color)
	{
		ulong safeMoves = 0;	
		int kingSquare = GetKingSquare(color);
		ulong moves = MoveGenerator::kingAttacks[kingSquare];
		ulong newMoves = moves & (~colorBitBoards[color]);
		moves = newMoves;
		if(moves != 0)
		{
			RemovePiece(kingSquare, Pieces::GetPiece(PieceTypes::King, color));
		
			while(moves != 0)
			{
				int move = PopLowestSetBit(moves);
				if(!IsSquareAttacked(move, OtherColor(color)))
				{
					safeMoves |= BitBoard(move);
				}
			}
			AddPiece(kingSquare, Pieces::GetPiece(PieceTypes::King, color));
		}

		return safeMoves; 
	}
コード例 #2
0
ファイル: Board.cpp プロジェクト: alanjg/Chess
	bool Board::IsKingInCheck(int color) const
	{
		return IsSquareAttacked(GetKingSquare(color), OtherColor(color));
	}
コード例 #3
0
void MoveGenerator::GenerateAllPawnMoves(Board *gameboard, MOVELIST *move_list) {

	side = gameboard->side_to_move;

	/* WHITE PAWN MOVES */
	if (side == WHITE) {

		for (piece_number = 0; piece_number < gameboard->piece_number[WHITE_PAWN]; ++piece_number) {
			square = gameboard->piece_list[WHITE_PAWN][piece_number];

			if (gameboard->pieces[square+10] == EMPTY) {
				AddWhitePawnMove(gameboard, square, square+10, move_list);
				if (rank_of[square] == RANK_2 && gameboard->pieces[square+20] == EMPTY) {
					AddQuietMove(gameboard, MOVE(square, (square+20), EMPTY, EMPTY, MOVEFLAGPAWNSTART), move_list);
				}
			}

			if(!SQUAREOFFBOARD(square + 9) && PieceColor[gameboard->pieces[square + 9]] == BLACK) {
				AddWhitePawnCapture(gameboard, square, square+9, gameboard->pieces[square + 9], move_list);
			}
			if(!SQUAREOFFBOARD(square + 11) && PieceColor[gameboard->pieces[square + 11]] == BLACK) {
				AddWhitePawnCapture(gameboard, square, square+11, gameboard->pieces[square + 11], move_list);
			}

			if(gameboard->en_passant_square != NO_SQUARE) {
				if(square + 9 == gameboard->en_passant_square) {
					AddEnPassantMove(gameboard, MOVE(square,square + 9,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list);
				}
				if(square + 11 == gameboard->en_passant_square) {
					AddEnPassantMove(gameboard, MOVE(square,square + 11,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list);
				}
			}
		}

		/* WHITE SIDE CASTLING */
		if(gameboard->castle_permission & WHITE_KING_CASTLE) {
			if(gameboard->pieces[F1] == EMPTY && gameboard->pieces[G1] == EMPTY) {
				if(!IsSquareAttacked(E1,BLACK,gameboard) && !IsSquareAttacked(F1,BLACK,gameboard) ) {
					AddQuietMove(gameboard, MOVE(E1, G1, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list);
				}
			}
		}

		if(gameboard->castle_permission & WHITE_QUEEN_CASTLE) {
			if(gameboard->pieces[D1] == EMPTY && gameboard->pieces[C1] == EMPTY && gameboard->pieces[B1] == EMPTY) {
				if(!IsSquareAttacked(E1,BLACK,gameboard) && !IsSquareAttacked(D1,BLACK,gameboard) ) {
					AddQuietMove(gameboard, MOVE(E1, C1, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list);
				}
			}
		}
	} 

	/* BLACK PAWN MOVES */
	else {

		for(piece_number = 0; piece_number < gameboard->piece_number[BLACK_PAWN]; ++piece_number) {
			square = gameboard->piece_list[BLACK_PAWN][piece_number];

			if(gameboard->pieces[square - 10] == EMPTY) {
				AddBlackPawnMove(gameboard, square, square-10, move_list);
				if(rank_of[square] == RANK_7 && gameboard->pieces[square - 20] == EMPTY) {
					AddQuietMove(gameboard, MOVE(square,(square-20),EMPTY,EMPTY,MOVEFLAGPAWNSTART),move_list);
				}
			}

			if(!SQUAREOFFBOARD(square - 9) && PieceColor[gameboard->pieces[square - 9]] == WHITE) {
				AddBlackPawnCapture(gameboard, square, square-9, gameboard->pieces[square - 9], move_list);
			}

			if(!SQUAREOFFBOARD(square - 11) && PieceColor[gameboard->pieces[square - 11]] == WHITE) {
				AddBlackPawnCapture(gameboard, square, square-11, gameboard->pieces[square - 11], move_list);
			}
			if(gameboard->en_passant_square != NO_SQUARE) {
				if(square - 9 == gameboard->en_passant_square) {
					AddEnPassantMove(gameboard, MOVE(square,square - 9,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list);
				}
				if(square - 11 == gameboard->en_passant_square) {
					AddEnPassantMove(gameboard, MOVE(square,square - 11,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list);
				}
			}
		}
		/* BLACK SIDE CASTLING */
		if(gameboard->castle_permission & BLACK_KING_CASTLE) {
			if(gameboard->pieces[F8] == EMPTY && gameboard->pieces[G1] == EMPTY) {
				if(!IsSquareAttacked(E8,WHITE,gameboard) && !IsSquareAttacked(F8,WHITE,gameboard) ) {
					AddQuietMove(gameboard, MOVE(E8, G8, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list);
				}
			}
		}

		if(gameboard->castle_permission & BLACK_QUEEN_CASTLE) {
			if(gameboard->pieces[D8] == EMPTY && gameboard->pieces[C1] == EMPTY && gameboard->pieces[B1] == EMPTY) {
				if(!IsSquareAttacked(E8,WHITE,gameboard) && !IsSquareAttacked(D8,WHITE,gameboard) ) {
					AddQuietMove(gameboard, MOVE(E8, C8, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list);
				}
			}
		}
	}
}