Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Tic-tac-toe-in JavaScript和minimax算法,给出错误最大调用堆栈大小超过_Javascript_Algorithm_Tic Tac Toe_Callstack_Minimax - Fatal编程技术网

Tic-tac-toe-in JavaScript和minimax算法,给出错误最大调用堆栈大小超过

Tic-tac-toe-in JavaScript和minimax算法,给出错误最大调用堆栈大小超过,javascript,algorithm,tic-tac-toe,callstack,minimax,Javascript,Algorithm,Tic Tac Toe,Callstack,Minimax,我正在做一个抽签游戏。我的minimax算法在提供一个数组和两个播放器的情况下运行良好,但在处理div的html集合时,它会给出一个最大调用堆栈大小的错误。我不明白为什么会这样。通过搜索谷歌,我知道我的函数在某处一遍又一遍地调用自己,但却不知道该怎么做才能解决这个问题。我尝试将.cells div集合转换为数组,但仍然出现相同的错误。任何人都可以帮我。 多谢各位 var-humanPlayer,aiPlayer; humanPlayer='x'; aiPlayer='o'; var cells

我正在做一个抽签游戏。我的minimax算法在提供一个数组和两个播放器的情况下运行良好,但在处理div的html集合时,它会给出一个最大调用堆栈大小的错误。我不明白为什么会这样。通过搜索谷歌,我知道我的函数在某处一遍又一遍地调用自己,但却不知道该怎么做才能解决这个问题。我尝试将.cells div集合转换为数组,但仍然出现相同的错误。任何人都可以帮我。 多谢各位

var-humanPlayer,aiPlayer;
humanPlayer='x';
aiPlayer='o';
var cells=document.queryselectoral(“.cell”);
/**Tic Tac Toe游戏对象**/
变量TicTacToe={
checkWinner:功能(arr,播放器){
如果(
(arr[0]==玩家和arr[1]==玩家和arr[2]==玩家)||
(arr[3]==玩家和arr[4]==玩家和arr[5]==玩家)||
(arr[6]==玩家和arr[7]==玩家和arr[8]==玩家)||
(arr[0]==玩家和arr[3]==玩家和arr[6]==玩家)||
(arr[1]==玩家和arr[4]==玩家和arr[7]==玩家)||
(arr[2]==玩家和arr[5]==玩家和arr[8]==玩家)||
(arr[0]==玩家和arr[4]==玩家和arr[8]==玩家)||
(arr[2]==玩家和arr[4]==玩家和arr[6]==玩家)
){
返回true;
}
否则{
返回false;
}
},//checkWinner函数。
GetAvailableSpot:函数(arr){
var点=[];
对于(变量i=0;i最佳分数1){
bestScore1=移动[k]。分数;
bestMove=k;
}
}
}
否则{
var 2=100000;
对于(var l=0;l
*{
-webkit框大小:边框框;
-moz框大小:边框框;
框大小:边框框;
}
.细胞{
宽度:390px;
高度:390px;
保证金:50px自动;
}
.细胞{
宽度:128px;
高度:128px;
边框:1px实心#dedede;
浮动:左;
文本对齐:居中;
线高:128px;
字号:80px;
字体大小:粗体;
}

JS-Bin

这是因为您的minmax函数是递归的,这意味着它会尝试所有可能的组合链。为了避免一次又一次重复同一个链,它在每个递归上创建一个板的克隆(通过
Array.from(newBoard)

现在,当您使用primitve阵列测试它时,电路板的复制工作正常。但是,现在您的线路板阵列实际上包含DOM对象,它不会被
array.from()
克隆。因此,你的AI基本上是在每一次导致堆栈溢出的尝试中改变单元格

我的建议是,在将当前板传递给minmax函数之前,将其转换为基本数组

var-humanPlayer,aiPlayer;
humanPlayer='x';
aiPlayer='o';
var cells=document.queryselectoral(“.cell”);
/**Tic Tac Toe游戏对象**/
变量TicTacToe={
checkWinner:功能(arr,播放器){
如果(
(arr[0]==玩家和arr[1]==玩家和arr[2]==玩家)||
(arr[3]==玩家和arr[4]==玩家和arr[5]==玩家)||
(arr[6]==玩家和arr[7]==玩家和arr[8]==玩家)||
(arr[0]==玩家和arr[3]==玩家和arr[6]==玩家)||
(arr[1]==玩家和arr[4]==玩家和arr[7]==玩家)||
(arr[2]==玩家和arr[5]==玩家和arr[8]==玩家)||
(arr[0]==玩家和arr[4]==玩家和arr[8]==玩家)||
(arr[2]==玩家和arr[4]==玩家和arr[6]==玩家)
){
返回true;
}
否则{
返回false;
}
},//checkWinner函数。
GetAvailableSpot:函数(arr){
var点=[];
对于(变量i=0;i