MSC*_*ss 7 javascript tree json d3.js
我绞尽脑汁,尝试了数周,但通过 php 脚本、chesscanvas 和 python 脚本,无法解决这个问题。我想从国际象棋变异树构建一个 D3.js 树。
国际象棋被软件记录为 PGN。它在变体方面是分层的,并且本身几乎就像一个 JSON 文件,除了 D3.js 树需要嵌套的每个移动来绘制树。
这是 .PGN 本质上的样子,添加了变化或分支
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
Run Code Online (Sandbox Code Playgroud)
等等……
括号内的每一步都是变体的第一个步,每个步都是每个先前步的子步,但整个变体只是该步的子步。
e4 e5 2. Nf3 Nc6 3. Bb5 a6 4.Ba4
Ruy Lopez - Root e4 -child e5 -child Nf3 -child Nc6 -child Bb5 -child a6
现在,当游戏分支时,或者在不是一个明确的移动的情况下,他们选择的多个边,每个都导致不同的游戏,每个分支都是该节点的子节点,但彼此是兄弟 - 如下
Ruy Lopez - Root
e4
-child
e5
-child
Nf3
-child
Nc6
-child
Bb5
-children
|a6
|Nf6
siblings |d6
|f5
|Bc4
Run Code Online (Sandbox Code Playgroud)
并且每个变体都像之前的初始游戏一样继续进行。从变体的头部以外的任何事物进行新的移动会隐含地创建一个新的变体。一棵有层次的树。有一条主线 - 括号之外的所有内容,即顶线。我不知道这是否有帮助。在树形中,展开时应该是最顶端的分支。
如果此时每次(遇到,当遇到另一个时)如果有任何新的(遇到 - 所有变体在主要变体之前关闭,它基本上可以说每一个(是先前的子变体)父移动,遇到“)”时停止
我不记得了,你们会知道,它被称为“递归”的东西,并且在编程中是众所周知的。我的解释可能是多余的。
如果在遇到 { 它可以说“我看到一个括号,里面的所有内容都是字符串注释,我想把它当作 - “文本”:“括号中的所有内容” - 在移动下,这将是非常不可思议的.
这里是目标,
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" : [
{
"
Run Code Online (Sandbox Code Playgroud)
在 Variations 中,移动将是兄弟姐妹而不是子级,并且此后的每个后续移动序列都将是该变体的子级。
理想情况下,目标是这样..
{
"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",
Run Code Online (Sandbox Code Playgroud)
所以我可以做这个..
那么它不会让我发布两个以上的链接..所以我无法显示我想要的结果。但是,它是一个 d3.js 树,它在变体处分支,每个节点都继续直到下一个变体,在那里出现新的分支。
在过去的 12 年里,我一直担任摄影师、3D 建模师、灯光和渲染艺术家。自从布什政府以来,我就没有见过 Javascript。当我看到可扩展的树时,我爱上了,并且知道拥有这样的国际象棋曲目会很棒。我试了一下,比我想象的要走得更远。我知道其中许多问题一定看起来很愚蠢或很烦人。但是我已经制定了整个树,棋盘,从 D3.js 树发送到棋盘,以及对评论框的评论都是我自己的。这是我做不到的。这个,我得求助了。这是我的第二个问题,我不想让任何人因为无知而生气......我只是不想放弃这个。任何人都可以帮忙吗?