From c8978a20f7c69c513f3a45203637ca381cc267e8 Mon Sep 17 00:00:00 2001 From: programarivm Date: Sun, 5 Jan 2025 13:08:03 +0100 Subject: [PATCH] Deployed 5f0a459e with MkDocs version: 1.5.3 --- heuristics/index.html | 13 +++++++------ heuristics_01.png | Bin 107327 -> 17080 bytes heuristics_02.png | Bin 18553 -> 107327 bytes heuristics_03.png | Bin 17961 -> 18553 bytes heuristics_04.png | Bin 19640 -> 17961 bytes heuristics_05.png | Bin 0 -> 19640 bytes index.html | 2 +- search/search_index.json | 2 +- sitemap.xml | 12 ++++++------ sitemap.xml.gz | Bin 270 -> 270 bytes 10 files changed, 15 insertions(+), 14 deletions(-) create mode 100644 heuristics_05.png diff --git a/heuristics/index.html b/heuristics/index.html index 13229e84e..fbfa1d357 100644 --- a/heuristics/index.html +++ b/heuristics/index.html @@ -275,7 +275,6 @@

Heuristics

-

The evaluation features are used in several classes.

Evaluate a Chess Position

Chess\EvalArray allows to transform a FEN position to a normalized array of values between -1 and +1. -1 is the best possible evaluation for Black and +1 the best possible evaluation for White. Both forces being set to 0 means they're balanced.

use Chess\EvalArray;
@@ -381,7 +380,9 @@ 

Steinitz Evaluation

1
 

In this example, White is better than Black because the value obtained is a positive number. One evaluation feature is favoring White.

-

The Steinitz evaluation alone has proven to be quite accurate as a relative estimate for chess positions in a way that is easy for human players to understand and to learn. However, it can be complemented with other statistical measures such as the mean, median, mode, and standard deviation of the evaluation array without counting the zeros.

+

Chess evaluation functions often consist in multiplying the terms by a weight and adding the results to construct a linear combination.

+

Figure 1

+

However, the Steinitz evaluation alone, which is to say just counting the advantages, has proven to be quite accurate as a relative estimate for chess positions in a way that is easy for human players to understand and to learn. Also it can be complemented with other statistical measures such as the mean, median, mode, and standard deviation of the evaluation array without counting the zeros.

Mean

The mean represents the center of the evaluation array being intermediate to the extreme values.

$mean = EvalArray::mean($f, $board);
@@ -439,7 +440,7 @@ 

Plot the Oscillations of a Game

[4] => -1 )
-

Figure 1

+

Figure 2

The data is plotted in a way that is easy for chess players to understand and learn.

Extract Chess Data

Given a PGN movetext in SAN format, Chess\SanExtractor returns the oscillations of all evaluation features for data analysis purposes like the following example.

@@ -493,7 +494,7 @@

Evaluation Array

[31] => 0 )
-

Figure 2

+

Figure 3

The evaluation array can be plotted in a way that is easy for chess players to understand and learn.

Mean

$mean = SanExtractor::mean($f, $board, $movetext);
@@ -508,7 +509,7 @@ 

Mean

[4] => -0.0657 )
-

Figure 3

+

Figure 4

Standard Deviation

$sd = SanExtractor::sd($f, $board, $movetext);
 
@@ -523,7 +524,7 @@ 

Standard Deviation

[4] => -0.5406 )
-

Figure 4

+

Figure 5

🎉 So chess positions and games can be plotted on charts and processed with machine learning techniques. Become a better player by extracting knowledge from games with the help of Data Mining tools.

diff --git a/heuristics_01.png b/heuristics_01.png index 0636835c43b32c193f1068613cd76997d084a000..bd8fd0a1cc0739f770020a03923e3350a31682ae 100644 GIT binary patch literal 17080 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 z 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 diff --git a/heuristics_02.png b/heuristics_02.png index d71fdb0322cc4e0e1bf40dc123dde7cbb57909d2..0636835c43b32c193f1068613cd76997d084a000 100644 GIT binary patch literal 107327 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 z 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 literal 18553 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 Shortcuts

