Jeg er interessert i å programmere en sjakkmotor og bruke bitboards til å representere spillets tilstand. Jeg vet at det er noen få sjeldne motorer med åpen kildekode som bruker bitbord, men det er ikke så lett å se på koden og forstå hva som foregår. Jeg ser etter godt referansemateriale om hvordan jeg skal representere hele staten i bitboards.
Å tydelig forklare hvordan du opprettholder spillets tilstand ved hjelp av bitboards, og spesielt hvordan du genererer en liste over gyldige trekk fra et gitt bitboard, eller å gi gode referanser til en slik forklaring, vil gi deg den grønne haken.
Kommentarer
- 1. OP viser ingen kunnskap om temaet. Det vil si at OP ikke har prøvd seriøst å utdanne seg. 2. Dette handler om programmering, ikke sjakk
- @TonyEnnis Hvorfor må du oppføre deg så frekk mot medmennesker ??, ha litt respekt og vise ham hva hun skal forbedre i stedet for å være så sur
- Å si fakta er ikke uhøflig eller sur, @AryanParekh
- @Tonny Ennis. Tenk deg at du var nybegynner, ny og bare spurte et spørsmål i håp om at du ' får et godt svar. Og så ser du en slik kommentar. Er andre mennesker begynt på nytt for å svare på spørsmålene hans? Eller føler du deg for høy av deg selv til å vurdere det.
Svar
Den beste ressursen for programmering av sjakkmotorer er Sjakkprogrammeringswiki , som har en stor -seksjon på bitboards . Alt du trenger for å lage en bitboardbasert motor er der, selv om den er ganske spredt og noen ganger skrevet av folk som engelsk er andrespråk for.
Kommentarer
- De to koblingene er ugyldige nå.
- De fungerer fremdeles for meg fra den tiden jeg skriver denne kommentaren.
Svar
Hvilket programmeringsspråk vil du bruke?
For å implementere et bitboard i C #, bruk System.UInt64 . Dette kan inneholde 64 bits, 1 for hvert kvadrat på sjakkbrettet. Denne verditypen gir seg mange raske bitvise operasjoner.
Dette er en god bitboard-opplæring .
Her er noen eksempler fra min egen C # sjakkmotor. Som du ser fra koden, kan det ta litt tid å pakke inn gå rundt med bitbord, men de er vanligvis veldig raske, spesielt for posisjonsevaluering.
Eksempel 1 – Bitboarddefinisjon:
internal UInt64 WhiteKing; internal UInt64 WhiteQueens; internal UInt64 WhiteRooks; internal UInt64 WhiteBishops; internal UInt64 WhiteKnights; internal UInt64 WhitePawns; internal UInt64 WhitePieces;
Eksempel 2 – Bitboardinitialisering:
// 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; } }
Eksempel 3 – Flytt generasjon:
// 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]; }
Eksempel 4 – Beregn materialpoeng:
// 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; }
Eksempel 5 – Beregning av mobilitet:
// 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]; }
Kommentarer
- kan du gi definisjonen av moveList?