비트 보드로 체스 상태를 나타내는 방법

저는 체스 엔진을 프로그래밍하고 비트 보드를 사용하여 게임의 상태를 나타내는 데 관심이 있습니다. 비트 보드를 사용하는 몇 가지 오픈 소스 체스 엔진이 있지만 코드를보고 무슨 일이 일어나고 있는지 이해하기가 쉽지 않습니다. 저는 비트 보드에서 모든 상태를 표현하는 방법에 대한 좋은 참조 자료를 찾고 있습니다.

비트 보드를 사용하여 게임 상태를 유지하는 방법, 특히 주어진 비트 보드에서 유효한 동작 목록을 생성하는 방법을 명확하게 설명하거나 이러한 설명에 대한 좋은 참조를 제공하면 녹색 확인 표시가 나타납니다.

댓글

  • 1. OP는 주제에 대한 지식이 없음을 보여줍니다. 즉, OP는 자신을 교육하기 위해 진지하게 노력하지 않았습니다. 2. 이것은 체스가 아니라 프로그래밍에 관한 것입니다.
  • @TonyEnnis 동료들에게 무례하게 행동해야하는 이유는 무엇입니까 ??, 약간의 존경심을 갖고 그녀가 너무 신맛이 나는 것보다 개선해야 할 점을 보여줍니다.
  • 진실을 말하는 것은 무례하거나 신랄하지 않습니다. @AryanParekh
  • @Tonny Ennis. 당신이 초보자 였고, 좋은 대답을 얻기를 바라며 단지 질문 만하고 있었다고 상상해보십시오. ' 그런 다음 이와 같은 댓글이 표시됩니다. 다른 사람들이 그의 질문에 답하기 위해 재 참가 되었습니까? 아니면 자신이 너무 높아서 고려할 수 없다고 생각하십니까?

답변

체스 엔진 프로그래밍을위한 최고의 리소스 Chess Programming Wiki 로 큰 비트 보드 섹션 이 있습니다. 비트 보드 기반 엔진을 만드는 데 필요한 모든 것이 여기에 있습니다. 비록 “영어가 제 2 언어 인 사람들에 의해 다소 퍼져 나가고 때때로 작성 되기는하지만.

댓글

  • 현재 2 개의 링크가 유효하지 않습니다.
  • 이 댓글을 작성하는 시점에서도 여전히 작동합니다.

답변

어떤 프로그래밍 언어를 사용 하시겠습니까?

C #에서 비트 보드를 구현하려면 System.UInt64 . 체스 판의 각 사각형에 대해 1 개씩 64 비트를 저장할 수 있습니다.이 값 유형은 많은 빠른 비트 연산에 적합합니다.

이것은 좋은 비트 보드 자습서 .

다음은 제 C # 체스 엔진의 몇 가지 예입니다. 코드에서 볼 수 있듯이 래핑하는 데 시간이 걸릴 수 있습니다. 비트 보드를 사용하지만 일반적으로 특히 위치 평가에 매우 빠릅니다.

예제 1-비트 보드 정의 :

internal UInt64 WhiteKing; internal UInt64 WhiteQueens; internal UInt64 WhiteRooks; internal UInt64 WhiteBishops; internal UInt64 WhiteKnights; internal UInt64 WhitePawns; internal UInt64 WhitePieces; 

예 2-Bitboard 초기화 :

// Initialise piece bitboards using square contents. private void InitPieceBitboards() { this.WhiteKing = 0; this.WhiteQueens = 0; this.WhiteRooks = 0; this.WhiteBishops = 0; this.WhiteKnights = 0; this.WhitePawns = 0; for (Int16 i = 0; i < 64; i++) { if (this.Squares[i] == Constants.WHITE_KING) { this.WhiteKing = this.WhiteKing | Constants.BITSET[i]; } if (this.Squares[i] == Constants.WHITE_QUEEN) { this.WhiteQueens = this.WhiteQueens | Constants.BITSET[i]; } if (this.Squares[i] == Constants.WHITE_ROOK) { this.WhiteRooks = this.WhiteRooks | Constants.BITSET[i]; } if (this.Squares[i] == Constants.WHITE_BISHOP) { this.WhiteBishops = this.WhiteBishops | Constants.BITSET[i]; } if (this.Squares[i] == Constants.WHITE_KNIGHT) { this.WhiteKnights = this.WhiteKnights | Constants.BITSET[i]; } if (this.Squares[i] == Constants.WHITE_PAWN) { this.WhitePawns = this.WhitePawns | Constants.BITSET[i]; } this.WhitePieces = this.WhiteKing | this.WhiteQueens | this.WhiteRooks | this.WhiteBishops | this.WhiteKnights | this.WhitePawns; this.BlackPieces = this.BlackKing | this.BlackQueens | this.BlackRooks | this.BlackBishops | this.BlackKnights | this.BlackPawns; this.SquaresOccupied = this.WhitePieces | this.BlackPieces; } } 

예 3-이동 생성 :

// We can"t capture one of our own pieces. eligibleSquares = ~this.WhitePieces; // Generate moves for white knights. remainingKnights = this.WhiteKnights; // Generate the moves for each knight... while (remainingKnights != 0) { squareFrom = BitOps.BitScanForward(remainingKnights); generatedMoves = Constants.ATTACKS_KNIGHT[squareFrom] & eligibleSquares; while (generatedMoves != 0) { squareTo = BitOps.BitScanForward(generatedMoves); moveList.Add(new Move(squareFrom, squareTo, Constants.WHITE_KNIGHT, this.Squares[squareTo], Constants.EMPTY)); generatedMoves ^= Constants.BITSET[squareTo]; } // Finished with this knight - move on to the next one. remainingKnights ^= Constants.BITSET[squareFrom]; } 

예 4-재료 점수 계산 :

// Material score from scratch, in centipawns from White"s perspective. internal static Int32 ScoreMaterial(Board position) { return BitOps.BitCountWegner(position.WhitePawns) * Constants.VALUE_PAWN + BitOps.BitCountWegner(position.WhiteKnights) * Constants.VALUE_KNIGHT + BitOps.BitCountWegner(position.WhiteBishops) * Constants.VALUE_BISHOP + BitOps.BitCountWegner(position.WhiteRooks) * Constants.VALUE_ROOK + BitOps.BitCountWegner(position.WhiteQueens) * Constants.VALUE_QUEEN - BitOps.BitCountWegner(position.BlackPawns) * Constants.VALUE_PAWN - BitOps.BitCountWegner(position.BlackKnights) * Constants.VALUE_KNIGHT - BitOps.BitCountWegner(position.BlackBishops) * Constants.VALUE_BISHOP - BitOps.BitCountWegner(position.BlackRooks) * Constants.VALUE_ROOK - BitOps.BitCountWegner(position.BlackQueens) * Constants.VALUE_QUEEN; } 

예 5-부품 이동성 계산 :

// Calculate mobility score for white knights. remainingPieces = position.WhiteKnights; while (remainingPieces != 0) { squareFrom = BitOps.BitScanForward(remainingPieces); mobilityKnight += BitOps.BitCountWegner(Constants.ATTACKS_KNIGHT[squareFrom] & unoccupiedSquares); remainingPieces ^= Constants.BITSET[squareFrom]; } 

댓글

  • moveList의 정의를 제공 할 수 있습니까?

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다