diff --git a/search/search_index.json b/search/search_index.json index 8b9c7b4b3..b76ccfe12 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"PHP Chess A chess library for PHP offering move validation, common formats, multiple variants, UCI engine support, explanation of chess positions, image recognition and knowledge extraction from games. Installation Requirements PHP >= 8.1 Stockfish >= 15.1 Composer installation composer require chesslablab/php-chess Features Formats Supported Chess moves in LAN and PGN formats. Movetext processing in LAN, SAN and RAV formats. NAG support for SAN and RAV movetexts. UCI protocol. Chess board to PNG and JPG image. PNG and JPG image to FEN. FEN to chess board. Chess board to MP4 video. Acronym Description LAN Long Algebraic Notation PGN Portable Game Notation SAN Standard Algebraic Notation RAV Recursive Annotation Variation NAG Numeric Annotation Glyphs UCI Universal Chess Interface FEN Forsyth-Edwards Notation Chess Variants Multiple variants are supported with the default one being classical chess. Variant Chessboard Capablanca Chess\\Variant\\Capablanca\\Board Capablanca-Fischer Chess\\Variant\\CapablancaFischer\\Board Chess960 Chess\\Variant\\Chess960\\Board Classical Chess\\Variant\\Classical\\Board Dunsany Chess\\Variant\\Dunsany\\Board Losing Chess Chess\\Variant\\Losing\\Board RacingKings Chess\\Variant\\RacingKings\\Board UCI Engines Listed below are the UCI engines available at the moment. Stockfish Object-Oriented The chess board representation is an object of type SplObjectStorage as opposed to a bitboard. Thoroughly Tested PHP Chess has been developed with a test-driven development (TDD) approach. The tests/unit folder contains plenty of real examples. Almost every class in the src folder represents a concept that is tested accordingly in the tests/unit folder, in other words, the structure of the tests/unit folder is mirroring the structure of the src folder. The PHP Chess docs are more of a tutorial rather than an API description. The unit tests are the best documentation. For further details on how to use a particular class, please feel free to browse the codebase and check out the corresponding tests. Lightweight PHP dependencies required: Rubix ML for machine learning. Imagine for image processing.","title":"PHP Chess"},{"location":"#php-chess","text":"A chess library for PHP offering move validation, common formats, multiple variants, UCI engine support, explanation of chess positions, image recognition and knowledge extraction from games.","title":"PHP Chess"},{"location":"#installation","text":"","title":"Installation"},{"location":"#requirements","text":"PHP >= 8.1 Stockfish >= 15.1","title":"Requirements"},{"location":"#composer-installation","text":"composer require chesslablab/php-chess","title":"Composer installation"},{"location":"#features","text":"","title":"Features"},{"location":"#formats-supported","text":"Chess moves in LAN and PGN formats. Movetext processing in LAN, SAN and RAV formats. NAG support for SAN and RAV movetexts. UCI protocol. Chess board to PNG and JPG image. PNG and JPG image to FEN. FEN to chess board. Chess board to MP4 video. Acronym Description LAN Long Algebraic Notation PGN Portable Game Notation SAN Standard Algebraic Notation RAV Recursive Annotation Variation NAG Numeric Annotation Glyphs UCI Universal Chess Interface FEN Forsyth-Edwards Notation","title":"Formats Supported"},{"location":"#chess-variants","text":"Multiple variants are supported with the default one being classical chess. Variant Chessboard Capablanca Chess\\Variant\\Capablanca\\Board Capablanca-Fischer Chess\\Variant\\CapablancaFischer\\Board Chess960 Chess\\Variant\\Chess960\\Board Classical Chess\\Variant\\Classical\\Board Dunsany Chess\\Variant\\Dunsany\\Board Losing Chess Chess\\Variant\\Losing\\Board RacingKings Chess\\Variant\\RacingKings\\Board","title":"Chess Variants"},{"location":"#uci-engines","text":"Listed below are the UCI engines available at the moment. Stockfish","title":"UCI Engines"},{"location":"#object-oriented","text":"The chess board representation is an object of type SplObjectStorage as opposed to a bitboard.","title":"Object-Oriented"},{"location":"#thoroughly-tested","text":"PHP Chess has been developed with a test-driven development (TDD) approach. The tests/unit folder contains plenty of real examples. Almost every class in the src folder represents a concept that is tested accordingly in the tests/unit folder, in other words, the structure of the tests/unit folder is mirroring the structure of the src folder. The PHP Chess docs are more of a tutorial rather than an API description. The unit tests are the best documentation. For further details on how to use a particular class, please feel free to browse the codebase and check out the corresponding tests.","title":"Thoroughly Tested"},{"location":"#lightweight","text":"PHP dependencies required: Rubix ML for machine learning. Imagine for image processing.","title":"Lightweight"},{"location":"chess-tutor/","text":"Chess Tutor Explain a FEN Position \u2728 Chess beginners often think they can checkmate the opponent's king quickly. However, there are so many different things to consider in order to understand a position. Chess\\Tutor\\FenEvaluation helps you improve your chess thinking process by evaluating a FEN position in terms of chess concepts like in the example below. use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; use Chess\\Tutor\\FenEvaluation; $f = new CompleteFunction(); $board = FenToBoardFactory::create('8/5k2/4n3/8/8/1BK5/1B6/8 w - - 0 1'); $paragraph = (new FenEvaluation($f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; White has a decisive material advantage. White has a slightly better control of the center. The white player is pressuring more squares than its opponent. White has an absolute pin advantage. White has the bishop pair. Black's king has more safe squares to move to than its counterpart. Black's king can be checked so it is vulnerable to forced moves. The knight on e6 is pinned shielding the king so it cannot move out of the line of attack because the king would be put in check. Overall, 5 evaluation features are favoring White. The relative evaluation of this position is 2.26. \ud83c\udf89 This is a form of abductive reasoning. Explain a PGN Move \u2728 Typically, chess engines won't provide an explanation in easy-to-understand language about how a move changes the position on the board. Chess\\Tutor\\PgnEvaluation explains how a particular move changes the position. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\PgnEvaluation; $pgn = 'd4'; $f = new CompleteFunction(); $movetext = '1.Nf3 d5 2.g3 c5'; $board = (new SanPlay($movetext))->validate()->board; $paragraph = (new PgnEvaluation($pgn, $f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; Black has a slight space advantage. White has a slight protection advantage. White has a slight attack advantage. White's king can be checked so it is vulnerable to forced moves. These pieces are hanging: The rook on a1, the rook on h1, the rook on a8, the rook on h8, the pawn on c5. The pawn on c5 is unprotected. The pawn on c5 is under threat of being attacked. Overall, 0 evaluation features are favoring either player. The relative evaluation of this position is 1.5. The resulting text may sound a little robotic but it can be easily rephrased by the AI of your choice to make it sound more human-like. Explain a Good PGN Move \u2728 It's often difficult for beginners to understand why a move is good. With the help of an UCI engine Chess\\Tutor\\GoodPgnEvaluation can explain the why of a good move. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\GoodPgnEvaluation; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $limit = new Limit(); $limit->depth = 12; $stockfish = new UciEngine('/usr/games/stockfish'); $f = new CompleteFunction(); $movetext = '1.d4 d5 2.c4 Nc6 3.cxd5 Qxd5 4.e3 e5 5.Nc3 Bb4 6.Bd2 Bxc3 7.Bxc3 exd4 8.Ne2'; $board = (new SanPlay($movetext))->validate()->board; $goodPgnEvaluation = new GoodPgnEvaluation($limit, $stockfish, $f, $board); $pgn = $goodPgnEvaluation->pgn; $paragraph = implode(' ', $goodPgnEvaluation->paragraph); echo $pgn . PHP_EOL; echo $paragraph . PHP_EOL; Bg4 The black player is pressuring more squares than its opponent. The black pieces are timidly approaching the other side's king. Black has a relative pin advantage. These pieces are hanging: Black's queen on d5, the rook on a8, the rook on h8, the pawn on b7, the pawn on c7, the pawn on g7, the bishop on g4, the rook on h1. The knight on e2 is pinned shielding a piece that is more valuable than the attacking piece. Overall, 7 evaluation features are favoring Black. The relative evaluation of this position is 0.32. \ud83c\udf89 Let's do this!","title":"Chess Tutor"},{"location":"chess-tutor/#chess-tutor","text":"","title":"Chess Tutor"},{"location":"chess-tutor/#explain-a-fen-position","text":"\u2728 Chess beginners often think they can checkmate the opponent's king quickly. However, there are so many different things to consider in order to understand a position. Chess\\Tutor\\FenEvaluation helps you improve your chess thinking process by evaluating a FEN position in terms of chess concepts like in the example below. use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; use Chess\\Tutor\\FenEvaluation; $f = new CompleteFunction(); $board = FenToBoardFactory::create('8/5k2/4n3/8/8/1BK5/1B6/8 w - - 0 1'); $paragraph = (new FenEvaluation($f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; White has a decisive material advantage. White has a slightly better control of the center. The white player is pressuring more squares than its opponent. White has an absolute pin advantage. White has the bishop pair. Black's king has more safe squares to move to than its counterpart. Black's king can be checked so it is vulnerable to forced moves. The knight on e6 is pinned shielding the king so it cannot move out of the line of attack because the king would be put in check. Overall, 5 evaluation features are favoring White. The relative evaluation of this position is 2.26. \ud83c\udf89 This is a form of abductive reasoning.","title":"Explain a FEN Position"},{"location":"chess-tutor/#explain-a-pgn-move","text":"\u2728 Typically, chess engines won't provide an explanation in easy-to-understand language about how a move changes the position on the board. Chess\\Tutor\\PgnEvaluation explains how a particular move changes the position. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\PgnEvaluation; $pgn = 'd4'; $f = new CompleteFunction(); $movetext = '1.Nf3 d5 2.g3 c5'; $board = (new SanPlay($movetext))->validate()->board; $paragraph = (new PgnEvaluation($pgn, $f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; Black has a slight space advantage. White has a slight protection advantage. White has a slight attack advantage. White's king can be checked so it is vulnerable to forced moves. These pieces are hanging: The rook on a1, the rook on h1, the rook on a8, the rook on h8, the pawn on c5. The pawn on c5 is unprotected. The pawn on c5 is under threat of being attacked. Overall, 0 evaluation features are favoring either player. The relative evaluation of this position is 1.5. The resulting text may sound a little robotic but it can be easily rephrased by the AI of your choice to make it sound more human-like.","title":"Explain a PGN Move"},{"location":"chess-tutor/#explain-a-good-pgn-move","text":"\u2728 It's often difficult for beginners to understand why a move is good. With the help of an UCI engine Chess\\Tutor\\GoodPgnEvaluation can explain the why of a good move. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\GoodPgnEvaluation; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $limit = new Limit(); $limit->depth = 12; $stockfish = new UciEngine('/usr/games/stockfish'); $f = new CompleteFunction(); $movetext = '1.d4 d5 2.c4 Nc6 3.cxd5 Qxd5 4.e3 e5 5.Nc3 Bb4 6.Bd2 Bxc3 7.Bxc3 exd4 8.Ne2'; $board = (new SanPlay($movetext))->validate()->board; $goodPgnEvaluation = new GoodPgnEvaluation($limit, $stockfish, $f, $board); $pgn = $goodPgnEvaluation->pgn; $paragraph = implode(' ', $goodPgnEvaluation->paragraph); echo $pgn . PHP_EOL; echo $paragraph . PHP_EOL; Bg4 The black player is pressuring more squares than its opponent. The black pieces are timidly approaching the other side's king. Black has a relative pin advantage. These pieces are hanging: Black's queen on d5, the rook on a8, the rook on h8, the pawn on b7, the pawn on c7, the pawn on g7, the bishop on g4, the rook on h1. The knight on e2 is pinned shielding a piece that is more valuable than the attacking piece. Overall, 7 evaluation features are favoring Black. The relative evaluation of this position is 0.32. \ud83c\udf89 Let's do this!","title":"Explain a Good PGN Move"},{"location":"format-converters/","text":"Format Converters FEN to Board \u2728 FEN stands for Forsyth-Edwards Notation and is the standard way for describing chess positions using text strings. At some point you'll definitely want to convert a FEN string into a chessboard object for further processing, and this can be done with the Chess\\FenToBoardFactory class according to the variants supported. When a single parameter is passed into the factory's create method, it is assumed that you want to create a classical chess board object. use Chess\\FenToBoardFactory; $board = FenToBoardFactory::create('rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq -'); $board->play('w', 'Nc3'); $board->play('b', 'Nc6'); echo $board->toFen(); r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - In this example the game history contains two moves only. var_dump($board->history); array(2) { [0]=> array(7) { [\"pgn\"]=> string(3) \"Nc3\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"w\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b1\" [\"to\"]=> string(2) \"c3\" [\"fen\"]=> string(59) \"rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq -\" } [1]=> array(7) { [\"pgn\"]=> string(3) \"Nc6\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"b\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b8\" [\"to\"]=> string(2) \"c6\" [\"fen\"]=> string(60) \"r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq -\" } } The initial FEN string can be accessed as shown below. echo $board->startFen; rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - This is how to get LAN formatted moves out of the history array. $last = end($board->history); $lan = $last['from'] . $last['to']; echo $lan; b8c6 Board to PNG Image \u2728 PNG stands for Portable Network Graphics and is a widely used format for image files. Not to be confused with PGN, the text-based file format to annotate chess games. Chess\\Media\\BoardToPng converts a chess board object to a PNG image. use Chess\\FenToBoardFactory; use Chess\\Media\\BoardToPng; $board = FenToBoardFactory::create('1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K w - - bm Nf6+'); $filename = (new BoardToPng($board, $flip = true))->output(__DIR__); Try this thing! Share a puzzling chess position with friends for further study. Board to MP4 \u2728 Text-based PGN movetexts can be easily converted to MP4, a widely-used video format which comes in handy for pausing the games. Chess\\Media\\BoardToMp4 allows to convert a chess board object to an MP4 video. use Chess\\Media\\BoardToMp4; use Chess\\Variant\\Classical\\Board; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = new Board(); $filename = (new BoardToMp4($movetext, $board, $flip = false))->output(__DIR__); MP4 videos are especially useful to pause the game at a specific position. Image to FEN \u2728 A chess piece image recognizer has been created in the chesslablab/perception repository with the help of a multilayer neural network. Chess\\Media\\ImgToPiecePlacement relies on this recognizer to convert a GD image into a piece placement in FEN format. use Chess\\Media\\ImgToPiecePlacement; $image = imagecreatefrompng(__DIR__ . '/01_kaufman.png'); $prediction = (new ImgToPiecePlacement($image))->predict(); echo $prediction; 1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K For optimal use, it is recommended to make predictions on chessboard images using classical chess pieces like the Kaufman test attached below.","title":"Format Converters"},{"location":"format-converters/#format-converters","text":"","title":"Format Converters"},{"location":"format-converters/#fen-to-board","text":"\u2728 FEN stands for Forsyth-Edwards Notation and is the standard way for describing chess positions using text strings. At some point you'll definitely want to convert a FEN string into a chessboard object for further processing, and this can be done with the Chess\\FenToBoardFactory class according to the variants supported. When a single parameter is passed into the factory's create method, it is assumed that you want to create a classical chess board object. use Chess\\FenToBoardFactory; $board = FenToBoardFactory::create('rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq -'); $board->play('w', 'Nc3'); $board->play('b', 'Nc6'); echo $board->toFen(); r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - In this example the game history contains two moves only. var_dump($board->history); array(2) { [0]=> array(7) { [\"pgn\"]=> string(3) \"Nc3\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"w\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b1\" [\"to\"]=> string(2) \"c3\" [\"fen\"]=> string(59) \"rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq -\" } [1]=> array(7) { [\"pgn\"]=> string(3) \"Nc6\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"b\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b8\" [\"to\"]=> string(2) \"c6\" [\"fen\"]=> string(60) \"r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq -\" } } The initial FEN string can be accessed as shown below. echo $board->startFen; rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - This is how to get LAN formatted moves out of the history array. $last = end($board->history); $lan = $last['from'] . $last['to']; echo $lan; b8c6","title":"FEN to Board"},{"location":"format-converters/#board-to-png-image","text":"\u2728 PNG stands for Portable Network Graphics and is a widely used format for image files. Not to be confused with PGN, the text-based file format to annotate chess games. Chess\\Media\\BoardToPng converts a chess board object to a PNG image. use Chess\\FenToBoardFactory; use Chess\\Media\\BoardToPng; $board = FenToBoardFactory::create('1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K w - - bm Nf6+'); $filename = (new BoardToPng($board, $flip = true))->output(__DIR__); Try this thing! Share a puzzling chess position with friends for further study.","title":"Board to PNG Image"},{"location":"format-converters/#board-to-mp4","text":"\u2728 Text-based PGN movetexts can be easily converted to MP4, a widely-used video format which comes in handy for pausing the games. Chess\\Media\\BoardToMp4 allows to convert a chess board object to an MP4 video. use Chess\\Media\\BoardToMp4; use Chess\\Variant\\Classical\\Board; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = new Board(); $filename = (new BoardToMp4($movetext, $board, $flip = false))->output(__DIR__); MP4 videos are especially useful to pause the game at a specific position.","title":"Board to MP4"},{"location":"format-converters/#image-to-fen","text":"\u2728 A chess piece image recognizer has been created in the chesslablab/perception repository with the help of a multilayer neural network. Chess\\Media\\ImgToPiecePlacement relies on this recognizer to convert a GD image into a piece placement in FEN format. use Chess\\Media\\ImgToPiecePlacement; $image = imagecreatefrompng(__DIR__ . '/01_kaufman.png'); $prediction = (new ImgToPiecePlacement($image))->predict(); echo $prediction; 1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K For optimal use, it is recommended to make predictions on chessboard images using classical chess pieces like the Kaufman test attached below.","title":"Image to FEN"},{"location":"getting-started/","text":"Getting Started \u2728 Some familiarity with chess terms and concepts is required but if you're new to chess this tutorial will guide you through how to easily create amazing apps with PHP Chess. Happy coding and learning! The Chess\\Variant\\Classical\\Board class is the easiest way to get started with PHP Chess. use Chess\\Variant\\Classical\\Board; $board = new Board(); If you have ever attended a chess tournament, you've probably noticed that each player writes down their move in PGN format on a piece of paper. PGN stands for Portable Game Notation and is a human-readable format that allows chess players to read and write chess games. When it comes to computer chess, though, a more appropriate machine-readable format called Long Algebraic Notation (LAN) is often used instead. Be that as it may, you're already set up to play classical chess either in PGN or LAN format. In PGN format: $board->play('w', 'e4'); In LAN format: $board->playLan('w', 'e2e4'); Every time a move is made, the state of the board changes. var_dump($board->toFen()); string(55) \"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3\" This is the chess position in Forsyth\u2013Edwards Notation (FEN) format after 1.e4. \ud83c\udf89 Congrats! 1.e4 is one of the best moves to start with. Portable Game Notation (PGN) \u2728 Portable Game Notation is a human-readable text format that allows chess players to read and write chess games. PGN is convenient for when reading chess games annotated by humans, for example, those ones available in online databases or published in chess websites. 1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.Nd2 Nxd2 8.Bxd2 Bd6 9.O-O h5 10.Qe1+ Kf8 11.Bb4 Qe7 12.Bxd6 Qxd6 13.Qd2 Re8 14.Rae1 Rh6 15.Qg5 c6 16.Rxe8+ Bxe8 17.Re1 Qf6 18.Qe3 Bd7 19.h3 h4 20.c4 dxc4 21.Bxc4 b5 22.Qa3+ Kg8 23.Qxa7 Qd8 24.Bb3 Rd6 25.Re4 Be6 26.Bxe6 Rxe6 27.Rxe6 fxe6 28.Qc5 Qa5 29.Qxc6 Qe1+ 30.Kh2 Qxf2 31.Qxe6+ Kh7 32.Qe4+ Kg8 33.b3 Qxa2 34.Qe8+ Kh7 35.Qxb5 Qf2 36.Qe5 Qb2 37.Qe4+ Kg8 38.Qd3 Qf2 39.Qc3 Qf4+ 40.Kg1 Kh7 41.Qd3+ g6 42.Qd1 Qe3+ 43.Kh1 g5 44.d5 g4 45.hxg4 h3 46.Qf3 1\u20130 World Chess Championship 2021. (2023, July 3). In Wikipedia. https://en.wikipedia.org/wiki/World_Chess_Championship_2021 As you may probably know, a chess opening is the group of initial moves of a chess game. This definition applies to classical chess, however, there is no such thing as a chess opening in either Capablanca chess or Chess960. Those two variants were originally conceived to minimize memorization, so when it comes to chess openings it is assumed that we're in the realms of classical chess. ECO, which stands for Encyclopaedia of Chess Openings, is a standard classification system for chess openings. Having said all that, let's now look at B54 which is the ECO code for \"Sicilian Defense: Modern Variations, Main Line\". use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $board->play('b', 'c5'); $board->play('w', 'Nf3'); $board->play('b', 'd6'); $board->play('w', 'd4'); $board->play('b', 'cxd4'); $board->play('w', 'Nxd4'); echo $board->toString(); r n b q k b n r p p . . p p p p . . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R The play() method in the Chess\\Variant\\Classical\\Board class allows to make moves in PGN format. So far so good, but if you're new to chess you may well play a wrong move in the Sicilian Defense: 4...Na6. $board->play('b', 'Na6'); echo $board->toString(); r . b q k b n r p p . . p p p p n . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R No worries! The undo() method comes to the rescue to take back a move. $board = $board->undo(); $board->play('b', 'Nf6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 The movetext() method is used to obtain the moves played in the game using Standard Algebraic Notation. Let's continue practicing chess openings. Now, what if you want to play a bunch of moves at once instead of one by one as in the previous example? Chess\\Play\\SanPlay allows to easily do so. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6'; $board = (new SanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R Please note that the validate() method will throw an exception if the movetext is not valid. Once the $board object is successfully created, the game can be continued from that particular position. $board->play('w', 'Bb5+'); echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . B . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K . . R Every time a move is made, the state of the board changes. Chess\\Variant\\Classical\\Board provides you with plenty of methods to interact with a chess board object. It is a quite common use case to query the board state. As discussed in the Home section, you may want to check out the corresponding tests for further details on how to use it. The unit tests are the best documentation. They contain hundreds of real examples on how to use the PHP Chess library. The isCheck() method will confirm that the white king is in check after 5.Bb5+ while isMate() will confirm that it has not been mated. var_dump($board->isCheck()); bool(true) var_dump($board->isMate()); bool(false) Similarly, you may want to know if the current position is a draw. The isStalemate() method is to find out if the current position is a stalemate while isFivefoldRepetition() will confirm if the game is drawn because of a fivefold repetition. var_dump($board->isStalemate()); bool(false) var_dump($board->isFivefoldRepetition()); bool(false) Text comments in curly brackets can optionally be used in SAN movetexts as well as Numeric Annotation Glyphs . The example below shows how Chess\\Play\\SanPlay is used to validate a SAN movetext that contains NAGs. Remember, the validate() method will throw an exception if the movetext is not valid. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113'; $sanPlay = (new SanPlay($movetext))->validate(); echo $sanPlay->sanMovetext->filtered(); 1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113 Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. echo $sanPlay->sanMovetext->filtered($comments = true, $nags = false); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 \ud83c\udf89 Next, let's learn how to process chess moves from a graphical user interface. Long Algebraic Notation (LAN) \u2728 The UCI protocol enables chess engines to communicate with user interfaces (UI) using Long Algebraic Notation (LAN) for moves. use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->playLan('w', 'e2e4'); $board->playLan('b', 'c7c5'); $board->playLan('w', 'g1f3'); $board->playLan('b', 'd7d6'); $board->playLan('w', 'd2d4'); $board->playLan('b', 'c5d4'); $board->playLan('w', 'f3d4'); $board->playLan('b', 'g8f6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 Chess\\Play\\LanPlay allows to play a bunch of LAN moves at once instead of one by one. use Chess\\Play\\LanPlay; $movetext = '1.e2e4 c7c5 2.g1f3 d7d6 3.d2d4 c5d4 4.f3d4 g8f6'; $board = (new LanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R \ud83c\udf89 And, it's easy! Recursive Annotation Variation (RAV) \u2728 RAV stands for Recursive Annotation Variation. It is an extension of the Standard Algebaric Notation (SAN) format that allows to annotate chess variations. This format is especially useful for tutorials, notable games, chess studies and so on. Comments are enclosed in curly brackets. Variations are enclosed in parentheses which can be nested recursively as many times as required with the trait that the previous move may need to be undone in order to play a variation. The example below describes how to play the Open Sicilian. 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2... Nc6) (2... e6) (2... d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Sicilian Defense. (2023, July 2). In Wikipedia. https://en.wikipedia.org/wiki/Sicilian_Defence The RAV reader above displays the variation levels in different shades of gray. It is a 2D scrollable HTML table where the main line is shown in a white background color. The deeper the level, the darker the background color. Chess\\Play\\RavPlay allows to play a RAV movetext. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) The FEN history is retrieved as an unidimensional array so it can be easily consumed by a frontend UI as shown in Figure 1. The movetext will also pass the validation if adding comments and NAGs. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 {enters the Sicilian Defense.} (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) This is how to obtain the validated movetext. $movetext = $ravPlay->ravMovetext->movetext; The filtered() method is to remove tabs and spaces. $movetext = $ravPlay->ravMovetext->filtered(); echo $movetext; 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2...Nc6) (2...e6) (2...d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. $movetext = $ravPlay->ravMovetext->filtered($comments = false); echo $movetext; 1.e4 c5 (2.Nf3 (2...Nc6) (2...e6) (2...d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6))) And finally, as opposed to the start position, a RAV movetext can also be started from a particular FEN position if passing a chess board object into the constructor of the class. As you can see in the example below, Chess\\FenToBoardFactory is used for this purpose. use Chess\\FenToBoardFactory; use Chess\\Play\\RavPlay; $movetext = \"1.Ra7 Kg8 2.Kg2 Kf8 3.Kf3 Ke8 4.Ke4 Kd8 5.Kd5 Kc8 (5...Ke8 6.Kd6 Kf8 7.Ke6 Kg8 8.Kf6 Kh8 9.Kg6 Kg8 10.Ra8#) 6.Kd6 Kb8 (6...Kd8 7.Ra8#) 7.Rc7 Ka8 8.Kc6 Kb8 9.Kb6 Ka8 10.Rc8#\"; $board = FenToBoardFactory::create('7k/8/8/8/8/8/8/R6K w - -'); $ravPlay = (new RavPlay($movetext, $board))->validate(); print_r($ravPlay->fen); Array ( [0] => 7k/8/8/8/8/8/8/R6K w - - [1] => 7k/R7/8/8/8/8/8/7K b - - [2] => 6k1/R7/8/8/8/8/8/7K w - - [3] => 6k1/R7/8/8/8/8/6K1/8 b - - [4] => 5k2/R7/8/8/8/8/6K1/8 w - - [5] => 5k2/R7/8/8/8/5K2/8/8 b - - [6] => 4k3/R7/8/8/8/5K2/8/8 w - - [7] => 4k3/R7/8/8/4K3/8/8/8 b - - [8] => 3k4/R7/8/8/4K3/8/8/8 w - - [9] => 3k4/R7/8/3K4/8/8/8/8 b - - [10] => 2k5/R7/8/3K4/8/8/8/8 w - - [11] => 4k3/R7/8/3K4/8/8/8/8 w - - [12] => 4k3/R7/3K4/8/8/8/8/8 b - - [13] => 5k2/R7/3K4/8/8/8/8/8 w - - [14] => 5k2/R7/4K3/8/8/8/8/8 b - - [15] => 6k1/R7/4K3/8/8/8/8/8 w - - [16] => 6k1/R7/5K2/8/8/8/8/8 b - - [17] => 7k/R7/5K2/8/8/8/8/8 w - - [18] => 7k/R7/6K1/8/8/8/8/8 b - - [19] => 6k1/R7/6K1/8/8/8/8/8 w - - [20] => R5k1/8/6K1/8/8/8/8/8 b - - [21] => 2k5/R7/3K4/8/8/8/8/8 b - - [22] => 1k6/R7/3K4/8/8/8/8/8 w - - [23] => 3k4/R7/3K4/8/8/8/8/8 w - - [24] => R2k4/8/3K4/8/8/8/8/8 b - - [25] => 1k6/2R5/3K4/8/8/8/8/8 b - - [26] => k7/2R5/3K4/8/8/8/8/8 w - - [27] => k7/2R5/2K5/8/8/8/8/8 b - - [28] => 1k6/2R5/2K5/8/8/8/8/8 w - - [29] => 1k6/2R5/1K6/8/8/8/8/8 b - - [30] => k7/2R5/1K6/8/8/8/8/8 w - - [31] => k1R5/8/1K6/8/8/8/8/8 b - - ) \ud83c\udf89 So this is amazing! That's all we need to read and write chess tutorials, guides and how-tos.","title":"Getting Started"},{"location":"getting-started/#getting-started","text":"\u2728 Some familiarity with chess terms and concepts is required but if you're new to chess this tutorial will guide you through how to easily create amazing apps with PHP Chess. Happy coding and learning! The Chess\\Variant\\Classical\\Board class is the easiest way to get started with PHP Chess. use Chess\\Variant\\Classical\\Board; $board = new Board(); If you have ever attended a chess tournament, you've probably noticed that each player writes down their move in PGN format on a piece of paper. PGN stands for Portable Game Notation and is a human-readable format that allows chess players to read and write chess games. When it comes to computer chess, though, a more appropriate machine-readable format called Long Algebraic Notation (LAN) is often used instead. Be that as it may, you're already set up to play classical chess either in PGN or LAN format. In PGN format: $board->play('w', 'e4'); In LAN format: $board->playLan('w', 'e2e4'); Every time a move is made, the state of the board changes. var_dump($board->toFen()); string(55) \"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3\" This is the chess position in Forsyth\u2013Edwards Notation (FEN) format after 1.e4. \ud83c\udf89 Congrats! 1.e4 is one of the best moves to start with.","title":"Getting Started"},{"location":"getting-started/#portable-game-notation-pgn","text":"\u2728 Portable Game Notation is a human-readable text format that allows chess players to read and write chess games. PGN is convenient for when reading chess games annotated by humans, for example, those ones available in online databases or published in chess websites. 1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.Nd2 Nxd2 8.Bxd2 Bd6 9.O-O h5 10.Qe1+ Kf8 11.Bb4 Qe7 12.Bxd6 Qxd6 13.Qd2 Re8 14.Rae1 Rh6 15.Qg5 c6 16.Rxe8+ Bxe8 17.Re1 Qf6 18.Qe3 Bd7 19.h3 h4 20.c4 dxc4 21.Bxc4 b5 22.Qa3+ Kg8 23.Qxa7 Qd8 24.Bb3 Rd6 25.Re4 Be6 26.Bxe6 Rxe6 27.Rxe6 fxe6 28.Qc5 Qa5 29.Qxc6 Qe1+ 30.Kh2 Qxf2 31.Qxe6+ Kh7 32.Qe4+ Kg8 33.b3 Qxa2 34.Qe8+ Kh7 35.Qxb5 Qf2 36.Qe5 Qb2 37.Qe4+ Kg8 38.Qd3 Qf2 39.Qc3 Qf4+ 40.Kg1 Kh7 41.Qd3+ g6 42.Qd1 Qe3+ 43.Kh1 g5 44.d5 g4 45.hxg4 h3 46.Qf3 1\u20130 World Chess Championship 2021. (2023, July 3). In Wikipedia. https://en.wikipedia.org/wiki/World_Chess_Championship_2021 As you may probably know, a chess opening is the group of initial moves of a chess game. This definition applies to classical chess, however, there is no such thing as a chess opening in either Capablanca chess or Chess960. Those two variants were originally conceived to minimize memorization, so when it comes to chess openings it is assumed that we're in the realms of classical chess. ECO, which stands for Encyclopaedia of Chess Openings, is a standard classification system for chess openings. Having said all that, let's now look at B54 which is the ECO code for \"Sicilian Defense: Modern Variations, Main Line\". use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $board->play('b', 'c5'); $board->play('w', 'Nf3'); $board->play('b', 'd6'); $board->play('w', 'd4'); $board->play('b', 'cxd4'); $board->play('w', 'Nxd4'); echo $board->toString(); r n b q k b n r p p . . p p p p . . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R The play() method in the Chess\\Variant\\Classical\\Board class allows to make moves in PGN format. So far so good, but if you're new to chess you may well play a wrong move in the Sicilian Defense: 4...Na6. $board->play('b', 'Na6'); echo $board->toString(); r . b q k b n r p p . . p p p p n . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R No worries! The undo() method comes to the rescue to take back a move. $board = $board->undo(); $board->play('b', 'Nf6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 The movetext() method is used to obtain the moves played in the game using Standard Algebraic Notation. Let's continue practicing chess openings. Now, what if you want to play a bunch of moves at once instead of one by one as in the previous example? Chess\\Play\\SanPlay allows to easily do so. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6'; $board = (new SanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R Please note that the validate() method will throw an exception if the movetext is not valid. Once the $board object is successfully created, the game can be continued from that particular position. $board->play('w', 'Bb5+'); echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . B . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K . . R Every time a move is made, the state of the board changes. Chess\\Variant\\Classical\\Board provides you with plenty of methods to interact with a chess board object. It is a quite common use case to query the board state. As discussed in the Home section, you may want to check out the corresponding tests for further details on how to use it. The unit tests are the best documentation. They contain hundreds of real examples on how to use the PHP Chess library. The isCheck() method will confirm that the white king is in check after 5.Bb5+ while isMate() will confirm that it has not been mated. var_dump($board->isCheck()); bool(true) var_dump($board->isMate()); bool(false) Similarly, you may want to know if the current position is a draw. The isStalemate() method is to find out if the current position is a stalemate while isFivefoldRepetition() will confirm if the game is drawn because of a fivefold repetition. var_dump($board->isStalemate()); bool(false) var_dump($board->isFivefoldRepetition()); bool(false) Text comments in curly brackets can optionally be used in SAN movetexts as well as Numeric Annotation Glyphs . The example below shows how Chess\\Play\\SanPlay is used to validate a SAN movetext that contains NAGs. Remember, the validate() method will throw an exception if the movetext is not valid. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113'; $sanPlay = (new SanPlay($movetext))->validate(); echo $sanPlay->sanMovetext->filtered(); 1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113 Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. echo $sanPlay->sanMovetext->filtered($comments = true, $nags = false); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 \ud83c\udf89 Next, let's learn how to process chess moves from a graphical user interface.","title":"Portable Game Notation (PGN)"},{"location":"getting-started/#long-algebraic-notation-lan","text":"\u2728 The UCI protocol enables chess engines to communicate with user interfaces (UI) using Long Algebraic Notation (LAN) for moves. use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->playLan('w', 'e2e4'); $board->playLan('b', 'c7c5'); $board->playLan('w', 'g1f3'); $board->playLan('b', 'd7d6'); $board->playLan('w', 'd2d4'); $board->playLan('b', 'c5d4'); $board->playLan('w', 'f3d4'); $board->playLan('b', 'g8f6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 Chess\\Play\\LanPlay allows to play a bunch of LAN moves at once instead of one by one. use Chess\\Play\\LanPlay; $movetext = '1.e2e4 c7c5 2.g1f3 d7d6 3.d2d4 c5d4 4.f3d4 g8f6'; $board = (new LanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R \ud83c\udf89 And, it's easy!","title":"Long Algebraic Notation (LAN)"},{"location":"getting-started/#recursive-annotation-variation-rav","text":"\u2728 RAV stands for Recursive Annotation Variation. It is an extension of the Standard Algebaric Notation (SAN) format that allows to annotate chess variations. This format is especially useful for tutorials, notable games, chess studies and so on. Comments are enclosed in curly brackets. Variations are enclosed in parentheses which can be nested recursively as many times as required with the trait that the previous move may need to be undone in order to play a variation. The example below describes how to play the Open Sicilian. 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2... Nc6) (2... e6) (2... d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Sicilian Defense. (2023, July 2). In Wikipedia. https://en.wikipedia.org/wiki/Sicilian_Defence The RAV reader above displays the variation levels in different shades of gray. It is a 2D scrollable HTML table where the main line is shown in a white background color. The deeper the level, the darker the background color. Chess\\Play\\RavPlay allows to play a RAV movetext. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) The FEN history is retrieved as an unidimensional array so it can be easily consumed by a frontend UI as shown in Figure 1. The movetext will also pass the validation if adding comments and NAGs. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 {enters the Sicilian Defense.} (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) This is how to obtain the validated movetext. $movetext = $ravPlay->ravMovetext->movetext; The filtered() method is to remove tabs and spaces. $movetext = $ravPlay->ravMovetext->filtered(); echo $movetext; 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2...Nc6) (2...e6) (2...d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. $movetext = $ravPlay->ravMovetext->filtered($comments = false); echo $movetext; 1.e4 c5 (2.Nf3 (2...Nc6) (2...e6) (2...d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6))) And finally, as opposed to the start position, a RAV movetext can also be started from a particular FEN position if passing a chess board object into the constructor of the class. As you can see in the example below, Chess\\FenToBoardFactory is used for this purpose. use Chess\\FenToBoardFactory; use Chess\\Play\\RavPlay; $movetext = \"1.Ra7 Kg8 2.Kg2 Kf8 3.Kf3 Ke8 4.Ke4 Kd8 5.Kd5 Kc8 (5...Ke8 6.Kd6 Kf8 7.Ke6 Kg8 8.Kf6 Kh8 9.Kg6 Kg8 10.Ra8#) 6.Kd6 Kb8 (6...Kd8 7.Ra8#) 7.Rc7 Ka8 8.Kc6 Kb8 9.Kb6 Ka8 10.Rc8#\"; $board = FenToBoardFactory::create('7k/8/8/8/8/8/8/R6K w - -'); $ravPlay = (new RavPlay($movetext, $board))->validate(); print_r($ravPlay->fen); Array ( [0] => 7k/8/8/8/8/8/8/R6K w - - [1] => 7k/R7/8/8/8/8/8/7K b - - [2] => 6k1/R7/8/8/8/8/8/7K w - - [3] => 6k1/R7/8/8/8/8/6K1/8 b - - [4] => 5k2/R7/8/8/8/8/6K1/8 w - - [5] => 5k2/R7/8/8/8/5K2/8/8 b - - [6] => 4k3/R7/8/8/8/5K2/8/8 w - - [7] => 4k3/R7/8/8/4K3/8/8/8 b - - [8] => 3k4/R7/8/8/4K3/8/8/8 w - - [9] => 3k4/R7/8/3K4/8/8/8/8 b - - [10] => 2k5/R7/8/3K4/8/8/8/8 w - - [11] => 4k3/R7/8/3K4/8/8/8/8 w - - [12] => 4k3/R7/3K4/8/8/8/8/8 b - - [13] => 5k2/R7/3K4/8/8/8/8/8 w - - [14] => 5k2/R7/4K3/8/8/8/8/8 b - - [15] => 6k1/R7/4K3/8/8/8/8/8 w - - [16] => 6k1/R7/5K2/8/8/8/8/8 b - - [17] => 7k/R7/5K2/8/8/8/8/8 w - - [18] => 7k/R7/6K1/8/8/8/8/8 b - - [19] => 6k1/R7/6K1/8/8/8/8/8 w - - [20] => R5k1/8/6K1/8/8/8/8/8 b - - [21] => 2k5/R7/3K4/8/8/8/8/8 b - - [22] => 1k6/R7/3K4/8/8/8/8/8 w - - [23] => 3k4/R7/3K4/8/8/8/8/8 w - - [24] => R2k4/8/3K4/8/8/8/8/8 b - - [25] => 1k6/2R5/3K4/8/8/8/8/8 b - - [26] => k7/2R5/3K4/8/8/8/8/8 w - - [27] => k7/2R5/2K5/8/8/8/8/8 b - - [28] => 1k6/2R5/2K5/8/8/8/8/8 w - - [29] => 1k6/2R5/1K6/8/8/8/8/8 b - - [30] => k7/2R5/1K6/8/8/8/8/8 w - - [31] => k1R5/8/1K6/8/8/8/8/8 b - - ) \ud83c\udf89 So this is amazing! That's all we need to read and write chess tutorials, guides and how-tos.","title":"Recursive Annotation Variation (RAV)"},{"location":"heuristics/","text":"Heuristics \u2728 If you ask a chess pro why a chess move is good, they'll probably give you a bunch of reasons, many of them intuitive, about why they made that decision. It is important to develop your pieces in the opening while trying to control the center of the board at the same time. Castling is an excellent move as long as the king gets safe. Then, in the middlegame space becomes an advantage. And if a complex position can be simplified when you have an advantage, then so much the better. The pawn structure could determine the endgame. The list of reasons goes on and on. The mathematician Claude Shannon came to the conclusion that there are more chess moves than atoms in the universe. The game is complex and you need to learn how to make decisions to play chess like a pro. Since no human can calculate more than, let's say 30 moves ahead, it's all about thinking in terms of heuristics. Heuristics are quick, mental shortcuts that we humans use to make decisions and solve problems in our daily lives. While far from being perfect, heuristics are approximations that help manage cognitive load. Listed below are the chess heuristics implemented in PHP Chess. Heuristic Description Evaluation Absolute fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork involving the enemy king is an absolute fork. Chess\\Eval\\AbsoluteForkEval Absolute pin A tactic that occurs when a piece is shielding the king, so it cannot move out of the line of attack because the king would be put in check. Chess\\Eval\\AbsolutePinEval Absolute skewer A tactic in which the enemy king is involved. The king is in check, and it has to move out of danger exposing a more valuable piece to capture. Only line pieces (bishops, rooks and queens) can skewer. Chess\\Eval\\AbsoluteSkewerEval Advanced pawn A pawn that is on the fifth rank or higher. Chess\\Eval\\AdvancedPawnEval Attack If a piece is under threat of being attacked, it means it could be taken after a sequence of captures resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under attack has an advantage. Chess\\Eval\\AttackEval Backward pawn The last pawn protecting other pawns in its chain. It is considered a weakness because it cannot advance safely. Chess\\Eval\\BackwardPawnEval Bad bishop A bishop that is on the same color as most of own pawns. Chess\\Eval\\BadBishopEval Bishop outpost A bishop on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for another piece. Chess\\Eval\\BishopOutpostEval Bishop pair The player with both bishops may definitely have an advantage, especially in the endgame. Furthermore, two bishops can deliver checkmate. Chess\\Eval\\BishopPairEval Center It is advantageous to control the central squares as well as to place a piece in the center. Chess\\Eval\\CenterEval Checkability Having a king that can be checked is usually considered a disadvantage, and vice versa, it is considered advantageous to have a king that cannot be checked. A checkable king is vulnerable to forcing moves. Chess\\Eval\\CheckabilityEval Connectivity The connectivity of the pieces measures how loosely the pieces are. Chess\\Eval\\ConnectivityEval Defense This heuristic evaluates the defensive strength of each side by analyzing how the removal of attacking pieces would affect the opponent's protection. A higher score indicates a stronger defensive position. Chess\\Eval\\DefenseEval Diagonal opposition The same as direct opposition, but the two kings are apart from each other diagonally. Chess\\Eval\\DiagonalOppositionEval Direct opposition A position in which the kings are facing each other being two squares apart on the same rank or file. In this situation, the player not having to move is said to have the opposition. Chess\\Eval\\DirectOppositionEval Discovered check A discovered check occurs when the opponent's king can be checked by moving a piece out of the way of another. Chess\\Eval\\DiscoveredCheckEval Doubled pawn A pawn is doubled if there are two pawns of the same color on the same file. Chess\\Eval\\DoubledPawnEval Far-advanced pawn A pawn that is threatening to promote. Chess\\Eval\\FarAdvancedPawnEval Flight square The safe squares to which the king can move if it is threatened. Chess\\Eval\\FlightSquareEval Isolated pawn A pawn without friendly pawns on the adjacent files. Since it cannot be defended by other pawns it is considered a weakness. Chess\\Eval\\IsolatedPawnEval King safety An unsafe king leads to uncertainty. The probability of unexpected, forced moves will increase as the opponent's pieces get closer to it. Chess\\Eval\\KingSafetyEval Knight outpost A knight on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for a bishop. Chess\\Eval\\KnightOutpostEval Material The player with the most material points has an advantage. The relative values of the pieces are assigned this way: 1 point to a pawn, 3.2 points to a knight, 3.33 points to a bishop, 5.1 points to a rook and 8.8 points to a queen. Chess\\Eval\\MaterialEval Overloading A piece that is overloaded with defensive tasks is vulnerable because it can be deflected, meaning it could be forced to leave the square it occupies, typically resulting in an advantage for the opponent. Chess\\Eval\\OverloadingEval Passed pawn A pawn with no opposing pawns on either the same file or adjacent files to prevent it from being promoted. Chess\\Eval\\PassedPawnEval Pressure This is a measure of the number of squares targeted by each player that require special attention. It often indicates the step prior to an attack. The player with the greater number of them has an advantage. Chess\\Eval\\PressureEval Protection If a piece is unprotected, it means that there are no other pieces defending it, and therefore it can be taken for free resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under protection has an advantage. Chess\\Eval\\ProtectionEval Relative fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork not involving the enemy king is a relative fork. Chess\\Eval\\RelativeForkEval Relative pin A tactic that occurs when a piece is shielding a more valuable piece, so if it moves out of the line of attack the more valuable piece can be captured resulting in a material gain. Chess\\Eval\\RelativePinEval Space This is a measure of the number of squares controlled by each player. Chess\\Eval\\SpaceEval Square outpost A square protected by a pawn that cannot be attacked by an opponent's pawn. Chess\\Eval\\SqOutpostEval The evaluation features are used in several classes. Evaluate a Chess Position Chess\\EvalArray allows to transform a FEN position to a normalized array of values between -1 and +1. -1 is the best possible evaluation for Black and +1 the best possible evaluation for White. Both forces being set to 0 means they're balanced. use Chess\\EvalArray; use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $fen = 'rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq -'; $board = FenToBoardFactory::create($fen); $result = [ 'names' => $f->names(), 'normd' => EvalArray::normalization($f, $board), ]; print_r($result); Array ( [names] => Array ( [0] => Material [1] => Center [2] => Connectivity [3] => Space [4] => Pressure [5] => King safety [6] => Protection [7] => Discovered check [8] => Doubled pawn [9] => Passed pawn [10] => Advanced pawn [11] => Far-advanced pawn [12] => Isolated pawn [13] => Backward pawn [14] => Defense [15] => Absolute skewer [16] => Absolute pin [17] => Relative pin [18] => Absolute fork [19] => Relative fork [20] => Outpost square [21] => Knight outpost [22] => Bishop outpost [23] => Bishop pair [24] => Bad bishop [25] => Diagonal opposition [26] => Direct opposition [27] => Overloading [28] => Back-rank threat [29] => Flight square [30] => Attack [31] => Checkability ) [normd] => Array ( [0] => 0 [1] => 1 [2] => -1 [3] => 0.24 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => 0 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => 0 [30] => 0 [31] => 0 ) ) This data structure is used to estimate who may be better without considering checkmate. Please note that a heuristic evaluation is not the same thing as a chess calculation. Heuristic evaluations are often correct but may fail because they are based on probabilities. Steinitz Evaluation As chess champion William Steinitz pointed out, a strong position can be created by accumulating small advantages. The relative value of the position without considering checkmate is obtained by counting the advantages in the evaluation array. $steinitz = EvalArray::steinitz($f, $board); echo $steinitz; 1 In this example, White is better than Black because the value obtained is a positive number. One evaluation feature is favoring White. The Steinitz evaluation alone has proven to be quite accurate as a relative estimate for chess positions in a way that is easy for human players to understand and to learn. However, it can be complemented with other statistical measures such as the mean, median, mode, and standard deviation of the evaluation array without counting the zeros. Mean The mean represents the center of the evaluation array being intermediate to the extreme values. $mean = EvalArray::mean($f, $board); echo $mean; 0.08 Median The median is the value in the middle of the evaluation array. $median = EvalArray::median($f, $board); echo $median; 0.24 Mode The mode is the value that appears most frequently in the evaluation array. $mode = EvalArray::mode($f, $board); echo $mode; NULL In this example, no mode exists since there are no repeating numbers in the evaluation array. Standard Deviation The standard deviation is a measure of how spread out the evaluation array is. $sd = EvalArray::sd($f, $board); echo $sd; 0.8243 Plot the Oscillations of a Game Given a PGN movetext in SAN format, Chess\\SanPlotter returns the oscillations of an evaluation feature in the time domain. use Chess\\SanPlotter; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $name = 'Space'; $movetext = '1.e4 d5 2.exd5 Qxd5'; $time = (new SanPlotter($f, $movetext, $name))->time; print_r($time); Array ( [0] => 0 [1] => 1 [2] => 0.25 [3] => 0.5 [4] => -1 ) The data is plotted in a way that is easy for chess players to understand and learn. Extract Chess Data Given a PGN movetext in SAN format, Chess\\SanExtractor returns the oscillations of all evaluation features for data analysis purposes like the following example. use Chess\\SanExtractor; use Chess\\Function\\CompleteFunction; use Chess\\Variant\\Classical\\Board; $f = new CompleteFunction(); $board = new Board(); $movetext = '1.e4 d5 2.exd5 Qxd5'; Evaluation Array This is how component number four, which is to say the normalization of the fourth evaluation array, is obtained from the example above. $eval = SanExtractor::eval($f, $board, $movetext); print_r($eval[4]); Array ( [0] => 0 [1] => -1 [2] => 1 [3] => -0.24 [4] => -0.07 [5] => -0.02 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => -0.11 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => -0.02 [30] => 0 [31] => 0 ) The evaluation array can be plotted in a way that is easy for chess players to understand and learn. Mean $mean = SanExtractor::mean($f, $board, $movetext); print_r($mean); ( [0] => 0 [1] => 0.185 [2] => -0.16 [3] => -0.315 [4] => -0.0657 ) Standard Deviation $sd = SanExtractor::sd($f, $board, $movetext); print_r($sd); Array ( [0] => 0 [1] => 0.7591 [2] => -0.8552 [3] => -0.7274 [4] => -0.5406 ) \ud83c\udf89 So chess positions and games can be plotted on charts and processed with machine learning techniques. Become a better player by extracting knowledge from games with the help of Data Mining tools.","title":"Heuristics"},{"location":"heuristics/#heuristics","text":"\u2728 If you ask a chess pro why a chess move is good, they'll probably give you a bunch of reasons, many of them intuitive, about why they made that decision. It is important to develop your pieces in the opening while trying to control the center of the board at the same time. Castling is an excellent move as long as the king gets safe. Then, in the middlegame space becomes an advantage. And if a complex position can be simplified when you have an advantage, then so much the better. The pawn structure could determine the endgame. The list of reasons goes on and on. The mathematician Claude Shannon came to the conclusion that there are more chess moves than atoms in the universe. The game is complex and you need to learn how to make decisions to play chess like a pro. Since no human can calculate more than, let's say 30 moves ahead, it's all about thinking in terms of heuristics. Heuristics are quick, mental shortcuts that we humans use to make decisions and solve problems in our daily lives. While far from being perfect, heuristics are approximations that help manage cognitive load. Listed below are the chess heuristics implemented in PHP Chess. Heuristic Description Evaluation Absolute fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork involving the enemy king is an absolute fork. Chess\\Eval\\AbsoluteForkEval Absolute pin A tactic that occurs when a piece is shielding the king, so it cannot move out of the line of attack because the king would be put in check. Chess\\Eval\\AbsolutePinEval Absolute skewer A tactic in which the enemy king is involved. The king is in check, and it has to move out of danger exposing a more valuable piece to capture. Only line pieces (bishops, rooks and queens) can skewer. Chess\\Eval\\AbsoluteSkewerEval Advanced pawn A pawn that is on the fifth rank or higher. Chess\\Eval\\AdvancedPawnEval Attack If a piece is under threat of being attacked, it means it could be taken after a sequence of captures resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under attack has an advantage. Chess\\Eval\\AttackEval Backward pawn The last pawn protecting other pawns in its chain. It is considered a weakness because it cannot advance safely. Chess\\Eval\\BackwardPawnEval Bad bishop A bishop that is on the same color as most of own pawns. Chess\\Eval\\BadBishopEval Bishop outpost A bishop on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for another piece. Chess\\Eval\\BishopOutpostEval Bishop pair The player with both bishops may definitely have an advantage, especially in the endgame. Furthermore, two bishops can deliver checkmate. Chess\\Eval\\BishopPairEval Center It is advantageous to control the central squares as well as to place a piece in the center. Chess\\Eval\\CenterEval Checkability Having a king that can be checked is usually considered a disadvantage, and vice versa, it is considered advantageous to have a king that cannot be checked. A checkable king is vulnerable to forcing moves. Chess\\Eval\\CheckabilityEval Connectivity The connectivity of the pieces measures how loosely the pieces are. Chess\\Eval\\ConnectivityEval Defense This heuristic evaluates the defensive strength of each side by analyzing how the removal of attacking pieces would affect the opponent's protection. A higher score indicates a stronger defensive position. Chess\\Eval\\DefenseEval Diagonal opposition The same as direct opposition, but the two kings are apart from each other diagonally. Chess\\Eval\\DiagonalOppositionEval Direct opposition A position in which the kings are facing each other being two squares apart on the same rank or file. In this situation, the player not having to move is said to have the opposition. Chess\\Eval\\DirectOppositionEval Discovered check A discovered check occurs when the opponent's king can be checked by moving a piece out of the way of another. Chess\\Eval\\DiscoveredCheckEval Doubled pawn A pawn is doubled if there are two pawns of the same color on the same file. Chess\\Eval\\DoubledPawnEval Far-advanced pawn A pawn that is threatening to promote. Chess\\Eval\\FarAdvancedPawnEval Flight square The safe squares to which the king can move if it is threatened. Chess\\Eval\\FlightSquareEval Isolated pawn A pawn without friendly pawns on the adjacent files. Since it cannot be defended by other pawns it is considered a weakness. Chess\\Eval\\IsolatedPawnEval King safety An unsafe king leads to uncertainty. The probability of unexpected, forced moves will increase as the opponent's pieces get closer to it. Chess\\Eval\\KingSafetyEval Knight outpost A knight on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for a bishop. Chess\\Eval\\KnightOutpostEval Material The player with the most material points has an advantage. The relative values of the pieces are assigned this way: 1 point to a pawn, 3.2 points to a knight, 3.33 points to a bishop, 5.1 points to a rook and 8.8 points to a queen. Chess\\Eval\\MaterialEval Overloading A piece that is overloaded with defensive tasks is vulnerable because it can be deflected, meaning it could be forced to leave the square it occupies, typically resulting in an advantage for the opponent. Chess\\Eval\\OverloadingEval Passed pawn A pawn with no opposing pawns on either the same file or adjacent files to prevent it from being promoted. Chess\\Eval\\PassedPawnEval Pressure This is a measure of the number of squares targeted by each player that require special attention. It often indicates the step prior to an attack. The player with the greater number of them has an advantage. Chess\\Eval\\PressureEval Protection If a piece is unprotected, it means that there are no other pieces defending it, and therefore it can be taken for free resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under protection has an advantage. Chess\\Eval\\ProtectionEval Relative fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork not involving the enemy king is a relative fork. Chess\\Eval\\RelativeForkEval Relative pin A tactic that occurs when a piece is shielding a more valuable piece, so if it moves out of the line of attack the more valuable piece can be captured resulting in a material gain. Chess\\Eval\\RelativePinEval Space This is a measure of the number of squares controlled by each player. Chess\\Eval\\SpaceEval Square outpost A square protected by a pawn that cannot be attacked by an opponent's pawn. Chess\\Eval\\SqOutpostEval The evaluation features are used in several classes.","title":"Heuristics"},{"location":"heuristics/#evaluate-a-chess-position","text":"Chess\\EvalArray allows to transform a FEN position to a normalized array of values between -1 and +1. -1 is the best possible evaluation for Black and +1 the best possible evaluation for White. Both forces being set to 0 means they're balanced. use Chess\\EvalArray; use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $fen = 'rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq -'; $board = FenToBoardFactory::create($fen); $result = [ 'names' => $f->names(), 'normd' => EvalArray::normalization($f, $board), ]; print_r($result); Array ( [names] => Array ( [0] => Material [1] => Center [2] => Connectivity [3] => Space [4] => Pressure [5] => King safety [6] => Protection [7] => Discovered check [8] => Doubled pawn [9] => Passed pawn [10] => Advanced pawn [11] => Far-advanced pawn [12] => Isolated pawn [13] => Backward pawn [14] => Defense [15] => Absolute skewer [16] => Absolute pin [17] => Relative pin [18] => Absolute fork [19] => Relative fork [20] => Outpost square [21] => Knight outpost [22] => Bishop outpost [23] => Bishop pair [24] => Bad bishop [25] => Diagonal opposition [26] => Direct opposition [27] => Overloading [28] => Back-rank threat [29] => Flight square [30] => Attack [31] => Checkability ) [normd] => Array ( [0] => 0 [1] => 1 [2] => -1 [3] => 0.24 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => 0 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => 0 [30] => 0 [31] => 0 ) ) This data structure is used to estimate who may be better without considering checkmate. Please note that a heuristic evaluation is not the same thing as a chess calculation. Heuristic evaluations are often correct but may fail because they are based on probabilities.","title":"Evaluate a Chess Position"},{"location":"heuristics/#steinitz-evaluation","text":"As chess champion William Steinitz pointed out, a strong position can be created by accumulating small advantages. The relative value of the position without considering checkmate is obtained by counting the advantages in the evaluation array. $steinitz = EvalArray::steinitz($f, $board); echo $steinitz; 1 In this example, White is better than Black because the value obtained is a positive number. One evaluation feature is favoring White. The Steinitz evaluation alone has proven to be quite accurate as a relative estimate for chess positions in a way that is easy for human players to understand and to learn. However, it can be complemented with other statistical measures such as the mean, median, mode, and standard deviation of the evaluation array without counting the zeros.","title":"Steinitz Evaluation"},{"location":"heuristics/#mean","text":"The mean represents the center of the evaluation array being intermediate to the extreme values. $mean = EvalArray::mean($f, $board); echo $mean; 0.08","title":"Mean"},{"location":"heuristics/#median","text":"The median is the value in the middle of the evaluation array. $median = EvalArray::median($f, $board); echo $median; 0.24","title":"Median"},{"location":"heuristics/#mode","text":"The mode is the value that appears most frequently in the evaluation array. $mode = EvalArray::mode($f, $board); echo $mode; NULL In this example, no mode exists since there are no repeating numbers in the evaluation array.","title":"Mode"},{"location":"heuristics/#standard-deviation","text":"The standard deviation is a measure of how spread out the evaluation array is. $sd = EvalArray::sd($f, $board); echo $sd; 0.8243","title":"Standard Deviation"},{"location":"heuristics/#plot-the-oscillations-of-a-game","text":"Given a PGN movetext in SAN format, Chess\\SanPlotter returns the oscillations of an evaluation feature in the time domain. use Chess\\SanPlotter; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $name = 'Space'; $movetext = '1.e4 d5 2.exd5 Qxd5'; $time = (new SanPlotter($f, $movetext, $name))->time; print_r($time); Array ( [0] => 0 [1] => 1 [2] => 0.25 [3] => 0.5 [4] => -1 ) The data is plotted in a way that is easy for chess players to understand and learn.","title":"Plot the Oscillations of a Game"},{"location":"heuristics/#extract-chess-data","text":"Given a PGN movetext in SAN format, Chess\\SanExtractor returns the oscillations of all evaluation features for data analysis purposes like the following example. use Chess\\SanExtractor; use Chess\\Function\\CompleteFunction; use Chess\\Variant\\Classical\\Board; $f = new CompleteFunction(); $board = new Board(); $movetext = '1.e4 d5 2.exd5 Qxd5';","title":"Extract Chess Data"},{"location":"heuristics/#evaluation-array","text":"This is how component number four, which is to say the normalization of the fourth evaluation array, is obtained from the example above. $eval = SanExtractor::eval($f, $board, $movetext); print_r($eval[4]); Array ( [0] => 0 [1] => -1 [2] => 1 [3] => -0.24 [4] => -0.07 [5] => -0.02 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => -0.11 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => -0.02 [30] => 0 [31] => 0 ) The evaluation array can be plotted in a way that is easy for chess players to understand and learn.","title":"Evaluation Array"},{"location":"heuristics/#mean_1","text":"$mean = SanExtractor::mean($f, $board, $movetext); print_r($mean); ( [0] => 0 [1] => 0.185 [2] => -0.16 [3] => -0.315 [4] => -0.0657 )","title":"Mean"},{"location":"heuristics/#standard-deviation_1","text":"$sd = SanExtractor::sd($f, $board, $movetext); print_r($sd); Array ( [0] => 0 [1] => 0.7591 [2] => -0.8552 [3] => -0.7274 [4] => -0.5406 ) \ud83c\udf89 So chess positions and games can be plotted on charts and processed with machine learning techniques. Become a better player by extracting knowledge from games with the help of Data Mining tools.","title":"Standard Deviation"},{"location":"play-chess/","text":"Play Chess Play Randomly \u2728 Sometimes you want to play a random game of chess. You could loop 50 times and play a move by instantiating the Chess\\Computer\\RandomMove class like in the example below. use Chess\\Computer\\RandomMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); for ($i = 0; $i < 50; $i++) { if ($move = (new RandomMove($board))->move()) { $board->play($board->turn, $move['pgn']); } } echo $board->movetext(); 1.e4 Nc6 2.Qf3 g6 3.b3 Rb8 4.Bb5 Nh6 5.Ke2 Na5 6.c3 Ng4 7.d3 h6 8.h4 Ra8 9.Kd1 b6 10.Ba4 h5 11.b4 Rh7 12.Bc2 Rh8 13.Ke1 a6 14.Kd1 Nb3 15.d4 Na5 16.g3 c6 17.Ne2 Ne5 18.Nf4 d6 19.Nxg6 Kd7 20.b5 Qe8 21.Na3 e6 22.Bd3 Rb8 23.dxe5 dxe5 24.Bb2 Rg8 25.Qg4 Ra8 The result obtained is a 24 move game since a move is considered to be completed after both players have played a turn. Play Like a Grandmaster \u2728 The players.json file in the Chess Server contains thousands of games by titled FIDE players. This file can be generated with the command line tools available in the Chess Data repo. Chess\\Computer\\GrandmasterMove figures out the next move to be made based on the players.json file that is passed to its constructor. use Chess\\Computer\\GrandmasterMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $gmMove = (new GrandmasterMove(__DIR__.'/../data/json/players.json'))->move($board); print_r($gmMove); Array ( [pgn] => c5 [game] => Array ( [Event] => Tilburg [Site] => Tilburg [Date] => 1993.??.?? [White] => Morozevich, Alexander [Black] => Adams, Michael [Result] => 1-0 [ECO] => B23 [movetext] => 1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 Nd4 6.Nxd4 cxd4 7.Ne2 a6 8.Ba4 b5 9.Bb3 e6 10.O-O Ne7 11.d3 O-O 12.Qe1 f5 13.Bd2 Nc6 14.Kh1 Bb7 15.Ng1 h6 16.Nf3 Kh7 17.Qg3 Qe7 18.Rae1 a5 19.a3 Rab8 20.Nh4 Qf7 21.Qh3 Ba8 22.Rf3 a4 23.Ba2 b4 24.Bc1 b3 25.cxb3 axb3 26.Bb1 d6 27.Bd2 Kg8 28.g4 Ne7 29.gxf5 gxf5 30.Rg3 Kh7 31.Nf3 Bf6 32.Ng5+ Bxg5 33.fxg5 Ng6 34.Qxh6+ Kg8 35.h4 f4 36.Rh3 Rb7 37.h5 Ne5 38.Rg1 Rc7 39.Rh4 Qe8 40.g6 ) ) \ud83c\udf89 Let's now put our knowledge of chess openings to the test. Play Computer \u2728 The Universal Chess Interface (UCI) is an open communication protocol that enables chess engines to communicate with user interfaces. PHP Chess provides the Chess\\UciEngine\\UciEngine class representing an UCI engine. To follow this tutorial make sure to install Stockfish if you haven't already. sudo apt-get install stockfish Then, you are set up to play chess against the computer as described in the following example. use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $limit = new Limit(); $limit->depth = 3; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 9); $analysis = $stockfish->analysis($board, $limit); $board->playLan('b', $analysis['bestmove']); echo $board->movetext(); 1.e4 Nf6 You may want to play against Stockfish starting from a particular FEN with the help of Chess\\FenToBoardFactory . use Chess\\FenToBoardFactory; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $board = FenToBoardFactory::create('4k2r/pp1b1pp1/8/3pPp1p/P2P1P2/1P3N2/1qr3PP/R3QR1K w k -'); $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.Rb1 The FEN is converted to a chess board object as described in the Format Converters section. Then Stockfish's depth limit is set to 12 and the skill level to 20 . The same thing goes to starting a game from a particular SAN movetext. As you can see in the example below, Chess\\Play\\SanPlay is used for this purpose. use Chess\\Play\\SanPlay; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = (new SanPlay($movetext))->validate()->board; $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 \ud83c\udf89 Can you beat the computer? Keep it up!","title":"Play Chess"},{"location":"play-chess/#play-chess","text":"","title":"Play Chess"},{"location":"play-chess/#play-randomly","text":"\u2728 Sometimes you want to play a random game of chess. You could loop 50 times and play a move by instantiating the Chess\\Computer\\RandomMove class like in the example below. use Chess\\Computer\\RandomMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); for ($i = 0; $i < 50; $i++) { if ($move = (new RandomMove($board))->move()) { $board->play($board->turn, $move['pgn']); } } echo $board->movetext(); 1.e4 Nc6 2.Qf3 g6 3.b3 Rb8 4.Bb5 Nh6 5.Ke2 Na5 6.c3 Ng4 7.d3 h6 8.h4 Ra8 9.Kd1 b6 10.Ba4 h5 11.b4 Rh7 12.Bc2 Rh8 13.Ke1 a6 14.Kd1 Nb3 15.d4 Na5 16.g3 c6 17.Ne2 Ne5 18.Nf4 d6 19.Nxg6 Kd7 20.b5 Qe8 21.Na3 e6 22.Bd3 Rb8 23.dxe5 dxe5 24.Bb2 Rg8 25.Qg4 Ra8 The result obtained is a 24 move game since a move is considered to be completed after both players have played a turn.","title":"Play Randomly"},{"location":"play-chess/#play-like-a-grandmaster","text":"\u2728 The players.json file in the Chess Server contains thousands of games by titled FIDE players. This file can be generated with the command line tools available in the Chess Data repo. Chess\\Computer\\GrandmasterMove figures out the next move to be made based on the players.json file that is passed to its constructor. use Chess\\Computer\\GrandmasterMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $gmMove = (new GrandmasterMove(__DIR__.'/../data/json/players.json'))->move($board); print_r($gmMove); Array ( [pgn] => c5 [game] => Array ( [Event] => Tilburg [Site] => Tilburg [Date] => 1993.??.?? [White] => Morozevich, Alexander [Black] => Adams, Michael [Result] => 1-0 [ECO] => B23 [movetext] => 1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 Nd4 6.Nxd4 cxd4 7.Ne2 a6 8.Ba4 b5 9.Bb3 e6 10.O-O Ne7 11.d3 O-O 12.Qe1 f5 13.Bd2 Nc6 14.Kh1 Bb7 15.Ng1 h6 16.Nf3 Kh7 17.Qg3 Qe7 18.Rae1 a5 19.a3 Rab8 20.Nh4 Qf7 21.Qh3 Ba8 22.Rf3 a4 23.Ba2 b4 24.Bc1 b3 25.cxb3 axb3 26.Bb1 d6 27.Bd2 Kg8 28.g4 Ne7 29.gxf5 gxf5 30.Rg3 Kh7 31.Nf3 Bf6 32.Ng5+ Bxg5 33.fxg5 Ng6 34.Qxh6+ Kg8 35.h4 f4 36.Rh3 Rb7 37.h5 Ne5 38.Rg1 Rc7 39.Rh4 Qe8 40.g6 ) ) \ud83c\udf89 Let's now put our knowledge of chess openings to the test.","title":"Play Like a Grandmaster"},{"location":"play-chess/#play-computer","text":"\u2728 The Universal Chess Interface (UCI) is an open communication protocol that enables chess engines to communicate with user interfaces. PHP Chess provides the Chess\\UciEngine\\UciEngine class representing an UCI engine. To follow this tutorial make sure to install Stockfish if you haven't already. sudo apt-get install stockfish Then, you are set up to play chess against the computer as described in the following example. use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $limit = new Limit(); $limit->depth = 3; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 9); $analysis = $stockfish->analysis($board, $limit); $board->playLan('b', $analysis['bestmove']); echo $board->movetext(); 1.e4 Nf6 You may want to play against Stockfish starting from a particular FEN with the help of Chess\\FenToBoardFactory . use Chess\\FenToBoardFactory; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $board = FenToBoardFactory::create('4k2r/pp1b1pp1/8/3pPp1p/P2P1P2/1P3N2/1qr3PP/R3QR1K w k -'); $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.Rb1 The FEN is converted to a chess board object as described in the Format Converters section. Then Stockfish's depth limit is set to 12 and the skill level to 20 . The same thing goes to starting a game from a particular SAN movetext. As you can see in the example below, Chess\\Play\\SanPlay is used for this purpose. use Chess\\Play\\SanPlay; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = (new SanPlay($movetext))->validate()->board; $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 \ud83c\udf89 Can you beat the computer? Keep it up!","title":"Play Computer"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"PHP Chess A chess library for PHP offering move validation, common formats, multiple variants, UCI engine support, explanation of chess positions, image recognition and knowledge extraction from games. Installation Requirements PHP >= 8.1 Stockfish >= 15.1 Composer installation composer require chesslablab/php-chess Features Formats Supported Chess moves in LAN and PGN formats. Movetext processing in LAN, SAN and RAV formats. NAG support for SAN and RAV movetexts. UCI protocol. Chess board to PNG and JPG image. PNG and JPG image to FEN. FEN to chess board. Chess board to MP4 video. Acronym Description LAN Long Algebraic Notation PGN Portable Game Notation SAN Standard Algebraic Notation RAV Recursive Annotation Variation NAG Numeric Annotation Glyphs UCI Universal Chess Interface FEN Forsyth-Edwards Notation Chess Variants Multiple variants are supported with the default one being classical chess. Variant Chessboard Capablanca Chess\\Variant\\Capablanca\\Board Capablanca-Fischer Chess\\Variant\\CapablancaFischer\\Board Chess960 Chess\\Variant\\Chess960\\Board Classical Chess\\Variant\\Classical\\Board Dunsany Chess\\Variant\\Dunsany\\Board Losing Chess Chess\\Variant\\Losing\\Board RacingKings Chess\\Variant\\RacingKings\\Board UCI Engines Listed below are the UCI engines available at the moment. Stockfish Object-Oriented The chess board representation is an object of type SplObjectStorage as opposed to a bitboard. Thoroughly Tested PHP Chess has been developed with a test-driven development (TDD) approach. The tests/unit folder contains plenty of real examples. Almost every class in the src folder represents a concept that is tested accordingly in the tests/unit folder, in other words, the structure of the tests/unit folder is mirroring the structure of the src folder. The PHP Chess docs are more of a tutorial rather than an API description. The unit tests are the best documentation. For further details on how to use a particular class, please feel free to browse the codebase and check out the corresponding tests. Lightweight PHP dependencies required: Rubix ML for machine learning. Imagine for image processing.","title":"PHP Chess"},{"location":"#php-chess","text":"A chess library for PHP offering move validation, common formats, multiple variants, UCI engine support, explanation of chess positions, image recognition and knowledge extraction from games.","title":"PHP Chess"},{"location":"#installation","text":"","title":"Installation"},{"location":"#requirements","text":"PHP >= 8.1 Stockfish >= 15.1","title":"Requirements"},{"location":"#composer-installation","text":"composer require chesslablab/php-chess","title":"Composer installation"},{"location":"#features","text":"","title":"Features"},{"location":"#formats-supported","text":"Chess moves in LAN and PGN formats. Movetext processing in LAN, SAN and RAV formats. NAG support for SAN and RAV movetexts. UCI protocol. Chess board to PNG and JPG image. PNG and JPG image to FEN. FEN to chess board. Chess board to MP4 video. Acronym Description LAN Long Algebraic Notation PGN Portable Game Notation SAN Standard Algebraic Notation RAV Recursive Annotation Variation NAG Numeric Annotation Glyphs UCI Universal Chess Interface FEN Forsyth-Edwards Notation","title":"Formats Supported"},{"location":"#chess-variants","text":"Multiple variants are supported with the default one being classical chess. Variant Chessboard Capablanca Chess\\Variant\\Capablanca\\Board Capablanca-Fischer Chess\\Variant\\CapablancaFischer\\Board Chess960 Chess\\Variant\\Chess960\\Board Classical Chess\\Variant\\Classical\\Board Dunsany Chess\\Variant\\Dunsany\\Board Losing Chess Chess\\Variant\\Losing\\Board RacingKings Chess\\Variant\\RacingKings\\Board","title":"Chess Variants"},{"location":"#uci-engines","text":"Listed below are the UCI engines available at the moment. Stockfish","title":"UCI Engines"},{"location":"#object-oriented","text":"The chess board representation is an object of type SplObjectStorage as opposed to a bitboard.","title":"Object-Oriented"},{"location":"#thoroughly-tested","text":"PHP Chess has been developed with a test-driven development (TDD) approach. The tests/unit folder contains plenty of real examples. Almost every class in the src folder represents a concept that is tested accordingly in the tests/unit folder, in other words, the structure of the tests/unit folder is mirroring the structure of the src folder. The PHP Chess docs are more of a tutorial rather than an API description. The unit tests are the best documentation. For further details on how to use a particular class, please feel free to browse the codebase and check out the corresponding tests.","title":"Thoroughly Tested"},{"location":"#lightweight","text":"PHP dependencies required: Rubix ML for machine learning. Imagine for image processing.","title":"Lightweight"},{"location":"chess-tutor/","text":"Chess Tutor Explain a FEN Position \u2728 Chess beginners often think they can checkmate the opponent's king quickly. However, there are so many different things to consider in order to understand a position. Chess\\Tutor\\FenEvaluation helps you improve your chess thinking process by evaluating a FEN position in terms of chess concepts like in the example below. use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; use Chess\\Tutor\\FenEvaluation; $f = new CompleteFunction(); $board = FenToBoardFactory::create('8/5k2/4n3/8/8/1BK5/1B6/8 w - - 0 1'); $paragraph = (new FenEvaluation($f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; White has a decisive material advantage. White has a slightly better control of the center. The white player is pressuring more squares than its opponent. White has an absolute pin advantage. White has the bishop pair. Black's king has more safe squares to move to than its counterpart. Black's king can be checked so it is vulnerable to forced moves. The knight on e6 is pinned shielding the king so it cannot move out of the line of attack because the king would be put in check. Overall, 5 evaluation features are favoring White. The relative evaluation of this position is 2.26. \ud83c\udf89 This is a form of abductive reasoning. Explain a PGN Move \u2728 Typically, chess engines won't provide an explanation in easy-to-understand language about how a move changes the position on the board. Chess\\Tutor\\PgnEvaluation explains how a particular move changes the position. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\PgnEvaluation; $pgn = 'd4'; $f = new CompleteFunction(); $movetext = '1.Nf3 d5 2.g3 c5'; $board = (new SanPlay($movetext))->validate()->board; $paragraph = (new PgnEvaluation($pgn, $f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; Black has a slight space advantage. White has a slight protection advantage. White has a slight attack advantage. White's king can be checked so it is vulnerable to forced moves. These pieces are hanging: The rook on a1, the rook on h1, the rook on a8, the rook on h8, the pawn on c5. The pawn on c5 is unprotected. The pawn on c5 is under threat of being attacked. Overall, 0 evaluation features are favoring either player. The relative evaluation of this position is 1.5. The resulting text may sound a little robotic but it can be easily rephrased by the AI of your choice to make it sound more human-like. Explain a Good PGN Move \u2728 It's often difficult for beginners to understand why a move is good. With the help of an UCI engine Chess\\Tutor\\GoodPgnEvaluation can explain the why of a good move. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\GoodPgnEvaluation; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $limit = new Limit(); $limit->depth = 12; $stockfish = new UciEngine('/usr/games/stockfish'); $f = new CompleteFunction(); $movetext = '1.d4 d5 2.c4 Nc6 3.cxd5 Qxd5 4.e3 e5 5.Nc3 Bb4 6.Bd2 Bxc3 7.Bxc3 exd4 8.Ne2'; $board = (new SanPlay($movetext))->validate()->board; $goodPgnEvaluation = new GoodPgnEvaluation($limit, $stockfish, $f, $board); $pgn = $goodPgnEvaluation->pgn; $paragraph = implode(' ', $goodPgnEvaluation->paragraph); echo $pgn . PHP_EOL; echo $paragraph . PHP_EOL; Bg4 The black player is pressuring more squares than its opponent. The black pieces are timidly approaching the other side's king. Black has a relative pin advantage. These pieces are hanging: Black's queen on d5, the rook on a8, the rook on h8, the pawn on b7, the pawn on c7, the pawn on g7, the bishop on g4, the rook on h1. The knight on e2 is pinned shielding a piece that is more valuable than the attacking piece. Overall, 7 evaluation features are favoring Black. The relative evaluation of this position is 0.32. \ud83c\udf89 Let's do this!","title":"Chess Tutor"},{"location":"chess-tutor/#chess-tutor","text":"","title":"Chess Tutor"},{"location":"chess-tutor/#explain-a-fen-position","text":"\u2728 Chess beginners often think they can checkmate the opponent's king quickly. However, there are so many different things to consider in order to understand a position. Chess\\Tutor\\FenEvaluation helps you improve your chess thinking process by evaluating a FEN position in terms of chess concepts like in the example below. use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; use Chess\\Tutor\\FenEvaluation; $f = new CompleteFunction(); $board = FenToBoardFactory::create('8/5k2/4n3/8/8/1BK5/1B6/8 w - - 0 1'); $paragraph = (new FenEvaluation($f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; White has a decisive material advantage. White has a slightly better control of the center. The white player is pressuring more squares than its opponent. White has an absolute pin advantage. White has the bishop pair. Black's king has more safe squares to move to than its counterpart. Black's king can be checked so it is vulnerable to forced moves. The knight on e6 is pinned shielding the king so it cannot move out of the line of attack because the king would be put in check. Overall, 5 evaluation features are favoring White. The relative evaluation of this position is 2.26. \ud83c\udf89 This is a form of abductive reasoning.","title":"Explain a FEN Position"},{"location":"chess-tutor/#explain-a-pgn-move","text":"\u2728 Typically, chess engines won't provide an explanation in easy-to-understand language about how a move changes the position on the board. Chess\\Tutor\\PgnEvaluation explains how a particular move changes the position. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\PgnEvaluation; $pgn = 'd4'; $f = new CompleteFunction(); $movetext = '1.Nf3 d5 2.g3 c5'; $board = (new SanPlay($movetext))->validate()->board; $paragraph = (new PgnEvaluation($pgn, $f, $board))->paragraph; $text = implode(' ', $paragraph); echo $text; Black has a slight space advantage. White has a slight protection advantage. White has a slight attack advantage. White's king can be checked so it is vulnerable to forced moves. These pieces are hanging: The rook on a1, the rook on h1, the rook on a8, the rook on h8, the pawn on c5. The pawn on c5 is unprotected. The pawn on c5 is under threat of being attacked. Overall, 0 evaluation features are favoring either player. The relative evaluation of this position is 1.5. The resulting text may sound a little robotic but it can be easily rephrased by the AI of your choice to make it sound more human-like.","title":"Explain a PGN Move"},{"location":"chess-tutor/#explain-a-good-pgn-move","text":"\u2728 It's often difficult for beginners to understand why a move is good. With the help of an UCI engine Chess\\Tutor\\GoodPgnEvaluation can explain the why of a good move. use Chess\\Function\\CompleteFunction; use Chess\\Play\\SanPlay; use Chess\\Tutor\\GoodPgnEvaluation; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $limit = new Limit(); $limit->depth = 12; $stockfish = new UciEngine('/usr/games/stockfish'); $f = new CompleteFunction(); $movetext = '1.d4 d5 2.c4 Nc6 3.cxd5 Qxd5 4.e3 e5 5.Nc3 Bb4 6.Bd2 Bxc3 7.Bxc3 exd4 8.Ne2'; $board = (new SanPlay($movetext))->validate()->board; $goodPgnEvaluation = new GoodPgnEvaluation($limit, $stockfish, $f, $board); $pgn = $goodPgnEvaluation->pgn; $paragraph = implode(' ', $goodPgnEvaluation->paragraph); echo $pgn . PHP_EOL; echo $paragraph . PHP_EOL; Bg4 The black player is pressuring more squares than its opponent. The black pieces are timidly approaching the other side's king. Black has a relative pin advantage. These pieces are hanging: Black's queen on d5, the rook on a8, the rook on h8, the pawn on b7, the pawn on c7, the pawn on g7, the bishop on g4, the rook on h1. The knight on e2 is pinned shielding a piece that is more valuable than the attacking piece. Overall, 7 evaluation features are favoring Black. The relative evaluation of this position is 0.32. \ud83c\udf89 Let's do this!","title":"Explain a Good PGN Move"},{"location":"format-converters/","text":"Format Converters FEN to Board \u2728 FEN stands for Forsyth-Edwards Notation and is the standard way for describing chess positions using text strings. At some point you'll definitely want to convert a FEN string into a chessboard object for further processing, and this can be done with the Chess\\FenToBoardFactory class according to the variants supported. When a single parameter is passed into the factory's create method, it is assumed that you want to create a classical chess board object. use Chess\\FenToBoardFactory; $board = FenToBoardFactory::create('rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq -'); $board->play('w', 'Nc3'); $board->play('b', 'Nc6'); echo $board->toFen(); r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - In this example the game history contains two moves only. var_dump($board->history); array(2) { [0]=> array(7) { [\"pgn\"]=> string(3) \"Nc3\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"w\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b1\" [\"to\"]=> string(2) \"c3\" [\"fen\"]=> string(59) \"rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq -\" } [1]=> array(7) { [\"pgn\"]=> string(3) \"Nc6\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"b\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b8\" [\"to\"]=> string(2) \"c6\" [\"fen\"]=> string(60) \"r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq -\" } } The initial FEN string can be accessed as shown below. echo $board->startFen; rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - This is how to get LAN formatted moves out of the history array. $last = end($board->history); $lan = $last['from'] . $last['to']; echo $lan; b8c6 Board to PNG Image \u2728 PNG stands for Portable Network Graphics and is a widely used format for image files. Not to be confused with PGN, the text-based file format to annotate chess games. Chess\\Media\\BoardToPng converts a chess board object to a PNG image. use Chess\\FenToBoardFactory; use Chess\\Media\\BoardToPng; $board = FenToBoardFactory::create('1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K w - - bm Nf6+'); $filename = (new BoardToPng($board, $flip = true))->output(__DIR__); Try this thing! Share a puzzling chess position with friends for further study. Board to MP4 \u2728 Text-based PGN movetexts can be easily converted to MP4, a widely-used video format which comes in handy for pausing the games. Chess\\Media\\BoardToMp4 allows to convert a chess board object to an MP4 video. use Chess\\Media\\BoardToMp4; use Chess\\Variant\\Classical\\Board; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = new Board(); $filename = (new BoardToMp4($movetext, $board, $flip = false))->output(__DIR__); MP4 videos are especially useful to pause the game at a specific position. Image to FEN \u2728 A chess piece image recognizer has been created in the chesslablab/perception repository with the help of a multilayer neural network. Chess\\Media\\ImgToPiecePlacement relies on this recognizer to convert a GD image into a piece placement in FEN format. use Chess\\Media\\ImgToPiecePlacement; $image = imagecreatefrompng(__DIR__ . '/01_kaufman.png'); $prediction = (new ImgToPiecePlacement($image))->predict(); echo $prediction; 1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K For optimal use, it is recommended to make predictions on chessboard images using classical chess pieces like the Kaufman test attached below.","title":"Format Converters"},{"location":"format-converters/#format-converters","text":"","title":"Format Converters"},{"location":"format-converters/#fen-to-board","text":"\u2728 FEN stands for Forsyth-Edwards Notation and is the standard way for describing chess positions using text strings. At some point you'll definitely want to convert a FEN string into a chessboard object for further processing, and this can be done with the Chess\\FenToBoardFactory class according to the variants supported. When a single parameter is passed into the factory's create method, it is assumed that you want to create a classical chess board object. use Chess\\FenToBoardFactory; $board = FenToBoardFactory::create('rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq -'); $board->play('w', 'Nc3'); $board->play('b', 'Nc6'); echo $board->toFen(); r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - In this example the game history contains two moves only. var_dump($board->history); array(2) { [0]=> array(7) { [\"pgn\"]=> string(3) \"Nc3\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"w\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b1\" [\"to\"]=> string(2) \"c3\" [\"fen\"]=> string(59) \"rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq -\" } [1]=> array(7) { [\"pgn\"]=> string(3) \"Nc6\" [\"case\"]=> string(48) \"N[a-h]{0,1}[1-8]{0,1}[a-h]{1}[1-8]{1}[\\+\\#]{0,1}\" [\"color\"]=> string(1) \"b\" [\"id\"]=> string(1) \"N\" [\"from\"]=> string(2) \"b8\" [\"to\"]=> string(2) \"c6\" [\"fen\"]=> string(60) \"r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq -\" } } The initial FEN string can be accessed as shown below. echo $board->startFen; rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - This is how to get LAN formatted moves out of the history array. $last = end($board->history); $lan = $last['from'] . $last['to']; echo $lan; b8c6","title":"FEN to Board"},{"location":"format-converters/#board-to-png-image","text":"\u2728 PNG stands for Portable Network Graphics and is a widely used format for image files. Not to be confused with PGN, the text-based file format to annotate chess games. Chess\\Media\\BoardToPng converts a chess board object to a PNG image. use Chess\\FenToBoardFactory; use Chess\\Media\\BoardToPng; $board = FenToBoardFactory::create('1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K w - - bm Nf6+'); $filename = (new BoardToPng($board, $flip = true))->output(__DIR__); Try this thing! Share a puzzling chess position with friends for further study.","title":"Board to PNG Image"},{"location":"format-converters/#board-to-mp4","text":"\u2728 Text-based PGN movetexts can be easily converted to MP4, a widely-used video format which comes in handy for pausing the games. Chess\\Media\\BoardToMp4 allows to convert a chess board object to an MP4 video. use Chess\\Media\\BoardToMp4; use Chess\\Variant\\Classical\\Board; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = new Board(); $filename = (new BoardToMp4($movetext, $board, $flip = false))->output(__DIR__); MP4 videos are especially useful to pause the game at a specific position.","title":"Board to MP4"},{"location":"format-converters/#image-to-fen","text":"\u2728 A chess piece image recognizer has been created in the chesslablab/perception repository with the help of a multilayer neural network. Chess\\Media\\ImgToPiecePlacement relies on this recognizer to convert a GD image into a piece placement in FEN format. use Chess\\Media\\ImgToPiecePlacement; $image = imagecreatefrompng(__DIR__ . '/01_kaufman.png'); $prediction = (new ImgToPiecePlacement($image))->predict(); echo $prediction; 1rbq1rk1/p1b1nppp/1p2p3/8/1B1pN3/P2B4/1P3PPP/2RQ1R1K For optimal use, it is recommended to make predictions on chessboard images using classical chess pieces like the Kaufman test attached below.","title":"Image to FEN"},{"location":"getting-started/","text":"Getting Started \u2728 Some familiarity with chess terms and concepts is required but if you're new to chess this tutorial will guide you through how to easily create amazing apps with PHP Chess. Happy coding and learning! The Chess\\Variant\\Classical\\Board class is the easiest way to get started with PHP Chess. use Chess\\Variant\\Classical\\Board; $board = new Board(); If you have ever attended a chess tournament, you've probably noticed that each player writes down their move in PGN format on a piece of paper. PGN stands for Portable Game Notation and is a human-readable format that allows chess players to read and write chess games. When it comes to computer chess, though, a more appropriate machine-readable format called Long Algebraic Notation (LAN) is often used instead. Be that as it may, you're already set up to play classical chess either in PGN or LAN format. In PGN format: $board->play('w', 'e4'); In LAN format: $board->playLan('w', 'e2e4'); Every time a move is made, the state of the board changes. var_dump($board->toFen()); string(55) \"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3\" This is the chess position in Forsyth\u2013Edwards Notation (FEN) format after 1.e4. \ud83c\udf89 Congrats! 1.e4 is one of the best moves to start with. Portable Game Notation (PGN) \u2728 Portable Game Notation is a human-readable text format that allows chess players to read and write chess games. PGN is convenient for when reading chess games annotated by humans, for example, those ones available in online databases or published in chess websites. 1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.Nd2 Nxd2 8.Bxd2 Bd6 9.O-O h5 10.Qe1+ Kf8 11.Bb4 Qe7 12.Bxd6 Qxd6 13.Qd2 Re8 14.Rae1 Rh6 15.Qg5 c6 16.Rxe8+ Bxe8 17.Re1 Qf6 18.Qe3 Bd7 19.h3 h4 20.c4 dxc4 21.Bxc4 b5 22.Qa3+ Kg8 23.Qxa7 Qd8 24.Bb3 Rd6 25.Re4 Be6 26.Bxe6 Rxe6 27.Rxe6 fxe6 28.Qc5 Qa5 29.Qxc6 Qe1+ 30.Kh2 Qxf2 31.Qxe6+ Kh7 32.Qe4+ Kg8 33.b3 Qxa2 34.Qe8+ Kh7 35.Qxb5 Qf2 36.Qe5 Qb2 37.Qe4+ Kg8 38.Qd3 Qf2 39.Qc3 Qf4+ 40.Kg1 Kh7 41.Qd3+ g6 42.Qd1 Qe3+ 43.Kh1 g5 44.d5 g4 45.hxg4 h3 46.Qf3 1\u20130 World Chess Championship 2021. (2023, July 3). In Wikipedia. https://en.wikipedia.org/wiki/World_Chess_Championship_2021 As you may probably know, a chess opening is the group of initial moves of a chess game. This definition applies to classical chess, however, there is no such thing as a chess opening in either Capablanca chess or Chess960. Those two variants were originally conceived to minimize memorization, so when it comes to chess openings it is assumed that we're in the realms of classical chess. ECO, which stands for Encyclopaedia of Chess Openings, is a standard classification system for chess openings. Having said all that, let's now look at B54 which is the ECO code for \"Sicilian Defense: Modern Variations, Main Line\". use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $board->play('b', 'c5'); $board->play('w', 'Nf3'); $board->play('b', 'd6'); $board->play('w', 'd4'); $board->play('b', 'cxd4'); $board->play('w', 'Nxd4'); echo $board->toString(); r n b q k b n r p p . . p p p p . . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R The play() method in the Chess\\Variant\\Classical\\Board class allows to make moves in PGN format. So far so good, but if you're new to chess you may well play a wrong move in the Sicilian Defense: 4...Na6. $board->play('b', 'Na6'); echo $board->toString(); r . b q k b n r p p . . p p p p n . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R No worries! The undo() method comes to the rescue to take back a move. $board = $board->undo(); $board->play('b', 'Nf6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 The movetext() method is used to obtain the moves played in the game using Standard Algebraic Notation. Let's continue practicing chess openings. Now, what if you want to play a bunch of moves at once instead of one by one as in the previous example? Chess\\Play\\SanPlay allows to easily do so. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6'; $board = (new SanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R Please note that the validate() method will throw an exception if the movetext is not valid. Once the $board object is successfully created, the game can be continued from that particular position. $board->play('w', 'Bb5+'); echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . B . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K . . R Every time a move is made, the state of the board changes. Chess\\Variant\\Classical\\Board provides you with plenty of methods to interact with a chess board object. It is a quite common use case to query the board state. As discussed in the Home section, you may want to check out the corresponding tests for further details on how to use it. The unit tests are the best documentation. They contain hundreds of real examples on how to use the PHP Chess library. The isCheck() method will confirm that the white king is in check after 5.Bb5+ while isMate() will confirm that it has not been mated. var_dump($board->isCheck()); bool(true) var_dump($board->isMate()); bool(false) Similarly, you may want to know if the current position is a draw. The isStalemate() method is to find out if the current position is a stalemate while isFivefoldRepetition() will confirm if the game is drawn because of a fivefold repetition. var_dump($board->isStalemate()); bool(false) var_dump($board->isFivefoldRepetition()); bool(false) Text comments in curly brackets can optionally be used in SAN movetexts as well as Numeric Annotation Glyphs . The example below shows how Chess\\Play\\SanPlay is used to validate a SAN movetext that contains NAGs. Remember, the validate() method will throw an exception if the movetext is not valid. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113'; $sanPlay = (new SanPlay($movetext))->validate(); echo $sanPlay->sanMovetext->filtered(); 1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113 Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. echo $sanPlay->sanMovetext->filtered($comments = true, $nags = false); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 \ud83c\udf89 Next, let's learn how to process chess moves from a graphical user interface. Long Algebraic Notation (LAN) \u2728 The UCI protocol enables chess engines to communicate with user interfaces (UI) using Long Algebraic Notation (LAN) for moves. use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->playLan('w', 'e2e4'); $board->playLan('b', 'c7c5'); $board->playLan('w', 'g1f3'); $board->playLan('b', 'd7d6'); $board->playLan('w', 'd2d4'); $board->playLan('b', 'c5d4'); $board->playLan('w', 'f3d4'); $board->playLan('b', 'g8f6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 Chess\\Play\\LanPlay allows to play a bunch of LAN moves at once instead of one by one. use Chess\\Play\\LanPlay; $movetext = '1.e2e4 c7c5 2.g1f3 d7d6 3.d2d4 c5d4 4.f3d4 g8f6'; $board = (new LanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R \ud83c\udf89 And, it's easy! Recursive Annotation Variation (RAV) \u2728 RAV stands for Recursive Annotation Variation. It is an extension of the Standard Algebaric Notation (SAN) format that allows to annotate chess variations. This format is especially useful for tutorials, notable games, chess studies and so on. Comments are enclosed in curly brackets. Variations are enclosed in parentheses which can be nested recursively as many times as required with the trait that the previous move may need to be undone in order to play a variation. The example below describes how to play the Open Sicilian. 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2... Nc6) (2... e6) (2... d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Sicilian Defense. (2023, July 2). In Wikipedia. https://en.wikipedia.org/wiki/Sicilian_Defence The RAV reader above displays the variation levels in different shades of gray. It is a 2D scrollable HTML table where the main line is shown in a white background color. The deeper the level, the darker the background color. Chess\\Play\\RavPlay allows to play a RAV movetext. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) The FEN history is retrieved as an unidimensional array so it can be easily consumed by a frontend UI as shown in Figure 1. The movetext will also pass the validation if adding comments and NAGs. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 {enters the Sicilian Defense.} (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) This is how to obtain the validated movetext. $movetext = $ravPlay->ravMovetext->movetext; The filtered() method is to remove tabs and spaces. $movetext = $ravPlay->ravMovetext->filtered(); echo $movetext; 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2...Nc6) (2...e6) (2...d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. $movetext = $ravPlay->ravMovetext->filtered($comments = false); echo $movetext; 1.e4 c5 (2.Nf3 (2...Nc6) (2...e6) (2...d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6))) And finally, as opposed to the start position, a RAV movetext can also be started from a particular FEN position if passing a chess board object into the constructor of the class. As you can see in the example below, Chess\\FenToBoardFactory is used for this purpose. use Chess\\FenToBoardFactory; use Chess\\Play\\RavPlay; $movetext = \"1.Ra7 Kg8 2.Kg2 Kf8 3.Kf3 Ke8 4.Ke4 Kd8 5.Kd5 Kc8 (5...Ke8 6.Kd6 Kf8 7.Ke6 Kg8 8.Kf6 Kh8 9.Kg6 Kg8 10.Ra8#) 6.Kd6 Kb8 (6...Kd8 7.Ra8#) 7.Rc7 Ka8 8.Kc6 Kb8 9.Kb6 Ka8 10.Rc8#\"; $board = FenToBoardFactory::create('7k/8/8/8/8/8/8/R6K w - -'); $ravPlay = (new RavPlay($movetext, $board))->validate(); print_r($ravPlay->fen); Array ( [0] => 7k/8/8/8/8/8/8/R6K w - - [1] => 7k/R7/8/8/8/8/8/7K b - - [2] => 6k1/R7/8/8/8/8/8/7K w - - [3] => 6k1/R7/8/8/8/8/6K1/8 b - - [4] => 5k2/R7/8/8/8/8/6K1/8 w - - [5] => 5k2/R7/8/8/8/5K2/8/8 b - - [6] => 4k3/R7/8/8/8/5K2/8/8 w - - [7] => 4k3/R7/8/8/4K3/8/8/8 b - - [8] => 3k4/R7/8/8/4K3/8/8/8 w - - [9] => 3k4/R7/8/3K4/8/8/8/8 b - - [10] => 2k5/R7/8/3K4/8/8/8/8 w - - [11] => 4k3/R7/8/3K4/8/8/8/8 w - - [12] => 4k3/R7/3K4/8/8/8/8/8 b - - [13] => 5k2/R7/3K4/8/8/8/8/8 w - - [14] => 5k2/R7/4K3/8/8/8/8/8 b - - [15] => 6k1/R7/4K3/8/8/8/8/8 w - - [16] => 6k1/R7/5K2/8/8/8/8/8 b - - [17] => 7k/R7/5K2/8/8/8/8/8 w - - [18] => 7k/R7/6K1/8/8/8/8/8 b - - [19] => 6k1/R7/6K1/8/8/8/8/8 w - - [20] => R5k1/8/6K1/8/8/8/8/8 b - - [21] => 2k5/R7/3K4/8/8/8/8/8 b - - [22] => 1k6/R7/3K4/8/8/8/8/8 w - - [23] => 3k4/R7/3K4/8/8/8/8/8 w - - [24] => R2k4/8/3K4/8/8/8/8/8 b - - [25] => 1k6/2R5/3K4/8/8/8/8/8 b - - [26] => k7/2R5/3K4/8/8/8/8/8 w - - [27] => k7/2R5/2K5/8/8/8/8/8 b - - [28] => 1k6/2R5/2K5/8/8/8/8/8 w - - [29] => 1k6/2R5/1K6/8/8/8/8/8 b - - [30] => k7/2R5/1K6/8/8/8/8/8 w - - [31] => k1R5/8/1K6/8/8/8/8/8 b - - ) \ud83c\udf89 So this is amazing! That's all we need to read and write chess tutorials, guides and how-tos.","title":"Getting Started"},{"location":"getting-started/#getting-started","text":"\u2728 Some familiarity with chess terms and concepts is required but if you're new to chess this tutorial will guide you through how to easily create amazing apps with PHP Chess. Happy coding and learning! The Chess\\Variant\\Classical\\Board class is the easiest way to get started with PHP Chess. use Chess\\Variant\\Classical\\Board; $board = new Board(); If you have ever attended a chess tournament, you've probably noticed that each player writes down their move in PGN format on a piece of paper. PGN stands for Portable Game Notation and is a human-readable format that allows chess players to read and write chess games. When it comes to computer chess, though, a more appropriate machine-readable format called Long Algebraic Notation (LAN) is often used instead. Be that as it may, you're already set up to play classical chess either in PGN or LAN format. In PGN format: $board->play('w', 'e4'); In LAN format: $board->playLan('w', 'e2e4'); Every time a move is made, the state of the board changes. var_dump($board->toFen()); string(55) \"rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3\" This is the chess position in Forsyth\u2013Edwards Notation (FEN) format after 1.e4. \ud83c\udf89 Congrats! 1.e4 is one of the best moves to start with.","title":"Getting Started"},{"location":"getting-started/#portable-game-notation-pgn","text":"\u2728 Portable Game Notation is a human-readable text format that allows chess players to read and write chess games. PGN is convenient for when reading chess games annotated by humans, for example, those ones available in online databases or published in chess websites. 1.e4 e5 2.Nf3 Nf6 3.d4 Nxe4 4.Bd3 d5 5.Nxe5 Nd7 6.Nxd7 Bxd7 7.Nd2 Nxd2 8.Bxd2 Bd6 9.O-O h5 10.Qe1+ Kf8 11.Bb4 Qe7 12.Bxd6 Qxd6 13.Qd2 Re8 14.Rae1 Rh6 15.Qg5 c6 16.Rxe8+ Bxe8 17.Re1 Qf6 18.Qe3 Bd7 19.h3 h4 20.c4 dxc4 21.Bxc4 b5 22.Qa3+ Kg8 23.Qxa7 Qd8 24.Bb3 Rd6 25.Re4 Be6 26.Bxe6 Rxe6 27.Rxe6 fxe6 28.Qc5 Qa5 29.Qxc6 Qe1+ 30.Kh2 Qxf2 31.Qxe6+ Kh7 32.Qe4+ Kg8 33.b3 Qxa2 34.Qe8+ Kh7 35.Qxb5 Qf2 36.Qe5 Qb2 37.Qe4+ Kg8 38.Qd3 Qf2 39.Qc3 Qf4+ 40.Kg1 Kh7 41.Qd3+ g6 42.Qd1 Qe3+ 43.Kh1 g5 44.d5 g4 45.hxg4 h3 46.Qf3 1\u20130 World Chess Championship 2021. (2023, July 3). In Wikipedia. https://en.wikipedia.org/wiki/World_Chess_Championship_2021 As you may probably know, a chess opening is the group of initial moves of a chess game. This definition applies to classical chess, however, there is no such thing as a chess opening in either Capablanca chess or Chess960. Those two variants were originally conceived to minimize memorization, so when it comes to chess openings it is assumed that we're in the realms of classical chess. ECO, which stands for Encyclopaedia of Chess Openings, is a standard classification system for chess openings. Having said all that, let's now look at B54 which is the ECO code for \"Sicilian Defense: Modern Variations, Main Line\". use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $board->play('b', 'c5'); $board->play('w', 'Nf3'); $board->play('b', 'd6'); $board->play('w', 'd4'); $board->play('b', 'cxd4'); $board->play('w', 'Nxd4'); echo $board->toString(); r n b q k b n r p p . . p p p p . . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R The play() method in the Chess\\Variant\\Classical\\Board class allows to make moves in PGN format. So far so good, but if you're new to chess you may well play a wrong move in the Sicilian Defense: 4...Na6. $board->play('b', 'Na6'); echo $board->toString(); r . b q k b n r p p . . p p p p n . . p . . . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R No worries! The undo() method comes to the rescue to take back a move. $board = $board->undo(); $board->play('b', 'Nf6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 The movetext() method is used to obtain the moves played in the game using Standard Algebraic Notation. Let's continue practicing chess openings. Now, what if you want to play a bunch of moves at once instead of one by one as in the previous example? Chess\\Play\\SanPlay allows to easily do so. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6'; $board = (new SanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R Please note that the validate() method will throw an exception if the movetext is not valid. Once the $board object is successfully created, the game can be continued from that particular position. $board->play('w', 'Bb5+'); echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . B . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K . . R Every time a move is made, the state of the board changes. Chess\\Variant\\Classical\\Board provides you with plenty of methods to interact with a chess board object. It is a quite common use case to query the board state. As discussed in the Home section, you may want to check out the corresponding tests for further details on how to use it. The unit tests are the best documentation. They contain hundreds of real examples on how to use the PHP Chess library. The isCheck() method will confirm that the white king is in check after 5.Bb5+ while isMate() will confirm that it has not been mated. var_dump($board->isCheck()); bool(true) var_dump($board->isMate()); bool(false) Similarly, you may want to know if the current position is a draw. The isStalemate() method is to find out if the current position is a stalemate while isFivefoldRepetition() will confirm if the game is drawn because of a fivefold repetition. var_dump($board->isStalemate()); bool(false) var_dump($board->isFivefoldRepetition()); bool(false) Text comments in curly brackets can optionally be used in SAN movetexts as well as Numeric Annotation Glyphs . The example below shows how Chess\\Play\\SanPlay is used to validate a SAN movetext that contains NAGs. Remember, the validate() method will throw an exception if the movetext is not valid. use Chess\\Play\\SanPlay; $movetext = '1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113'; $sanPlay = (new SanPlay($movetext))->validate(); echo $sanPlay->sanMovetext->filtered(); 1.e4 c5 2.Nf3 $1 d6 3.d4 cxd4 4.Nxd4 $48 Nf6 $113 Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. echo $sanPlay->sanMovetext->filtered($comments = true, $nags = false); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 \ud83c\udf89 Next, let's learn how to process chess moves from a graphical user interface.","title":"Portable Game Notation (PGN)"},{"location":"getting-started/#long-algebraic-notation-lan","text":"\u2728 The UCI protocol enables chess engines to communicate with user interfaces (UI) using Long Algebraic Notation (LAN) for moves. use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->playLan('w', 'e2e4'); $board->playLan('b', 'c7c5'); $board->playLan('w', 'g1f3'); $board->playLan('b', 'd7d6'); $board->playLan('w', 'd2d4'); $board->playLan('b', 'c5d4'); $board->playLan('w', 'f3d4'); $board->playLan('b', 'g8f6'); echo $board->movetext(); 1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 Chess\\Play\\LanPlay allows to play a bunch of LAN moves at once instead of one by one. use Chess\\Play\\LanPlay; $movetext = '1.e2e4 c7c5 2.g1f3 d7d6 3.d2d4 c5d4 4.f3d4 g8f6'; $board = (new LanPlay($movetext))->validate()->board; echo $board->toString(); r n b q k b . r p p . . p p p p . . . p . n . . . . . . . . . . . . . N P . . . . . . . . . . . P P P . . P P P R N B Q K B . R \ud83c\udf89 And, it's easy!","title":"Long Algebraic Notation (LAN)"},{"location":"getting-started/#recursive-annotation-variation-rav","text":"\u2728 RAV stands for Recursive Annotation Variation. It is an extension of the Standard Algebaric Notation (SAN) format that allows to annotate chess variations. This format is especially useful for tutorials, notable games, chess studies and so on. Comments are enclosed in curly brackets. Variations are enclosed in parentheses which can be nested recursively as many times as required with the trait that the previous move may need to be undone in order to play a variation. The example below describes how to play the Open Sicilian. 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2... Nc6) (2... e6) (2... d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Sicilian Defense. (2023, July 2). In Wikipedia. https://en.wikipedia.org/wiki/Sicilian_Defence The RAV reader above displays the variation levels in different shades of gray. It is a 2D scrollable HTML table where the main line is shown in a white background color. The deeper the level, the darker the background color. Chess\\Play\\RavPlay allows to play a RAV movetext. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) The FEN history is retrieved as an unidimensional array so it can be easily consumed by a frontend UI as shown in Figure 1. The movetext will also pass the validation if adding comments and NAGs. use Chess\\Play\\RavPlay; $movetext = \"1.e4 c5 {enters the Sicilian Defense.} (2.Nf3 (2... Nc6) (2... e6) (2... d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}) ) )\"; $ravPlay = (new RavPlay($movetext))->validate(); print_r($ravPlay->fen); Array ( [0] => rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - [1] => rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 [2] => rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 [3] => rnbqkbnr/pp1ppppp/8/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R b KQkq - [4] => r1bqkbnr/pp1ppppp/2n5/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [5] => rnbqkbnr/pp1p1ppp/4p3/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [6] => rnbqkbnr/pp2pppp/3p4/2p5/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - [7] => rnbqkbnr/pp2pppp/3p4/2p5/3PP3/5N2/PPP2PPP/RNBQKB1R b KQkq d3 [8] => rnbqkbnr/pp2pppp/3p4/8/3pP3/5N2/PPP2PPP/RNBQKB1R w KQkq - [9] => rnbqkbnr/pp2pppp/3p4/8/3NP3/8/PPP2PPP/RNBQKB1R b KQkq - [10] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/8/PPP2PPP/RNBQKB1R w KQkq - [11] => rnbqkb1r/pp2pppp/3p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R b KQkq - [12] => rnbqkb1r/1p2pppp/p2p1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [13] => rnbqkb1r/pp2pp1p/3p1np1/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [14] => r1bqkb1r/pp2pppp/2np1n2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - [15] => rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - ) This is how to obtain the validated movetext. $movetext = $ravPlay->ravMovetext->movetext; The filtered() method is to remove tabs and spaces. $movetext = $ravPlay->ravMovetext->filtered(); echo $movetext; 1.e4 c5 {enters the Sicilian Defense, the most popular and best-scoring response to White's first move.} (2.Nf3 {is played in about 80% of Master-level games after which there are three main options for Black.} (2...Nc6) (2...e6) (2...d6 {is Black's most common move.} 3.d4 {lines are collectively known as the Open Sicilian.} cxd4 4.Nxd4 Nf6 5.Nc3 {allows Black choose between four major variations: the Najdorf, Dragon, Classical and Scheveningen.} (5...a6 {is played in the Najdorf variation.}) (5...g6 {is played in the Dragon variation.}) (5...Nc6 {is played in the Classical variation.}) (5...e6 {is played in the Scheveningen variation.}))) Comments and NAGs can be removed by passing the false value to the first and second arguments of the filtered() method. $movetext = $ravPlay->ravMovetext->filtered($comments = false); echo $movetext; 1.e4 c5 (2.Nf3 (2...Nc6) (2...e6) (2...d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 (5...a6) (5...g6) (5...Nc6) (5...e6))) And finally, as opposed to the start position, a RAV movetext can also be started from a particular FEN position if passing a chess board object into the constructor of the class. As you can see in the example below, Chess\\FenToBoardFactory is used for this purpose. use Chess\\FenToBoardFactory; use Chess\\Play\\RavPlay; $movetext = \"1.Ra7 Kg8 2.Kg2 Kf8 3.Kf3 Ke8 4.Ke4 Kd8 5.Kd5 Kc8 (5...Ke8 6.Kd6 Kf8 7.Ke6 Kg8 8.Kf6 Kh8 9.Kg6 Kg8 10.Ra8#) 6.Kd6 Kb8 (6...Kd8 7.Ra8#) 7.Rc7 Ka8 8.Kc6 Kb8 9.Kb6 Ka8 10.Rc8#\"; $board = FenToBoardFactory::create('7k/8/8/8/8/8/8/R6K w - -'); $ravPlay = (new RavPlay($movetext, $board))->validate(); print_r($ravPlay->fen); Array ( [0] => 7k/8/8/8/8/8/8/R6K w - - [1] => 7k/R7/8/8/8/8/8/7K b - - [2] => 6k1/R7/8/8/8/8/8/7K w - - [3] => 6k1/R7/8/8/8/8/6K1/8 b - - [4] => 5k2/R7/8/8/8/8/6K1/8 w - - [5] => 5k2/R7/8/8/8/5K2/8/8 b - - [6] => 4k3/R7/8/8/8/5K2/8/8 w - - [7] => 4k3/R7/8/8/4K3/8/8/8 b - - [8] => 3k4/R7/8/8/4K3/8/8/8 w - - [9] => 3k4/R7/8/3K4/8/8/8/8 b - - [10] => 2k5/R7/8/3K4/8/8/8/8 w - - [11] => 4k3/R7/8/3K4/8/8/8/8 w - - [12] => 4k3/R7/3K4/8/8/8/8/8 b - - [13] => 5k2/R7/3K4/8/8/8/8/8 w - - [14] => 5k2/R7/4K3/8/8/8/8/8 b - - [15] => 6k1/R7/4K3/8/8/8/8/8 w - - [16] => 6k1/R7/5K2/8/8/8/8/8 b - - [17] => 7k/R7/5K2/8/8/8/8/8 w - - [18] => 7k/R7/6K1/8/8/8/8/8 b - - [19] => 6k1/R7/6K1/8/8/8/8/8 w - - [20] => R5k1/8/6K1/8/8/8/8/8 b - - [21] => 2k5/R7/3K4/8/8/8/8/8 b - - [22] => 1k6/R7/3K4/8/8/8/8/8 w - - [23] => 3k4/R7/3K4/8/8/8/8/8 w - - [24] => R2k4/8/3K4/8/8/8/8/8 b - - [25] => 1k6/2R5/3K4/8/8/8/8/8 b - - [26] => k7/2R5/3K4/8/8/8/8/8 w - - [27] => k7/2R5/2K5/8/8/8/8/8 b - - [28] => 1k6/2R5/2K5/8/8/8/8/8 w - - [29] => 1k6/2R5/1K6/8/8/8/8/8 b - - [30] => k7/2R5/1K6/8/8/8/8/8 w - - [31] => k1R5/8/1K6/8/8/8/8/8 b - - ) \ud83c\udf89 So this is amazing! That's all we need to read and write chess tutorials, guides and how-tos.","title":"Recursive Annotation Variation (RAV)"},{"location":"heuristics/","text":"Heuristics \u2728 If you ask a chess pro why a chess move is good, they'll probably give you a bunch of reasons, many of them intuitive, about why they made that decision. It is important to develop your pieces in the opening while trying to control the center of the board at the same time. Castling is an excellent move as long as the king gets safe. Then, in the middlegame space becomes an advantage. And if a complex position can be simplified when you have an advantage, then so much the better. The pawn structure could determine the endgame. The list of reasons goes on and on. The mathematician Claude Shannon came to the conclusion that there are more chess moves than atoms in the universe. The game is complex and you need to learn how to make decisions to play chess like a pro. Since no human can calculate more than, let's say 30 moves ahead, it's all about thinking in terms of heuristics. Heuristics are quick, mental shortcuts that we humans use to make decisions and solve problems in our daily lives. While far from being perfect, heuristics are approximations that help manage cognitive load. Listed below are the chess heuristics implemented in PHP Chess. Heuristic Description Evaluation Absolute fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork involving the enemy king is an absolute fork. Chess\\Eval\\AbsoluteForkEval Absolute pin A tactic that occurs when a piece is shielding the king, so it cannot move out of the line of attack because the king would be put in check. Chess\\Eval\\AbsolutePinEval Absolute skewer A tactic in which the enemy king is involved. The king is in check, and it has to move out of danger exposing a more valuable piece to capture. Only line pieces (bishops, rooks and queens) can skewer. Chess\\Eval\\AbsoluteSkewerEval Advanced pawn A pawn that is on the fifth rank or higher. Chess\\Eval\\AdvancedPawnEval Attack If a piece is under threat of being attacked, it means it could be taken after a sequence of captures resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under attack has an advantage. Chess\\Eval\\AttackEval Backward pawn The last pawn protecting other pawns in its chain. It is considered a weakness because it cannot advance safely. Chess\\Eval\\BackwardPawnEval Bad bishop A bishop that is on the same color as most of own pawns. Chess\\Eval\\BadBishopEval Bishop outpost A bishop on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for another piece. Chess\\Eval\\BishopOutpostEval Bishop pair The player with both bishops may definitely have an advantage, especially in the endgame. Furthermore, two bishops can deliver checkmate. Chess\\Eval\\BishopPairEval Center It is advantageous to control the central squares as well as to place a piece in the center. Chess\\Eval\\CenterEval Checkability Having a king that can be checked is usually considered a disadvantage, and vice versa, it is considered advantageous to have a king that cannot be checked. A checkable king is vulnerable to forcing moves. Chess\\Eval\\CheckabilityEval Connectivity The connectivity of the pieces measures how loosely the pieces are. Chess\\Eval\\ConnectivityEval Defense This heuristic evaluates the defensive strength of each side by analyzing how the removal of attacking pieces would affect the opponent's protection. A higher score indicates a stronger defensive position. Chess\\Eval\\DefenseEval Diagonal opposition The same as direct opposition, but the two kings are apart from each other diagonally. Chess\\Eval\\DiagonalOppositionEval Direct opposition A position in which the kings are facing each other being two squares apart on the same rank or file. In this situation, the player not having to move is said to have the opposition. Chess\\Eval\\DirectOppositionEval Discovered check A discovered check occurs when the opponent's king can be checked by moving a piece out of the way of another. Chess\\Eval\\DiscoveredCheckEval Doubled pawn A pawn is doubled if there are two pawns of the same color on the same file. Chess\\Eval\\DoubledPawnEval Far-advanced pawn A pawn that is threatening to promote. Chess\\Eval\\FarAdvancedPawnEval Flight square The safe squares to which the king can move if it is threatened. Chess\\Eval\\FlightSquareEval Isolated pawn A pawn without friendly pawns on the adjacent files. Since it cannot be defended by other pawns it is considered a weakness. Chess\\Eval\\IsolatedPawnEval King safety An unsafe king leads to uncertainty. The probability of unexpected, forced moves will increase as the opponent's pieces get closer to it. Chess\\Eval\\KingSafetyEval Knight outpost A knight on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for a bishop. Chess\\Eval\\KnightOutpostEval Material The player with the most material points has an advantage. The relative values of the pieces are assigned this way: 1 point to a pawn, 3.2 points to a knight, 3.33 points to a bishop, 5.1 points to a rook and 8.8 points to a queen. Chess\\Eval\\MaterialEval Overloading A piece that is overloaded with defensive tasks is vulnerable because it can be deflected, meaning it could be forced to leave the square it occupies, typically resulting in an advantage for the opponent. Chess\\Eval\\OverloadingEval Passed pawn A pawn with no opposing pawns on either the same file or adjacent files to prevent it from being promoted. Chess\\Eval\\PassedPawnEval Pressure This is a measure of the number of squares targeted by each player that require special attention. It often indicates the step prior to an attack. The player with the greater number of them has an advantage. Chess\\Eval\\PressureEval Protection If a piece is unprotected, it means that there are no other pieces defending it, and therefore it can be taken for free resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under protection has an advantage. Chess\\Eval\\ProtectionEval Relative fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork not involving the enemy king is a relative fork. Chess\\Eval\\RelativeForkEval Relative pin A tactic that occurs when a piece is shielding a more valuable piece, so if it moves out of the line of attack the more valuable piece can be captured resulting in a material gain. Chess\\Eval\\RelativePinEval Space This is a measure of the number of squares controlled by each player. Chess\\Eval\\SpaceEval Square outpost A square protected by a pawn that cannot be attacked by an opponent's pawn. Chess\\Eval\\SqOutpostEval Evaluate a Chess Position Chess\\EvalArray allows to transform a FEN position to a normalized array of values between -1 and +1. -1 is the best possible evaluation for Black and +1 the best possible evaluation for White. Both forces being set to 0 means they're balanced. use Chess\\EvalArray; use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $fen = 'rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq -'; $board = FenToBoardFactory::create($fen); $result = [ 'names' => $f->names(), 'normd' => EvalArray::normalization($f, $board), ]; print_r($result); Array ( [names] => Array ( [0] => Material [1] => Center [2] => Connectivity [3] => Space [4] => Pressure [5] => King safety [6] => Protection [7] => Discovered check [8] => Doubled pawn [9] => Passed pawn [10] => Advanced pawn [11] => Far-advanced pawn [12] => Isolated pawn [13] => Backward pawn [14] => Defense [15] => Absolute skewer [16] => Absolute pin [17] => Relative pin [18] => Absolute fork [19] => Relative fork [20] => Outpost square [21] => Knight outpost [22] => Bishop outpost [23] => Bishop pair [24] => Bad bishop [25] => Diagonal opposition [26] => Direct opposition [27] => Overloading [28] => Back-rank threat [29] => Flight square [30] => Attack [31] => Checkability ) [normd] => Array ( [0] => 0 [1] => 1 [2] => -1 [3] => 0.24 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => 0 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => 0 [30] => 0 [31] => 0 ) ) This data structure is used to estimate who may be better without considering checkmate. Please note that a heuristic evaluation is not the same thing as a chess calculation. Heuristic evaluations are often correct but may fail because they are based on probabilities. Steinitz Evaluation As chess champion William Steinitz pointed out, a strong position can be created by accumulating small advantages. The relative value of the position without considering checkmate is obtained by counting the advantages in the evaluation array. $steinitz = EvalArray::steinitz($f, $board); echo $steinitz; 1 In this example, White is better than Black because the value obtained is a positive number. One evaluation feature is favoring White. Chess evaluation functions often consist in multiplying the terms by a weight and adding the results to construct a linear combination. However, the Steinitz evaluation alone, which is to say just counting the advantages, has proven to be quite accurate as a relative estimate for chess positions in a way that is easy for human players to understand and to learn. Also it can be complemented with other statistical measures such as the mean, median, mode, and standard deviation of the evaluation array without counting the zeros. Mean The mean represents the center of the evaluation array being intermediate to the extreme values. $mean = EvalArray::mean($f, $board); echo $mean; 0.08 Median The median is the value in the middle of the evaluation array. $median = EvalArray::median($f, $board); echo $median; 0.24 Mode The mode is the value that appears most frequently in the evaluation array. $mode = EvalArray::mode($f, $board); echo $mode; NULL In this example, no mode exists since there are no repeating numbers in the evaluation array. Standard Deviation The standard deviation is a measure of how spread out the evaluation array is. $sd = EvalArray::sd($f, $board); echo $sd; 0.8243 Plot the Oscillations of a Game Given a PGN movetext in SAN format, Chess\\SanPlotter returns the oscillations of an evaluation feature in the time domain. use Chess\\SanPlotter; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $name = 'Space'; $movetext = '1.e4 d5 2.exd5 Qxd5'; $time = (new SanPlotter($f, $movetext, $name))->time; print_r($time); Array ( [0] => 0 [1] => 1 [2] => 0.25 [3] => 0.5 [4] => -1 ) The data is plotted in a way that is easy for chess players to understand and learn. Extract Chess Data Given a PGN movetext in SAN format, Chess\\SanExtractor returns the oscillations of all evaluation features for data analysis purposes like the following example. use Chess\\SanExtractor; use Chess\\Function\\CompleteFunction; use Chess\\Variant\\Classical\\Board; $f = new CompleteFunction(); $board = new Board(); $movetext = '1.e4 d5 2.exd5 Qxd5'; Evaluation Array This is how component number four, which is to say the normalization of the fourth evaluation array, is obtained from the example above. $eval = SanExtractor::eval($f, $board, $movetext); print_r($eval[4]); Array ( [0] => 0 [1] => -1 [2] => 1 [3] => -0.24 [4] => -0.07 [5] => -0.02 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => -0.11 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => -0.02 [30] => 0 [31] => 0 ) The evaluation array can be plotted in a way that is easy for chess players to understand and learn. Mean $mean = SanExtractor::mean($f, $board, $movetext); print_r($mean); ( [0] => 0 [1] => 0.185 [2] => -0.16 [3] => -0.315 [4] => -0.0657 ) Standard Deviation $sd = SanExtractor::sd($f, $board, $movetext); print_r($sd); Array ( [0] => 0 [1] => 0.7591 [2] => -0.8552 [3] => -0.7274 [4] => -0.5406 ) \ud83c\udf89 So chess positions and games can be plotted on charts and processed with machine learning techniques. Become a better player by extracting knowledge from games with the help of Data Mining tools.","title":"Heuristics"},{"location":"heuristics/#heuristics","text":"\u2728 If you ask a chess pro why a chess move is good, they'll probably give you a bunch of reasons, many of them intuitive, about why they made that decision. It is important to develop your pieces in the opening while trying to control the center of the board at the same time. Castling is an excellent move as long as the king gets safe. Then, in the middlegame space becomes an advantage. And if a complex position can be simplified when you have an advantage, then so much the better. The pawn structure could determine the endgame. The list of reasons goes on and on. The mathematician Claude Shannon came to the conclusion that there are more chess moves than atoms in the universe. The game is complex and you need to learn how to make decisions to play chess like a pro. Since no human can calculate more than, let's say 30 moves ahead, it's all about thinking in terms of heuristics. Heuristics are quick, mental shortcuts that we humans use to make decisions and solve problems in our daily lives. While far from being perfect, heuristics are approximations that help manage cognitive load. Listed below are the chess heuristics implemented in PHP Chess. Heuristic Description Evaluation Absolute fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork involving the enemy king is an absolute fork. Chess\\Eval\\AbsoluteForkEval Absolute pin A tactic that occurs when a piece is shielding the king, so it cannot move out of the line of attack because the king would be put in check. Chess\\Eval\\AbsolutePinEval Absolute skewer A tactic in which the enemy king is involved. The king is in check, and it has to move out of danger exposing a more valuable piece to capture. Only line pieces (bishops, rooks and queens) can skewer. Chess\\Eval\\AbsoluteSkewerEval Advanced pawn A pawn that is on the fifth rank or higher. Chess\\Eval\\AdvancedPawnEval Attack If a piece is under threat of being attacked, it means it could be taken after a sequence of captures resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under attack has an advantage. Chess\\Eval\\AttackEval Backward pawn The last pawn protecting other pawns in its chain. It is considered a weakness because it cannot advance safely. Chess\\Eval\\BackwardPawnEval Bad bishop A bishop that is on the same color as most of own pawns. Chess\\Eval\\BadBishopEval Bishop outpost A bishop on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for another piece. Chess\\Eval\\BishopOutpostEval Bishop pair The player with both bishops may definitely have an advantage, especially in the endgame. Furthermore, two bishops can deliver checkmate. Chess\\Eval\\BishopPairEval Center It is advantageous to control the central squares as well as to place a piece in the center. Chess\\Eval\\CenterEval Checkability Having a king that can be checked is usually considered a disadvantage, and vice versa, it is considered advantageous to have a king that cannot be checked. A checkable king is vulnerable to forcing moves. Chess\\Eval\\CheckabilityEval Connectivity The connectivity of the pieces measures how loosely the pieces are. Chess\\Eval\\ConnectivityEval Defense This heuristic evaluates the defensive strength of each side by analyzing how the removal of attacking pieces would affect the opponent's protection. A higher score indicates a stronger defensive position. Chess\\Eval\\DefenseEval Diagonal opposition The same as direct opposition, but the two kings are apart from each other diagonally. Chess\\Eval\\DiagonalOppositionEval Direct opposition A position in which the kings are facing each other being two squares apart on the same rank or file. In this situation, the player not having to move is said to have the opposition. Chess\\Eval\\DirectOppositionEval Discovered check A discovered check occurs when the opponent's king can be checked by moving a piece out of the way of another. Chess\\Eval\\DiscoveredCheckEval Doubled pawn A pawn is doubled if there are two pawns of the same color on the same file. Chess\\Eval\\DoubledPawnEval Far-advanced pawn A pawn that is threatening to promote. Chess\\Eval\\FarAdvancedPawnEval Flight square The safe squares to which the king can move if it is threatened. Chess\\Eval\\FlightSquareEval Isolated pawn A pawn without friendly pawns on the adjacent files. Since it cannot be defended by other pawns it is considered a weakness. Chess\\Eval\\IsolatedPawnEval King safety An unsafe king leads to uncertainty. The probability of unexpected, forced moves will increase as the opponent's pieces get closer to it. Chess\\Eval\\KingSafetyEval Knight outpost A knight on an outpost square is considered a positional advantage because it cannot be attacked by enemy pawns, and as a result, it is often exchanged for a bishop. Chess\\Eval\\KnightOutpostEval Material The player with the most material points has an advantage. The relative values of the pieces are assigned this way: 1 point to a pawn, 3.2 points to a knight, 3.33 points to a bishop, 5.1 points to a rook and 8.8 points to a queen. Chess\\Eval\\MaterialEval Overloading A piece that is overloaded with defensive tasks is vulnerable because it can be deflected, meaning it could be forced to leave the square it occupies, typically resulting in an advantage for the opponent. Chess\\Eval\\OverloadingEval Passed pawn A pawn with no opposing pawns on either the same file or adjacent files to prevent it from being promoted. Chess\\Eval\\PassedPawnEval Pressure This is a measure of the number of squares targeted by each player that require special attention. It often indicates the step prior to an attack. The player with the greater number of them has an advantage. Chess\\Eval\\PressureEval Protection If a piece is unprotected, it means that there are no other pieces defending it, and therefore it can be taken for free resulting in a material gain. This indicates a forcing move in that a player is to reply in a certain way. On the next turn, it should be defended by a piece or moved to a safe square. The player with the greater number of material points under protection has an advantage. Chess\\Eval\\ProtectionEval Relative fork A tactic in which a piece attacks multiple pieces at the same time. It is a double attack. A fork not involving the enemy king is a relative fork. Chess\\Eval\\RelativeForkEval Relative pin A tactic that occurs when a piece is shielding a more valuable piece, so if it moves out of the line of attack the more valuable piece can be captured resulting in a material gain. Chess\\Eval\\RelativePinEval Space This is a measure of the number of squares controlled by each player. Chess\\Eval\\SpaceEval Square outpost A square protected by a pawn that cannot be attacked by an opponent's pawn. Chess\\Eval\\SqOutpostEval","title":"Heuristics"},{"location":"heuristics/#evaluate-a-chess-position","text":"Chess\\EvalArray allows to transform a FEN position to a normalized array of values between -1 and +1. -1 is the best possible evaluation for Black and +1 the best possible evaluation for White. Both forces being set to 0 means they're balanced. use Chess\\EvalArray; use Chess\\FenToBoardFactory; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $fen = 'rnbqkb1r/p1pp1ppp/1p2pn2/8/2PP4/2N2N2/PP2PPPP/R1BQKB1R b KQkq -'; $board = FenToBoardFactory::create($fen); $result = [ 'names' => $f->names(), 'normd' => EvalArray::normalization($f, $board), ]; print_r($result); Array ( [names] => Array ( [0] => Material [1] => Center [2] => Connectivity [3] => Space [4] => Pressure [5] => King safety [6] => Protection [7] => Discovered check [8] => Doubled pawn [9] => Passed pawn [10] => Advanced pawn [11] => Far-advanced pawn [12] => Isolated pawn [13] => Backward pawn [14] => Defense [15] => Absolute skewer [16] => Absolute pin [17] => Relative pin [18] => Absolute fork [19] => Relative fork [20] => Outpost square [21] => Knight outpost [22] => Bishop outpost [23] => Bishop pair [24] => Bad bishop [25] => Diagonal opposition [26] => Direct opposition [27] => Overloading [28] => Back-rank threat [29] => Flight square [30] => Attack [31] => Checkability ) [normd] => Array ( [0] => 0 [1] => 1 [2] => -1 [3] => 0.24 [4] => 0 [5] => 0 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => 0 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => 0 [30] => 0 [31] => 0 ) ) This data structure is used to estimate who may be better without considering checkmate. Please note that a heuristic evaluation is not the same thing as a chess calculation. Heuristic evaluations are often correct but may fail because they are based on probabilities.","title":"Evaluate a Chess Position"},{"location":"heuristics/#steinitz-evaluation","text":"As chess champion William Steinitz pointed out, a strong position can be created by accumulating small advantages. The relative value of the position without considering checkmate is obtained by counting the advantages in the evaluation array. $steinitz = EvalArray::steinitz($f, $board); echo $steinitz; 1 In this example, White is better than Black because the value obtained is a positive number. One evaluation feature is favoring White. Chess evaluation functions often consist in multiplying the terms by a weight and adding the results to construct a linear combination. However, the Steinitz evaluation alone, which is to say just counting the advantages, has proven to be quite accurate as a relative estimate for chess positions in a way that is easy for human players to understand and to learn. Also it can be complemented with other statistical measures such as the mean, median, mode, and standard deviation of the evaluation array without counting the zeros.","title":"Steinitz Evaluation"},{"location":"heuristics/#mean","text":"The mean represents the center of the evaluation array being intermediate to the extreme values. $mean = EvalArray::mean($f, $board); echo $mean; 0.08","title":"Mean"},{"location":"heuristics/#median","text":"The median is the value in the middle of the evaluation array. $median = EvalArray::median($f, $board); echo $median; 0.24","title":"Median"},{"location":"heuristics/#mode","text":"The mode is the value that appears most frequently in the evaluation array. $mode = EvalArray::mode($f, $board); echo $mode; NULL In this example, no mode exists since there are no repeating numbers in the evaluation array.","title":"Mode"},{"location":"heuristics/#standard-deviation","text":"The standard deviation is a measure of how spread out the evaluation array is. $sd = EvalArray::sd($f, $board); echo $sd; 0.8243","title":"Standard Deviation"},{"location":"heuristics/#plot-the-oscillations-of-a-game","text":"Given a PGN movetext in SAN format, Chess\\SanPlotter returns the oscillations of an evaluation feature in the time domain. use Chess\\SanPlotter; use Chess\\Function\\CompleteFunction; $f = new CompleteFunction(); $name = 'Space'; $movetext = '1.e4 d5 2.exd5 Qxd5'; $time = (new SanPlotter($f, $movetext, $name))->time; print_r($time); Array ( [0] => 0 [1] => 1 [2] => 0.25 [3] => 0.5 [4] => -1 ) The data is plotted in a way that is easy for chess players to understand and learn.","title":"Plot the Oscillations of a Game"},{"location":"heuristics/#extract-chess-data","text":"Given a PGN movetext in SAN format, Chess\\SanExtractor returns the oscillations of all evaluation features for data analysis purposes like the following example. use Chess\\SanExtractor; use Chess\\Function\\CompleteFunction; use Chess\\Variant\\Classical\\Board; $f = new CompleteFunction(); $board = new Board(); $movetext = '1.e4 d5 2.exd5 Qxd5';","title":"Extract Chess Data"},{"location":"heuristics/#evaluation-array","text":"This is how component number four, which is to say the normalization of the fourth evaluation array, is obtained from the example above. $eval = SanExtractor::eval($f, $board, $movetext); print_r($eval[4]); Array ( [0] => 0 [1] => -1 [2] => 1 [3] => -0.24 [4] => -0.07 [5] => -0.02 [6] => 0 [7] => 0 [8] => 0 [9] => 0 [10] => 0 [11] => 0 [12] => 0 [13] => 0 [14] => -0.11 [15] => 0 [16] => 0 [17] => 0 [18] => 0 [19] => 0 [20] => 0 [21] => 0 [22] => 0 [23] => 0 [24] => 0 [25] => 0 [26] => 0 [27] => 0 [28] => 0 [29] => -0.02 [30] => 0 [31] => 0 ) The evaluation array can be plotted in a way that is easy for chess players to understand and learn.","title":"Evaluation Array"},{"location":"heuristics/#mean_1","text":"$mean = SanExtractor::mean($f, $board, $movetext); print_r($mean); ( [0] => 0 [1] => 0.185 [2] => -0.16 [3] => -0.315 [4] => -0.0657 )","title":"Mean"},{"location":"heuristics/#standard-deviation_1","text":"$sd = SanExtractor::sd($f, $board, $movetext); print_r($sd); Array ( [0] => 0 [1] => 0.7591 [2] => -0.8552 [3] => -0.7274 [4] => -0.5406 ) \ud83c\udf89 So chess positions and games can be plotted on charts and processed with machine learning techniques. Become a better player by extracting knowledge from games with the help of Data Mining tools.","title":"Standard Deviation"},{"location":"play-chess/","text":"Play Chess Play Randomly \u2728 Sometimes you want to play a random game of chess. You could loop 50 times and play a move by instantiating the Chess\\Computer\\RandomMove class like in the example below. use Chess\\Computer\\RandomMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); for ($i = 0; $i < 50; $i++) { if ($move = (new RandomMove($board))->move()) { $board->play($board->turn, $move['pgn']); } } echo $board->movetext(); 1.e4 Nc6 2.Qf3 g6 3.b3 Rb8 4.Bb5 Nh6 5.Ke2 Na5 6.c3 Ng4 7.d3 h6 8.h4 Ra8 9.Kd1 b6 10.Ba4 h5 11.b4 Rh7 12.Bc2 Rh8 13.Ke1 a6 14.Kd1 Nb3 15.d4 Na5 16.g3 c6 17.Ne2 Ne5 18.Nf4 d6 19.Nxg6 Kd7 20.b5 Qe8 21.Na3 e6 22.Bd3 Rb8 23.dxe5 dxe5 24.Bb2 Rg8 25.Qg4 Ra8 The result obtained is a 24 move game since a move is considered to be completed after both players have played a turn. Play Like a Grandmaster \u2728 The players.json file in the Chess Server contains thousands of games by titled FIDE players. This file can be generated with the command line tools available in the Chess Data repo. Chess\\Computer\\GrandmasterMove figures out the next move to be made based on the players.json file that is passed to its constructor. use Chess\\Computer\\GrandmasterMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $gmMove = (new GrandmasterMove(__DIR__.'/../data/json/players.json'))->move($board); print_r($gmMove); Array ( [pgn] => c5 [game] => Array ( [Event] => Tilburg [Site] => Tilburg [Date] => 1993.??.?? [White] => Morozevich, Alexander [Black] => Adams, Michael [Result] => 1-0 [ECO] => B23 [movetext] => 1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 Nd4 6.Nxd4 cxd4 7.Ne2 a6 8.Ba4 b5 9.Bb3 e6 10.O-O Ne7 11.d3 O-O 12.Qe1 f5 13.Bd2 Nc6 14.Kh1 Bb7 15.Ng1 h6 16.Nf3 Kh7 17.Qg3 Qe7 18.Rae1 a5 19.a3 Rab8 20.Nh4 Qf7 21.Qh3 Ba8 22.Rf3 a4 23.Ba2 b4 24.Bc1 b3 25.cxb3 axb3 26.Bb1 d6 27.Bd2 Kg8 28.g4 Ne7 29.gxf5 gxf5 30.Rg3 Kh7 31.Nf3 Bf6 32.Ng5+ Bxg5 33.fxg5 Ng6 34.Qxh6+ Kg8 35.h4 f4 36.Rh3 Rb7 37.h5 Ne5 38.Rg1 Rc7 39.Rh4 Qe8 40.g6 ) ) \ud83c\udf89 Let's now put our knowledge of chess openings to the test. Play Computer \u2728 The Universal Chess Interface (UCI) is an open communication protocol that enables chess engines to communicate with user interfaces. PHP Chess provides the Chess\\UciEngine\\UciEngine class representing an UCI engine. To follow this tutorial make sure to install Stockfish if you haven't already. sudo apt-get install stockfish Then, you are set up to play chess against the computer as described in the following example. use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $limit = new Limit(); $limit->depth = 3; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 9); $analysis = $stockfish->analysis($board, $limit); $board->playLan('b', $analysis['bestmove']); echo $board->movetext(); 1.e4 Nf6 You may want to play against Stockfish starting from a particular FEN with the help of Chess\\FenToBoardFactory . use Chess\\FenToBoardFactory; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $board = FenToBoardFactory::create('4k2r/pp1b1pp1/8/3pPp1p/P2P1P2/1P3N2/1qr3PP/R3QR1K w k -'); $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.Rb1 The FEN is converted to a chess board object as described in the Format Converters section. Then Stockfish's depth limit is set to 12 and the skill level to 20 . The same thing goes to starting a game from a particular SAN movetext. As you can see in the example below, Chess\\Play\\SanPlay is used for this purpose. use Chess\\Play\\SanPlay; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = (new SanPlay($movetext))->validate()->board; $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 \ud83c\udf89 Can you beat the computer? Keep it up!","title":"Play Chess"},{"location":"play-chess/#play-chess","text":"","title":"Play Chess"},{"location":"play-chess/#play-randomly","text":"\u2728 Sometimes you want to play a random game of chess. You could loop 50 times and play a move by instantiating the Chess\\Computer\\RandomMove class like in the example below. use Chess\\Computer\\RandomMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); for ($i = 0; $i < 50; $i++) { if ($move = (new RandomMove($board))->move()) { $board->play($board->turn, $move['pgn']); } } echo $board->movetext(); 1.e4 Nc6 2.Qf3 g6 3.b3 Rb8 4.Bb5 Nh6 5.Ke2 Na5 6.c3 Ng4 7.d3 h6 8.h4 Ra8 9.Kd1 b6 10.Ba4 h5 11.b4 Rh7 12.Bc2 Rh8 13.Ke1 a6 14.Kd1 Nb3 15.d4 Na5 16.g3 c6 17.Ne2 Ne5 18.Nf4 d6 19.Nxg6 Kd7 20.b5 Qe8 21.Na3 e6 22.Bd3 Rb8 23.dxe5 dxe5 24.Bb2 Rg8 25.Qg4 Ra8 The result obtained is a 24 move game since a move is considered to be completed after both players have played a turn.","title":"Play Randomly"},{"location":"play-chess/#play-like-a-grandmaster","text":"\u2728 The players.json file in the Chess Server contains thousands of games by titled FIDE players. This file can be generated with the command line tools available in the Chess Data repo. Chess\\Computer\\GrandmasterMove figures out the next move to be made based on the players.json file that is passed to its constructor. use Chess\\Computer\\GrandmasterMove; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $gmMove = (new GrandmasterMove(__DIR__.'/../data/json/players.json'))->move($board); print_r($gmMove); Array ( [pgn] => c5 [game] => Array ( [Event] => Tilburg [Site] => Tilburg [Date] => 1993.??.?? [White] => Morozevich, Alexander [Black] => Adams, Michael [Result] => 1-0 [ECO] => B23 [movetext] => 1.e4 c5 2.Nc3 Nc6 3.f4 g6 4.Nf3 Bg7 5.Bb5 Nd4 6.Nxd4 cxd4 7.Ne2 a6 8.Ba4 b5 9.Bb3 e6 10.O-O Ne7 11.d3 O-O 12.Qe1 f5 13.Bd2 Nc6 14.Kh1 Bb7 15.Ng1 h6 16.Nf3 Kh7 17.Qg3 Qe7 18.Rae1 a5 19.a3 Rab8 20.Nh4 Qf7 21.Qh3 Ba8 22.Rf3 a4 23.Ba2 b4 24.Bc1 b3 25.cxb3 axb3 26.Bb1 d6 27.Bd2 Kg8 28.g4 Ne7 29.gxf5 gxf5 30.Rg3 Kh7 31.Nf3 Bf6 32.Ng5+ Bxg5 33.fxg5 Ng6 34.Qxh6+ Kg8 35.h4 f4 36.Rh3 Rb7 37.h5 Ne5 38.Rg1 Rc7 39.Rh4 Qe8 40.g6 ) ) \ud83c\udf89 Let's now put our knowledge of chess openings to the test.","title":"Play Like a Grandmaster"},{"location":"play-chess/#play-computer","text":"\u2728 The Universal Chess Interface (UCI) is an open communication protocol that enables chess engines to communicate with user interfaces. PHP Chess provides the Chess\\UciEngine\\UciEngine class representing an UCI engine. To follow this tutorial make sure to install Stockfish if you haven't already. sudo apt-get install stockfish Then, you are set up to play chess against the computer as described in the following example. use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; use Chess\\Variant\\Classical\\Board; $board = new Board(); $board->play('w', 'e4'); $limit = new Limit(); $limit->depth = 3; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 9); $analysis = $stockfish->analysis($board, $limit); $board->playLan('b', $analysis['bestmove']); echo $board->movetext(); 1.e4 Nf6 You may want to play against Stockfish starting from a particular FEN with the help of Chess\\FenToBoardFactory . use Chess\\FenToBoardFactory; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $board = FenToBoardFactory::create('4k2r/pp1b1pp1/8/3pPp1p/P2P1P2/1P3N2/1qr3PP/R3QR1K w k -'); $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.Rb1 The FEN is converted to a chess board object as described in the Format Converters section. Then Stockfish's depth limit is set to 12 and the skill level to 20 . The same thing goes to starting a game from a particular SAN movetext. As you can see in the example below, Chess\\Play\\SanPlay is used for this purpose. use Chess\\Play\\SanPlay; use Chess\\UciEngine\\UciEngine; use Chess\\UciEngine\\Details\\Limit; $movetext = '1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7'; $board = (new SanPlay($movetext))->validate()->board; $limit = new Limit(); $limit->depth = 12; $stockfish = (new UciEngine('/usr/games/stockfish'))->setOption('Skill Level', 20); $analysis = $stockfish->analysis($board, $limit); $board->playLan('w', $analysis['bestmove']); echo $board->movetext(); 1.d4 Nf6 2.c4 c5 3.d5 e6 4.Nc3 exd5 5.cxd5 d6 6.e4 g6 7.Nf3 Bg7 8.h3 \ud83c\udf89 Can you beat the computer? Keep it up!","title":"Play Computer"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index c9469e679..932e6ac88 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,32 +2,32 @@ https://chesslablab.github.io/php-chess/ - 2025-01-03 + 2025-01-05 daily https://chesslablab.github.io/php-chess/chess-tutor/ - 2025-01-03 + 2025-01-05 daily https://chesslablab.github.io/php-chess/format-converters/ - 2025-01-03 + 2025-01-05 daily https://chesslablab.github.io/php-chess/getting-started/ - 2025-01-03 + 2025-01-05 daily https://chesslablab.github.io/php-chess/heuristics/ - 2025-01-03 + 2025-01-05 daily https://chesslablab.github.io/php-chess/play-chess/ - 2025-01-03 + 2025-01-05 daily \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 42fde5af9d91ce3f6d95d540a6232e10cfdab749..a5ed24b7676abd6952becc85d62a17b865ba0b1d 100644 GIT binary patch delta 251 zcmV#1UHN5c8Xq(=-Y2 zXa}7^q|!?;jus%FPFagrrgjzCoZvBAtO?1eISWu43IYiFLQV7@-FOi`$?R(~Uv^|8 zXZ1Q*0}iQEhx%~j^`6&9l01DYnQ=Py_FC+x>a-8{My@;$D*1!;8^ERKIASW>hrOmU zXyhhEsyb5Pw~yRgM7ob0P!n;tePCzD;sL$+2Zx)3zW>!jTL$_^)Hi58Fk*KE006RV Bb`nD5v2cU!oBmxXO&3gMeX*K12(v(?< z5A(P669$^&*AS|!E#OmZ*#1UHN5c8Xq(=-Y2 zXa}7^q|!?;jus#vPFagrrgjzCoZvoNtO?1eISWu43IYiFOilD2-FOy0$?R(~Uv^|8 zXZ1Q*0}iQEhx+i$>picZNb>NlWX9>(+e@*Zs?$E)8oBb^spJpVZvdB`U zpplytsp?3D-#&705$Qg1KuyHm_JN%piwE@P9~^ED`u0~3Z5ikvQQu&hc3gJ^000GP Bc{2b2