Support for arrow and highlight actions in pgn

This commit is contained in:
DHTMLGoodies
2017-03-29 18:48:07 +02:00
parent 126dc9b599
commit 40a19a7551
5 changed files with 634 additions and 3 deletions

View File

@@ -8,7 +8,7 @@ class CHESS_JSON {
const FEN = 'fen'; const FEN = 'fen';
const MOVE_COMMENT = 'comment'; const MOVE_COMMENT = 'comment';
const MOVE_CLOCK = 'clk'; const MOVE_CLOCK = 'clk';
const MOVE_ACTION = 'action'; const MOVE_ACTIONS = 'actions';
const MOVE_VARIATIONS = 'variations'; const MOVE_VARIATIONS = 'variations';
const MOVE_MOVES = 'moves'; const MOVE_MOVES = 'moves';
const MOVE_CAPTURE = 'capture'; const MOVE_CAPTURE = 'capture';
@@ -22,6 +22,9 @@ class CHESS_JSON {
const GAME_BLACK = 'black'; const GAME_BLACK = 'black';
const GAME_ECO = 'black'; const GAME_ECO = 'black';
const PGN_KEY_ACTION_ARROW = "ar";
const PGN_KEY_ACTION_HIGHLIGHT = "hl";
protected static $jsKeys = array('MOVE_FROM', 'MOVE_TO', 'MOVE_NOTATION', 'FEN','MOVE_COMMENT', protected static $jsKeys = array('MOVE_FROM', 'MOVE_TO', 'MOVE_NOTATION', 'FEN','MOVE_COMMENT',
'MOVE_ACTION', 'MOVE_VARIATIONS', 'MOVE_MOVES','MOVE_CAPTURE','MOVE_PROMOTE_TO','MOVE_CASTLE', 'MOVE_ACTION', 'MOVE_VARIATIONS', 'MOVE_MOVES','MOVE_CAPTURE','MOVE_PROMOTE_TO','MOVE_CASTLE',

View File

@@ -52,12 +52,78 @@ class MoveBuilder {
$comment = str_replace('[%clk ' . $clk . ']', '', $comment); $comment = str_replace('[%clk ' . $clk . ']', '', $comment);
$this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_CLOCK] = $clk; $this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_CLOCK] = $clk;
} }
$actions = $this->getActions($comment);
if(!empty($actions)){
if(empty($this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_ACTIONS])){
$this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_ACTIONS] = array();
}
foreach($actions as $action){
$this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_ACTIONS][] = $action;
}
}
$comment = preg_replace('/\[%'.CHESS_JSON::PGN_KEY_ACTION_ARROW . '[^\]]+?\]/si', '', $comment );
$comment = preg_replace('/\[%'.CHESS_JSON::PGN_KEY_ACTION_HIGHLIGHT . '[^\]]+?\]/si', '', $comment );
$comment = trim($comment);
if(empty($comment))return; if(empty($comment))return;
$this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_COMMENT] = $comment; $this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_COMMENT] = $comment;
} }
private function getActions($comment){
$ret = array();
if(strstr($comment,'[%' . CHESS_JSON::PGN_KEY_ACTION_ARROW )){
$arrow = preg_replace('/.*?\[%'. CHESS_JSON::PGN_KEY_ACTION_ARROW . ' ([^\]]+?)\].*/si', '$1', $comment);
$arrows = explode(",", $arrow);
foreach($arrows as $arrow){
$tokens = explode(";", $arrow);
if(strlen($tokens[0]) == 4){
$action = array(
"from" => substr($arrow,0,2),
"to" => substr($arrow, 2,2)
);
if(count($tokens) > 1){
$action["color"] = $tokens[1];
}
$ret[] = $this->toAction("arrow", $action);
}
}
}
if(strstr($comment,'[%' . CHESS_JSON::PGN_KEY_ACTION_HIGHLIGHT )){
$arrow = preg_replace('/.*?\[%'. CHESS_JSON::PGN_KEY_ACTION_HIGHLIGHT . ' ([^\]]+?)\].*/si', '$1', $comment);
$arrows = explode(",", $arrow);
foreach($arrows as $arrow){
$tokens = explode(";", $arrow);
if(strlen($tokens[0]) == 2){
$action = array(
"square" => substr($arrow,0,2)
);
if(count($tokens) > 1){
$action["color"] = $tokens[1];
}
$ret[] = $this->toAction("highlight", $action);
}
}
}
return $ret;
}
/**
* @param string $key
* @param array $val
*
* @return array
*/
private function toAction($key, $val){
$val["type"] = $key;
return $val;
}
public function startVariation(){ public function startVariation(){
$index = count($this->moveReferences[$this->pointer])-1; $index = count($this->moveReferences[$this->pointer])-1;
if(!isset($this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_VARIATIONS])){ if(!isset($this->moveReferences[$this->pointer][$index][CHESS_JSON::MOVE_VARIATIONS])){

View File

@@ -2046,7 +2046,96 @@ Rc8 Ne6+ 72. Kf6 d2 73. c5+ Kd7 0-1';
$m = json_encode($game['moves'][0]); $m = json_encode($game['moves'][0]);
$this->assertNotEmpty($game['moves'][0]['clk'], "Move: ". $m); $this->assertNotEmpty($game['moves'][0]['clk'], "Move: ". $m);
$this->assertEquals('1:59:56',$game['moves'][0]['clk']); $this->assertEquals('1:59:56',$game['moves'][0]['clk']);
}
/* START action tests */
/**
* @test
*/
public function shouldHandleArrowsInComments(){
// given
$pgnParser = new PgnParser("pgn/pgn-with-arrows.pgn");
// when
$game = $pgnParser->getGameByIndex(0);
$m = $game["moves"][7];
// then
$this->assertEquals("e3", $m["m"]);
$this->assertNotEmpty($m[CHESS_JSON::MOVE_ACTIONS]);
$this->assertCount(2, $m[CHESS_JSON::MOVE_ACTIONS], json_encode($m));
$this->assertFalse(isset($m[CHESS_JSON::MOVE_COMMENT]));
$actions = $m[CHESS_JSON::MOVE_ACTIONS];
$this->assertEquals("a1", $actions[0]["from"]);
$this->assertEquals("a8", $actions[0]["to"]);
$this->assertEquals("a8", $actions[1]["from"]);
$this->assertEquals("h8", $actions[1]["to"]);
}
/**
* @test
*/
public function shouldParseColorsOfArrows(){
// given
$pgnParser = new PgnParser("pgn/pgn-with-arrows.pgn");
// when
$game = $pgnParser->getGameByIndex(0);
$m = $game["moves"][10];
// then
$this->assertEquals("d5", $m["m"]);
$this->assertNotEmpty($m[CHESS_JSON::MOVE_ACTIONS]);
$this->assertCount(5, $m[CHESS_JSON::MOVE_ACTIONS], json_encode($m));
$actions = $m[CHESS_JSON::MOVE_ACTIONS];
$this->assertEquals("h1", $actions[0]["from"]);
$this->assertEquals("h8", $actions[0]["to"]);
$this->assertEquals("#f00", $actions[0]["color"]);
}
/**
* @test
*/
public function shouldHandlePrefaceArrows(){
// given
$pgnParser = new PgnParser("pgn/pgn-with-arrows.pgn");
// when
$game = $pgnParser->getGameByIndex(0);
$m = $game["moves"][0];
// then
$this->assertFalse(isset($m['m']));
$this->assertNotEmpty($m[CHESS_JSON::MOVE_ACTIONS]);
$this->assertCount(4, $m[CHESS_JSON::MOVE_ACTIONS], json_encode($m));
$actions = $m[CHESS_JSON::MOVE_ACTIONS];
$this->assertEquals("e2", $actions[0]["from"]);
$this->assertEquals("e4", $actions[0]["to"]);
}
/**
* @test
*/
public function shouldHandleHighlightedSquaresBeforeFirstMove(){
// given
$pgnParser = new PgnParser("pgn/pgn-with-arrows.pgn");
// when
$game = $pgnParser->getGameByIndex(0);
$m = $game["moves"][0];
// then
$this->assertFalse(isset($m['m']));
$this->assertNotEmpty($m[CHESS_JSON::MOVE_ACTIONS]);
$this->assertCount(4, $m[CHESS_JSON::MOVE_ACTIONS], json_encode($m));
$actions = $m[CHESS_JSON::MOVE_ACTIONS];
$this->assertEquals("e2", $actions[2]["square"]);
$this->assertEquals("highlight", $actions[2]["type"]);
} }
@@ -2226,4 +2315,19 @@ Rc8 Ne6+ 72. Kf6 d2 73. c5+ Kd7 0-1';
// No exception // No exception
$this->assertCount(5, $game["moves"] ); $this->assertCount(5, $game["moves"] );
} }
/**
* @test
*/
public function shouldParseProblematic_3(){
// given
$parser = new PgnParser("pgn/problematic3.pgn");
// when
$games = $parser->getGames();
// then
$this->assertEquals(30, count($games));
}
} }

