Creates chess puzzles from chess games and positions
This is a command-line program that creates chess puzzles from positions with clear sequences of best moves.
It looks for positions where a player can:
Give it a PGN with any number of games or positions and it will look for positions to convert into puzzles:
./make_puzzles.py --pgn games.pgn
Or give it a position (FEN) and it will try to create a puzzle:
./make_puzzles.py --fen "6rr/1k3p2/1pb1p1np/p1p1P2R/2P3R1/2P1B3/P1BK1PP1/8 b - - 5 26"
For a list of options:
./make_puzzles.py -h
This requires Python 3 and a UCI-compatible chess engine such as Stockfish.
Install the required python libraries:
pip3 install -r requirements.txt
Make sure you have a version of Stockfish available in your $PATH
or local directory:
brew install stockfish
)sudo apt install stockfish
)./build-stockfish.sh
to compile the latest official Stockfish development buildinv update-stockfish
to get the latest multi-variant Stockfish fork used by LichessCreated puzzles are printed in PGN format to standard output
while errors and log messages are printed to standard error.
If you want to write created puzzles to a file, redirect standard output:
./make_puzzles.py --pgn games.pgn >> puzzles.pgn
It scans the moves of a game for mistakes, represented by large swings in position evaluation.
For each of these positions, it looks for move sequences where the player can make one clear best move.
If it finds that the position could become a puzzle, it will output the puzzle as a PGN.
[FEN "6rr/1k3p2/1pb1p1np/p1p1P2R/2P3R1/2P1B3/P1BK1PP1/8 b - - 5 26"]
[PuzzleCategory "Material"]
[PuzzleEngine "Stockfish 2018-11-29 64 Multi-Variant"]
[PuzzleWinner "Black"]
[SetUp "1"]
26... Nxe5 { Nxe5 [-1.68] }
27. Rxg8 { Rxg8 [-1.66] Rgh4 [-2.51] Re4 [-3.51] }
27... Nxc4+ { Nxc4+ [-1.78] Rxg8 [ 3.82] Nf3+ [ 4.79] }
28. Kd3 { Kd3 [-1.55] Ke2 [-1.83] Kd1 [-2.85] }
28... Nb2+ { Nb2+ [-1.78] Rxg8 [ 2.11] Ne5+ [ 3.44] }
29. Ke2 { Kd2 [-1.64] Ke2 [-1.74] }
Each move in the puzzle is annotated with the best 3 candidate moves
considered by the chess engine.
To scan a PGN for positions that might be candidate puzzles without
investigating any of the positions:
./make_puzzles.py --scan-only --pgn games.pgn
To start at the n-th PGN in a PGN file with lots of games:
./make_puzzles.py --start-index 1234 --pgn games.pgn
To fetch a Lichess game and save it as a PGN:
inv fetch-lichess -g 12345
To fetch all games from a Lichess tournament and save the games to PGN:
inv fetch-lichess -t 67890
You can run the whole test suite with:
inv test
This program is based on: