risendy/pgn-parser

PGN 国际象棋记谱解析器

dev-master 2019-10-16 17:35 UTC

This package is auto-updated.

Last update: 2024-09-17 05:21:51 UTC


README

基本信息

用PHP编写的简单的PGN国际象棋记谱解析器。PGN应该在字符串格式中,默认标签分隔符是换行符。标签和走法之间至少应该有一个空白行,因为这是处理PGN字符串的方式。

功能

  • 以字符串/json/数组/对象数组格式提取走法
  • 获取特定走法(黑方或白方)
  • 获取特定走法注释
  • 获取第一个/最后一个走法
  • 以字符串格式提取标签
  • 通过名称获取标签值

安装

composer require risendy/pgn-parser

用法

解析PGN字符串

$game = new Game();
$game->parsePgn($pgn);

以字符串格式获取走法

$moves = $game->getMovesString();

result:
string(15) "e4 e6 d4 d5 0-1"

以JSON格式获取走法

$json = $game->createJsonArray();

result:
{
   "tags":{
      "Event":"Lets Play!",
      "Site":"Chess.com",
      "Date":"2018.12.04",
      "Round":"?",
      "White":"guilherme_1910",
      "Black":"bmbio",
      "Result":"0-1",
      "TimeControl":"1\/259200:0"
   },
   "moves":[
      {
         "moveNumber":1,
         "white":"e4",
         "black":"e6"
      },
      {
         "moveNumber":2,
         "white":"d4",
         "black":null
      }
   ]
}

以数组格式获取走法

$moves = $game->getSimpleMovesArray();

result:
array(5) {
  [0]=>
  string(2) "e4"
  [1]=>
  string(2) "e6"
  [2]=>
  string(2) "d4"
  [3]=>
  string(2) "d5"
  [4]=>
  string(3) "0-1"
}

以对象数组格式获取走法

$moves = $game->getObjectMovesArray();

result:
array(3) {
  [1]=>
  array(2) {
    [0]=>
    object(PgnParser\Move)#22 (3) {
      ["move":"PgnParser\Move":private]=>
      string(2) "e4"
      ["moveNumber":"PgnParser\Move":private]=>
      int(1)
      ["moveColor":"PgnParser\Move":private]=>
      string(1) "W"
    }
    [1]=>
    object(PgnParser\Move)#23 (3) {
      ["move":"PgnParser\Move":private]=>
      string(2) "e6"
      ["moveNumber":"PgnParser\Move":private]=>
      int(1)
      ["moveColor":"PgnParser\Move":private]=>
      string(1) "B"
    }
  }
  [2]=>
  array(2) {
    [0]=>
    object(PgnParser\Move)#24 (3) {
      ["move":"PgnParser\Move":private]=>
      string(2) "d4"
      ["moveNumber":"PgnParser\Move":private]=>
      int(2)
      ["moveColor":"PgnParser\Move":private]=>
      string(1) "W"
    }
    [1]=>
    object(PgnParser\Move)#25 (3) {
      ["move":"PgnParser\Move":private]=>
      string(2) "d5"
      ["moveNumber":"PgnParser\Move":private]=>
      int(2)
      ["moveColor":"PgnParser\Move":private]=>
      string(1) "B"
    }
  }
  [3]=>
  array(1) {
    [0]=>
    object(PgnParser\Move)#26 (3) {
      ["move":"PgnParser\Move":private]=>
      string(3) "0-1"
      ["moveNumber":"PgnParser\Move":private]=>
      int(3)
      ["moveColor":"PgnParser\Move":private]=>
      string(1) "W"
    }
  }
}

获取特定走法实例

$move = $game->getMove(2, 'B');

result:
object(PgnParser\Move)#75 (4) {
["san":"PgnParser\Move":private]=>
string(2) "d4"
["moveNumber":"PgnParser\Move":private]=>
int(2)
["moveColor":"PgnParser\Move":private]=>
string(1) "W"
["comment":"PgnParser\Move":private]=>
string(4) "test"

获取特定走法SAN

$move = $game->getMove(2, 'B')->getSan();

result:
string(2) "d5"

获取特定走法注释

$move = $game->getMove(2, 'B')->getComment();

result:
string(4) "test"

通过名称获取标签值

$tagValue = $game->getTagValueByName('Black');

result:
string(5) "bmbio"

测试

若要运行测试,请使用

./vendor/bin/phpunit --bootstrap vendor/autoload.php tests/PgnParserTest