Érdekel egy sakkmotor programozása és a táblák használata a játék állapotának képviseletére. Tudom, hogy vannak ilyenek néhány nyílt forráskódú sakkmotor, amely táblákat használ, de nem olyan egyszerű megnézni a kódot és megérteni, mi történik. Jó referenciaanyagot keresek arra vonatkozóan, hogyan lehet az összes állapotot ábrázolni a táblákon.
Ha világosan elmagyarázza, hogyan lehet fenntartani a játék állapotát a táblák használatával, és különösen hogyan kell létrehozni az érvényes mozdulatok listáját bármely adott tábláról, vagy ha jó hivatkozásokat ad meg egy ilyen magyarázatra, akkor zöld pipát kap.
Megjegyzések
- 1. Az OP nem mutatja a téma ismeretét. Vagyis az OP nem próbálta komolyan képezni magát. 2. Itt a programozásról van szó, nem pedig a sakkról
- @TonyEnnis Miért kell ilyen durván viselkedni az embertársakkal szemben ??, tiszteljen egy kicsit és mutassa meg neki, mit kellene javítania, nem pedig annyira savanyúnak lenni
- A tények megfogalmazása nem durva vagy savanyú, @AryanParekh
- @Tonny Ennis. Képzelje el, hogy Ön kezdő, új, és csupán kérdést tett fel abban a reményben, hogy ' jó választ kap. És akkor meglát egy ilyen megjegyzést. Más emberek újraindulnak, hogy válaszoljanak a kérdéseire? Vagy túl magasnak érzi magát ahhoz, hogy figyelembe vegye.
Válasz
A legjobb forrás a sakkmotor programozásához a Sakk programozó wiki , amelynek nagy a része a táblákon . Minden megvan, amire szükséged van egy faliújság-alapú motor elkészítéséhez, bár ez inkább elterjedt, és néha olyan emberek írják, akik számára az angol második nyelv.
Megjegyzések
- A 2 link érvénytelen.
- Még mindig működnek nálam, amikor ezt a megjegyzést írom.
Válasz
Milyen programozási nyelvet szeretne használni?
A C # formátumú bitboard megvalósításához használja a System.UInt64 . Ez 64 bitet tartalmazhat, 1-t a sakktábla minden négyzetéhez. Ez az értéktípus sok gyors bitenkénti műveletnek felel meg.
Ez egy jó bitboard oktatóanyag .
Íme néhány példa a saját C # sakkmotoromról. Amint a kódból is látható, eltarthat egy ideig, amíg a fejezzen be a táblák használatával, de ezek általában nagyon gyorsak, különösen a helyzet értékeléséhez.
1. példa – A táblák meghatározása:
internal UInt64 WhiteKing; internal UInt64 WhiteQueens; internal UInt64 WhiteRooks; internal UInt64 WhiteBishops; internal UInt64 WhiteKnights; internal UInt64 WhitePawns; internal UInt64 WhitePieces;
2. példa – A tábla inicializálása:
// 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. példa – Generáció áthelyezése:
// 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. példa – Az anyag pontszámának kiszámítása:
// 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. példa – A darab mobilitásának kiszámítása:
// 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]; }
Megjegyzések
- megadhatja a moveList definícióját?