如何将chess .pgn文件转换/解析为适合d3.js节点树的

时间:2017-09-02 06:07:25

标签: javascript json d3.js tree

我绞尽脑汁,试了几个星期,但是通过php脚本,chesscanvas和python脚本,无法解决这个问题。 我想从国际象棋变体树构建一个D3.js树。

国际象棋由软件记录为PGN。关于变体,它几乎就像一个JSON文件本身,除了D3.js树需要嵌套每一个移动以绘制树。

这就是.PGN本质上是什么样的,添加了变体或分支

PGN structure

PGN文件显示文件的结构,但是当你复制并粘贴它时,文本阅读器会看到这一点......这就是代码在解析它时会看到的内容。

1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 (3... Nf6 {- Berlin Defense} 4. O-O (4. d3 {Like
all of the d3 lines, the eval is equal} 4... Bc5 (4... Nd4 5. Nxd4 exd4 6.
O-O c6 7. Bc4 d5 8. exd5 cxd5 9. Bb5+ Bd7 10. Bxd7+ Qxd7 11. Re1+ Kd8 (11... Be7
12. Bf4 O-O 13. Nd2 Rae8) 12. Bg5 Rc8 13. Nd2 Bb4 14. a3 Ba5)) 4... Nxe4 {- Open
Variation} (4... d6 {Improved Steinitz Defence} 5. d4 Bd7 (5... exd4) (5... Nxe4
{Rarely played and not mainline, but plausible before 2000 due to tactical
nature and no "immediate" crushing reply.} 6. d5 a6 (6... Bd7 7. dxc6 bxc6 8.
Bc4 d5 9. Nxe5 dxc4 10. Qf3) 7. Bd3 Nc5 8. dxc6 bxc6 9. Nc3) 6. Nc3 Be7 (6...
exd4 7. Nxd4) 7. Re1) (4... a6 5. Bxc6 dxc6 6. Nxe5 Bd6 (6... Qd4) (6... Nxe4 7.
Re1 Qd4 8. Nf3 {+3.4}) 7. Nf3) 5. d4 Nd6 (5... Be7 6. Qe2 Nd6 7. Bxc6 bxc6 8.
dxe5 Nf5 9. Qe4 g6 (9... Nh4 10. Nxh4 Bxh4 11. Qg4 g6 12. Bh6) 10. c4 O-O 11.
Nc3) (5... exd4 {Riga Variation} 6. Re1 d5 7. Nxd4 {+0.81} 7... Qf6 (7... Bd7 8.
f3 Nxd4 9. Bxd7+ Kxd7 10. fxe4 Qh4 11. g3 Qf6 12. Rf1 (12. c3 Nf3+ 13. Kh1
Nxe1 {And all Options lead to hell.} 14. Qxe1 Qf3+ 15. Kg1 Bc5+)
12... Qe5 13. Nc3 Bc5 14. Kh1 (14. Be3 Kc8 15. Rxf7) 14... f5 15. Bf4) 8. f3 Bc5
9. Bxc6+ bxc6 10. c3 Bf5 11. Be3 O-O 12. fxe4 {+2.54, and the aggression is
dealt with} 12... Bxe4 13. Nd2 Rfe8) 6. Bxc6 dxc6 (6... bxc6 7. dxe5) 7. dxe5

等等....

括号内的每次移动都是变体的第一个移动,每个移动都是每个移动的子移动,但整个变化只是一次移动的子移动。

  1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4.Ba4

    Ruy Lopez - Root E4  -儿童   E5    -儿童      NF3        -儿童           NC6             -儿童                BB5                  -儿童                     A6

  2. 现在当游戏分支时,或者在不是一个明确的移动的情况下,他们选择的多方面,每个都导致不同的游戏,每个分支是该节点的孩子,但彼此的兄弟姐妹 - 如下

    Ruy Lopez - Root
    e4
     -child
      e5
       -child
         Nf3
           -child
              Nc6
                -child
                   Bb5
                     -children
                        |a6
                        |Nf6
         siblings       |d6
                        |f5
                        |Bc4
    

    随着最初的比赛之前,每个变化都会继续。从变异的头部以外的任何东西进行新的移动都会隐式地创建一个新变体。一棵无政府主义的树。有一条主线 - 括号外的所有内容,即顶线。我不知道这是否有帮助。在树形式中,扩展时应该是最顶部的分支。

    如果此时每次(遇到,当它没有遇到另一个)时,如果有任何新的(遇到 - 所有变化都在主要变量之前关闭),它基本上可以说出每个变量(是先前父母移动的子女,并在遇到")"

    时停止

    我无法回想起,你们会知道,它被称为“递归”#34;一些东西,并为编程而众所周知。我的解释可能是超级的。

    如果遇到{它可以说"我看到一个括号,里面的所有内容都是一个字符串注释,我想把它当作 - " text" :"括号中的所有内容" - 在此举中,这将是非常不可思议的。

    这是目标,

    http://web.ics.purdue.edu/~mjschwei/chesstreed3/20/

    我可以手工构建JSON文件,但事实证明这样做太麻烦,因为这样做是务实的。我需要一个解析器。

    我需要将上面的PGN信息转换为至少这个......

    {
       "name" : "Ruy Lopez",
       "children" : [
          {
             "name" : "e4",
             "children" : [
                {
                   "name" : "e5",
                   "children" : [
                      {
                         "name" : "Nf3",
                         "children" : [
                            {
                               "name" : "Nc6",
                               "children" : [
                                  {
                                     "name" : "Bb5",
                                     "children" : [
                                        {
                                           "name" : "a6",
                                           "children" : [
                                              {
                                                 "name" : "Ba4",
                                                 "children" : [
                                                    {
                                                       "name" : "Nf6",
                                                       "children" : [
                                                          {
                                                             "name" : "O-O",
                                                             "children" : [
                                                                {
                                                                   "name" : "Be7",
                                                                   "children" : [
                                                                      {
                                                                         "
    

    在变奏处,而不是孩子,这些动作将是兄弟姐妹,之后每个接下来的动作序列都是儿童的变异。

    理想情况下,目标就是这个......

    {
      "name": "flare",
      "children": [
        {
          "name": "e4",
          "move": "1",
          "text": "The Open Game",
          "fen": "rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR",
          "side": "white",
          "nodecolor": "GhostWhite",
          "textcolor": "DarkSlateGrey",
          "variation": "Open Game",
          "type": "normal",
          "children": [
            {
              "name": "e5",
              "move": "1",
              "text": "E4 is met with the symmetrical e5, indicating the liklihood of a sharp game",
              "fen": "rnbqkbnr/pppp1ppp/8/4p3/4P3/8/PPPP1PPP/RNBQKBNR",
              "side": "black",
              "nodecolor": "DarkSlateGrey",
              "textcolor": "white",
              "variation": "Open Game",
              "type": "normal",
              "children": [
                {
                  "name": "Nf3",
                  "move": "1",
                  "text": "Open Game",
                  "fen": "rnbqkbnr/pppp1ppp/8/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R",
                  "side": "white",
                  "nodecolor": "GhostWhite",
                  "textcolor": "DarkSlateGrey",
                  "variation": "Open Game",
                  "type": "normal",
                  "children": [
                    {
                      "name": "Nc6",
                      "move": "1",
                      "text": "Open Game",
                      "fen": "r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R",
                      "side": "black",
                      "nodecolor": "DarkSlateGrey",
                      "textcolor": "white",
                      "variation": "Open Game",
                      "type": "normal",
    

    所以我可以做到这一点..

    好吧,它不允许我发布两个以上的链接..所以我无法显示我想要的结果。但是,它是一个以变化分支的d3.js树,每个节点一直持续到下一个发生新分支的变化。

    在过去的12年里,我一直是摄影师,3D建模师,灯光和渲染艺术家。自布什政府以来,我没有看过Javascript。当我看到可扩展的树时,我坠入爱河,并且知道如此建造国际象棋曲目会很棒。我给了它一个地狱,并且比我想象的更远。我知道很多这些问题看起来都很愚蠢或烦人。但我已经制定了整棵树,棋盘,从D3.js树发送到董事会,并自己评论评论框。这是我做不到的。这个,我必须得到帮助。这是我的第二个问题,我不想因为无知而让任何人发疯......我只是不想放弃这一点。有人可以帮忙吗?

0 个答案:

没有答案