51 lines
1.7 KiB
Markdown
51 lines
1.7 KiB
Markdown
<!-- LTeX: language=en-US -->
|
|
# Chess
|
|
|
|
A chess engine with focus on fast move generation.
|
|
|
|
## Building
|
|
|
|
The following dependencies are used for the GUI:
|
|
- gtk 4
|
|
- librsvg (for loading the piece images)
|
|
|
|
The engine can be built with cmake.
|
|
|
|
```
|
|
cmake .
|
|
make
|
|
```
|
|
|
|
If you do not use make, replace it with ninja for example. The build script contains multiple
|
|
targets:
|
|
|
|
- chess: This is the main target. It has a GUI and the user plays as white. The engine responds with
|
|
a move for black.
|
|
- chessNoComputer: The user can play both sides in a GUI. Mainly added for testing the move
|
|
generator.
|
|
- findMagicNumber: finds Magic Numbers for the magic bitboard.
|
|
- moveGenTest: tests the move generator
|
|
|
|
## Testing
|
|
|
|
The target moveGenTest with its source in the test directory is a [perft](https://www.chessprogramming.org/Perft).
|
|
It works by counting the number of leaf nodes of the move generation with a
|
|
certain depth. The results where verified with [stockfish](https://stockfishchess.org/).
|
|
|
|
## Implementation
|
|
|
|
The engine is implemented using [bitboards](https://www.chessprogramming.org/Bitboards)
|
|
to store the position. A bitboard is an array of 64-Bit unsigned integers. The bitboard contains one
|
|
element per piece and square. Each Bit of the integer corresponds to one field
|
|
on the board, whether the piece stands there (1) or not (0). This allows use to
|
|
use bitwise operations to calculate information we need, really fast.
|
|
|
|
The move generation of pseudo-legal moves (moves without considering whether the
|
|
king is in check) is mostly straightforward. We pre-generate some data in
|
|
`src/generateCode/moveConsts.c`, so that we can calculate the moves faster.
|
|
|
|
# sources
|
|
|
|
https://www.chessprogramming.org/Magic_Bitboards
|
|
https://www.chessprogramming.org/Looking_for_Magics
|