View File

@@ -0,0 +1,35 @@
[Event "London Chess Classic 2016"]
[Site "London"]
[Date "2016.12.18"]
[Round "9.1"]
[White "So, Wesley"]
[Black "Vachier-Lagrave, Maxime"]
[Result "1/2-1/2"]
[BlackElo "2804"]
[WhiteElo "2794"]
[LiveChessVersion "1.4.8"]
[ECO "A04"]
{[%ar e2e4,e4e5] [%hl e2,e4]}1. Nf3 c5 2. c4 Nc6
3. Nc3 e5 4. e3 {[%ar a1a8,a8h8]}
Nf6 5. Be2 d5 {[%ar h1h8;#f00,h4a4] [%hl h1,h8,h4]}
6. d4 cxd4 7. exd4 e4
8. Ne5 dxc4 9. Bxc4
Nxe5 10. dxe5 Qxd1+
11. Kxd1 Ng4 12. e6
fxe6 13. Nxe4 Bd7
14. f3 Ne5 15. Bb3
Rd8 16. Bd2 Nd3
17. Kc2 Nb4+ 18. Bxb4
Bxb4 19. Nc3 Ke7
20. Rhe1 Bxc3 21. Kxc3
Rc8+ 22. Kd2 Rhd8
23. Ke3 e5 24. Rad1
Bc6 25. h4 h6
26. a3 Rxd1 27. Rxd1 Rf8
28. Rf1 Rf4 29. g3
Rd4 30. Rd1 Rxd1
31. Bxd1 g5 32. hxg5
hxg5 33. f4 gxf4+
34. gxf4 exf4+ 35. Kxf4
1/2-1/2

423
test/pgn/problematic3.pgn Normal file
View File

@@ -0,0 +1,423 @@
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "r5k1/3R1ppp/4pb2/8/p7/4P3/5PPP/1R4K1 w - - 0 1"]
[PlyCount "3"]
[EventDate "2013.??.??"]
1. Ra7 Rc8 2. Rxa4 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "1r3r1k/1pqb3p/pR1N4/P2P4/8/5pQ1/2P2PPP/1R4K1 w - - 0 1"]
[PlyCount "4"]
[EventDate "2013.??.??"]
1. Nf7+ Rxf7 2. Qxc7 Re8 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[Annotator "WANDEROZ"]
[SetUp "1"]
[FEN "4r1k1/1pb3qp/p1b2p2/3p4/3P4/P2BBQ2/1P3PP1/2R3K1 w - - 0 1"]
[PlyCount "3"]
[EventDate "2013.??.??"]
1. Bxa6 Qf7 2. Bd3 (2. Be2) (2. Bf1) 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "2k1r3/pp2r3/1np4n/3p2qN/8/1Q6/PPP5/1K4RR b - - 0 1"]
[PlyCount "5"]
1... Qxg1+ 2. Rxg1 Re1+ 3. Rxe1 Rxe1# 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "r6k/6rp/1n3N1Q/pq1PNp2/1pp5/P7/1PR3PP/6K1 w - - 0 1"]
[PlyCount "3"]
1. Ng6+ Rxg6 2. Qxh7# 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "1r2r1k1/1p4p1/p2pp2p/4N1q1/Pp2Pn2/1P4N1/3Q1PPP/R3R1K1 b - - 0 1"]
[PlyCount "23"]
1... Nh3+ 2. gxh3 Qxd2 3. Nc4 Qc2 4. Rab1 Rf8 5. Rb2 Qc3 6. Rbb1 d5 7. exd5
exd5 8. Ne3 d4 9. Nef5 Rbe8 10. Red1 Qf3 11. Rxd4 Rxf5 12. Nxf5 Qxf5 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "3Rrk2/p1r1ppbp/2p1b1p1/2B5/8/2P2B2/PP3PPP/3R2K1 w - - 0 1"]
[PlyCount "17"]
[EventDate "2013.??.??"]
1. Bxa7 Bd5 2. Rxe8+ Kxe8 3. Bxd5 cxd5 4. Bd4 e5 5. Re1 Re7 6. Bc5 Rb7 7. b4 e4
8. Rc1 Kd7 9. a4 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "r2qk2r/pppnbp1p/3nb1pQ/3pN3/3P4/3B4/PPP2PPP/RNB1R1K1 w kq - 0 1"]
[PlyCount "17"]
[EventDate "2013.??.??"]
1. Nxg6 Rg8 2. Nf4 Nf8 3. Qh5 Rg5 4. Qe2 Rg8 5. Nc3 c6 6. Bxh7 Nxh7 7. Nxe6
fxe6 8. Qh5+ Kd7 9. Qxh7 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "8/3k4/p1n1p1p1/1p1pPpP1/1P1P1P2/P4R2/2N4r/3K4 b - - 0 1"]
[PlyCount "19"]
[EventDate "2013.??.??"]
1... Rxc2 2. Rh3 Rf2 3. Rh7+ Kd8 4. Rh8+ Ke7 5. Rh7+ Kf8 6. Rh8+ Kf7 7. Rh7+
Kg8 8. Rc7 Nxd4 9. Ra7 Rxf4 10. Rxa6 Rg4 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "1r4kr/p4p2/1npNp2p/2q1b3/2P4Q/5N2/1P1R1PP1/3R2K1 w - - 0 1"]
[PlyCount "7"]
[EventDate "2013.??.??"]
1. b4 Qxd6 2. Rxd6 Bxd6 3. Rxd6 Re8 4. Rxc6 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "4r1k1/p5bp/3qn1p1/1R6/2Q1BPP1/2P5/P6K/1RBr4 b - - 0 1"]
[PlyCount "8"]
[EventDate "2013.??.??"]
1... Rxc1 2. Bd5 Rxc3 3. Qb4 Qd8 4. g5 Rc2+ 5. Kh1 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[Annotator "WANDEROZ"]
[SetUp "1"]
[FEN "3rk2r/pBpq1pp1/1n2p1p1/3n4/6P1/2b1BQ1P/PPP5/3R1RK1 w k - 0 1"]
[PlyCount "3"]
[EventDate "2013.??.??"]
1. Bc6 Qxc6 (1... Bf6 2. Bxd7+ Rxd7) 2. Qxf7# 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "3r2k1/5pp1/p6p/1p1r1q2/1Pnbp2P/PR4B1/4QPP1/3RN1K1 b - - 0 1"]
[PlyCount "6"]
[EventDate "2013.??.??"]
1... Bxf2+ 2. Qxf2 Qxf2+ 3. Kxf2 Rxd1 4. Bf4 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "4rqrk/p4p1p/2p2Pp1/1p4Q1/3P2PR/3b3N/P1P4P/6K1 w - - 0 1"]
[PlyCount "7"]
1. Rxh7+ Kxh7 2. Qh4+ Qh6 3. Ng5+ Kh8 4. Qxh6# 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "4r2k/p3q1p1/1np1pp1p/3r4/3P2Q1/5NR1/PP3PPP/4R1K1 w - - 0 1"]
[PlyCount "1"]
[EventDate "2013.??.??"]
1. Rxe6 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "1n1r1r1k/pq2NBpp/bp3n2/2p1b1N1/8/4P2P/PPQB1PP1/R3R1K1 w - - 0 1"]
[PlyCount "3"]
1. Qxh7+ Nxh7 2. Ng6# 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "3r1rk1/1bq1bppp/p2p4/1p2pP2/2n1P3/P1N2B2/1PP1Q1PP/2BR1RK1 b - - 0 1"]
[PlyCount "8"]
[EventDate "2013.??.??"]
1... Nxa3 2. Rf2 Nc4 3. Nd5 Bxd5 4. Rxd5 Nb6 5. Rd1 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[Annotator "WANDEROZ"]
[SetUp "1"]
[FEN "1b3rk1/pR3p2/5n2/6pp/8/PBN1PK1P/1P6/8 w - - 0 1"]
[PlyCount "24"]
[EventDate "2013.??.??"]
1. Ne2 Be5 (1... Kg7 2. Nd4 g4+ 3. hxg4 hxg4+ 4. Kg2 Kg6 5. Nc6) 2. Nd4 g4+ 3.
hxg4 hxg4+ 4. Kg2 a5 5. Ra7 a4 6. Rxa4 Kg7 7. Ra7 Bxd4 8. exd4 Rb8 9. Bxf7
Rxb2+ 10. Kg3 Rd2 11. Bh5+ Kh6 12. Bxg4 Rxd4 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "6qk/3b1p1p/p7/2pNb3/2Pn1N2/1P5P/1P4QK/R1Br4 b - - 0 1"]
[PlyCount "3"]
1... Nf3+ 2. Qxf3 Qg1# 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "r5rk/p1R2Qpp/1n3p2/4p3/q7/4B2P/P4PP1/2R3K1 w - - 0 1"]
[PlyCount "7"]
[EventDate "2013.??.??"]
1. Bh6 Qd7 2. Rxd7 Nxd7 3. Qxd7 gxh6 4. Rc7 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "2r2rk1/4q2p/pn4p1/1pb5/2p5/2B1P1Q1/PPB3PP/3R1R1K w - - 0 1"]
[PlyCount "15"]
1. Bxg6 Rf6 2. Bxf6 Qxf6 3. Rxf6 Bd6 4. Bf7+ Kh8 5. Rfxd6 Nd7 6. Rxd7 h6 7.
Bxc4 bxc4 8. Qg7# 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "5k2/qp1r1pp1/4p3/3pP1Q1/8/1R5P/2r2PP1/1R4K1 w - - 0 1"]
[PlyCount "16"]
[EventDate "2013.??.??"]
1. Rxb7 Qxf2+ 2. Kh1 g6 3. Rxd7 Kg7 4. Kh2 Rc4 5. Rb8 Ra4 6. Rdd8 Qf4+ 7. Qxf4
Rxf4 8. Rh8 f6 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "r6k/6pp/8/1p2N3/8/1B2KPP1/1r4P1/4R3 w - - 0 1"]
[PlyCount "3"]
1. Ng6+ hxg6 2. Rh1# 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "r4nk1/p4p1p/2p4r/3p1B2/3P2bq/4P1N1/P4PP1/RQR3K1 b - - 0 1"]
[PlyCount "5"]
1... Qh2+ 2. Kf1 Qh1+ 3. Nxh1 Rxh1# 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "2b2rk1/rpp2pp1/p1np1q1p/4p3/4Pn2/1BPP1N1P/PP3PPN/R2QR1K1 b - - 0 1"]
[PlyCount "7"]
[EventDate "2013.??.??"]
1... Bxh3 2. gxh3 Qg6+ 3. Ng4 Nxh3+ 4. Kh2 Qxg4 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "R3r3/1k5p/1q3pp1/1p2p3/1Q1rP3/1P5P/5PP1/R5K1 w - - 0 1"]
[PlyCount "9"]
[EventDate "2013.??.??"]
1. R1a7+ Qxa7 2. Rxa7+ Kxa7 3. Qa5+ Kb7 4. Qxb5+ Kc7 5. Qxe8 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[Annotator "WANDEROZ"]
[SetUp "1"]
[FEN "4r1k1/2p3p1/p3q1Np/1pb3rP/1P2pp2/P1P2P1P/4Q3/R4K1R b - - 0 1"]
[PlyCount "15"]
[EventDate "2013.??.??"]
1... Qxh3+ 2. Ke1 Qxh1+ 3. Kd2 Qxa1 4. Ne7+ Bxe7 5. fxe4 Rd8+ 6. Kc2 Qa2+ 7.
Kc1 Rg1+ 8. Qd1 Rgxd1# (8... Rdxd1#) 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "1n1qbr1k/p4Bbp/1p1NQ1p1/2n1P3/p2P1N2/4BPP1/7P/2R3K1 w - - 0 1"]
[PlyCount "7"]
1. Nxg6+ hxg6 2. Qh3+ Qh4 3. Qxh4+ Bh6 4. Qxh6# 1-0
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "Opponent"]
[Black "You"]
[Result "0-1"]
[SetUp "1"]
[FEN "6k1/b5p1/p1n1p2p/1p1qPp2/8/P1N2NP1/1PQ2PKP/8 b - - 0 1"]
[PlyCount "7"]
[EventDate "2013.??.??"]
1... Qxf3+ 2. Kxf3 Nd4+ 3. Ke3 Nxc2+ 4. Kd3 Nd4 0-1
[Event "The Complete Chess Workout - Palliser"]
[Site "chess.edu.vn"]
[Date "2013.12.06"]
[Round "?"]
[White "You"]
[Black "Opponent"]
[Result "1-0"]
[SetUp "1"]
[FEN "1rbr4/pp2q1k1/6p1/4Np1p/3P1P2/1Q6/PP4PP/3R1RK1 w - - 0 1"]
[PlyCount "19"]
[EventDate "2013.??.??"]
1. d5 Bd7 2. d6 Qe6 3. Qa3 a6 4. Rfe1 Qf6 5. Qc3 Bc6 6. d7 Kh7 7. Qa3 Be4 8.
Rd6 Qe7 9. Nxg6 Qg7 10. Qh3 1-0