Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何保存彼此分支的变体和初始状态_Javascript_Typescript_Tree - Fatal编程技术网

Javascript 如何保存彼此分支的变体和初始状态

Javascript 如何保存彼此分支的变体和初始状态,javascript,typescript,tree,Javascript,Typescript,Tree,我想记录下棋的路线和变化。线可以彼此分支,并继承所有先前向上移动到称为ply的分支点的移动 我在代码中定义如下: fen('initial', 'fen'); moves('initial', 'a b c d e f g'.split(' ')); branch('line2', 'initial', 3); moves('line2', 'c2 d2 e2'.split(' ')); 我想这样查询这个状态: // desired output is commented ply('initi

我想记录下棋的路线和变化。线可以彼此分支,并继承所有先前向上移动到称为ply的分支点的移动

我在代码中定义如下:

fen('initial', 'fen');
moves('initial', 'a b c d e f g'.split(' '));
branch('line2', 'initial', 3);
moves('line2', 'c2 d2 e2'.split(' '));
我想这样查询这个状态:

// desired output is commented
ply('initial', 0) // fen
ply('initial', 3) // c
ply('initial', 5) // e
ply('line2', 0) // fen
ply('line2', 2) // b
ply('line2', 3) // c2
ply('line2', 5) // e2
我已经编写了这个代码,但它不必要地复杂,不可用。我想要一个简单的工作代码。请记住,分支线也可以进一步分支


并发症来自我返回的各种错误案例。例如“快乐路径”,但如果我尝试从未定义的行分支,或尝试为已定义的行设置两次移动,我不知道该怎么办。

您可以将每一行存储为链接列表,顺序相反,因此最后一层在链接列表的第一个节点中表示,然后链接到“父”节点,即生产线的前一层。。。一直到根节点。换句话说,每条线都指向树中的一片叶子,每个节点都有一个指向树中其父节点的链接

通过这种组织,线可以具有共享节点,因为它们是树中的公共父节点

我不完全清楚“分”的论点代表什么。。。我想它可以代表一个完全定义的游戏状态,它可以像一个层一样处理

这可能是一个起点:

类节点{
构造函数(层、父级){
this.ply=厚度;
this.parent=parent;
//此演示是可选的,但在树上行走时可能很有用
//从根而不是叶开始:
这是:children=[];
if(parent)parent.children.push(this);
}
}
类树{
构造器(初始行,起始操作){
这条线={
[initialLine]:新节点(startPos,null)
};
}
行(行){
//自下而上收集属于某一行的所有节点。
设arr=[];
for(让node=this.lines[line];node;node=node.parent){
arr.push(节点);
}
return arr.reverse();//按正向(自上而下)顺序返回
}
分支(行、fromLine、numPly){
this.line[line]=this.line(fromLine)[numPly-1];
}
移动(线、层){
用于(让层合板层){
this.lines[line]=新节点(ply,this.lines[line]);
}
}
层数{
返回此.line(line)[numPly].ply
}
}
let tree=新树('initial','fen');
tree.moves('initial','abcdefg')split('');
树枝('line2','initial',3);
树移动('line2','c2 d2 e2',拆分('');
console.log([
tree.ply('initial',0),//fen
tree.ply('initial',3),//c
tree.ply('initial',5),//e
tree.ply('line2',0),//fen
tree.ply('line2',2),//b
tree.ply('line2',3),//c2
tree.ply('line2',5)//e2
]);