Je suis intéressé par la programmation dun moteur déchecs et utiliser des bitboards pour représenter létat du jeu. Je sais quil y en a quelques moteurs déchecs open source qui utilisent des bitboards, mais ce nest pas si facile de regarder le code et de comprendre ce qui se passe. Je suis à la recherche dun bon matériel de référence sur la façon de représenter tout létat dans les bitboards.
Expliquer clairement comment maintenir létat du jeu à laide de bitboards, et surtout comment générer une liste de coups valides à partir dun bitboard donné, ou fournir de bonnes références à une telle explication vous fera gagner la coche verte.
Commentaires
- 1. OP ne montre aucune connaissance du sujet. Autrement dit, le PO na pas essayé sérieusement de séduquer. 2. Cest une question de programmation, pas déchecs
- @TonyEnnis Pourquoi devez-vous agir si impoli envers les autres?, Avoir un peu de respect et lui montrer ce quelle devrait améliorer plutôt que dêtre si aigre
- Déclarer des faits nest pas impoli ou aigre, @AryanParekh
- @Tonny Ennis. Imaginez que vous soyez un débutant, un nouveau venu et que vous posiez simplement une question dans l’espoir que vous ' obtiendrez une bonne réponse. Et puis vous voyez un commentaire comme ça. Dautres personnes ont-elles recommencé à répondre à ses questions? Ou vous sentez-vous trop élevé pour le considérer?
Réponse
La meilleure ressource pour la programmation des moteurs déchecs est le Wiki de programmation d’échecs , qui a une grande section sur les bitboards . Tout ce dont vous avez besoin pour créer un moteur basé sur bitboard est là, bien quil soit plutôt répandu et parfois écrit par des personnes pour qui langlais est une deuxième langue.
Commentaires
- Les 2 liens ne sont plus valides maintenant.
- Ils fonctionnent toujours pour moi au moment où jécris ce commentaire.
Réponse
Quel langage de programmation souhaitez-vous utiliser?
Pour implémenter un bitboard en C #, utilisez System.UInt64 . Cela peut contenir 64 bits, 1 pour chaque carré de léchiquier. Ce type de valeur se prête à de nombreuses opérations rapides au niveau du bit.
Ceci est un bon tutoriel de bitboard .
Voici quelques exemples de mon propre moteur déchecs C #. Comme vous pouvez le voir dans le code, cela peut prendre un certain temps pour envelopper votre Utilisez des bitboards, mais ils sont généralement très rapides, en particulier pour lévaluation de la position.
Exemple 1 – Définition de bitboard:
internal UInt64 WhiteKing; internal UInt64 WhiteQueens; internal UInt64 WhiteRooks; internal UInt64 WhiteBishops; internal UInt64 WhiteKnights; internal UInt64 WhitePawns; internal UInt64 WhitePieces;
Exemple 2 – Initialisation du 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; } }
Exemple 3 – Génération de déplacement:
// 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]; }
Exemple 4 – Calcul du score matière:
// 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; }
Exemple 5 – Calcul de la mobilité des pièces:
// 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]; }
Commentaires
- pouvez-vous fournir la définition de moveList?