我的目标是编写一个稍微正常的国际象棋引擎,在下面的位置,它是2中的一个伙伴,引擎应该很容易找到它的深度为4-5.

Chess board with FEN: rr2k3/8/8/8/8/8/8/4K3 (black to play)

人工智能的第一个动作是Ra2捕捉白王,白王进入f1,而不是交配,人工智能将车移动到c2.

  var initial_depth = depth;
  var bestMove = null;
  var nodes = 0;
  var ret = await minimax(position, depth, alpha, beta, maximizingPlayer);
  console.log("nodes visited: " + nodes);
  return ret;
 
  async function minimax(position, depth, alpha, beta, maximizingPlayer) {
    nodes++;
    if (maximizingPlayer) {
      var validMoves = await getValidMoves(position, ArrtoFEN(position) + " w");
    } else {
      var validMoves = await getValidMoves(position, ArrtoFEN(position) + " b");
    }
    if (validMoves.length < 1 || depth == 0) {
      var eval = await getEval(position);
      return [eval, null];
    }
 
    if (maximizingPlayer) {
      var maxEval = Number.NEGATIVE_INFINITY;
      for (var i = 0; i < validMoves.length; i++) {
        var move = validMoves[i];
        
        var testbrd = makeMove(move, position)  //not the actual code. shortend for Readability
 
        
        var eval = await minimax(testbrd, depth - 1, alpha, beta, false);
        if (eval[0] > maxEval) {
          maxEval = eval[0];
          if (initial_depth == depth) {
            bestMove = move;
            console.log("current bestmove: " + bestMove);
          }
        }
        alpha = Math.max(alpha, eval[0]);
        if (beta <= alpha) {
          break;
        }
      }
      return [maxEval, bestMove];
    } else {
      var minEval = Number.POSITIVE_INFINITY;
 
      for (var i = 0; i < validMoves.length; i++) {
        var move = validMoves[i]; 
          
        var testbrd = makeMove(move, position)//not the actual code. shortend for Readability
 
        var eval = await minimax(testbrd, depth - 1, alpha, beta, true);
        if (eval[0] < minEval) {
          minEval = eval[0];
          if (initial_depth == depth) {
            bestMove = move;
            console.log("current bestmove: " + bestMove);
          }
        }
        beta = Math.min(beta, eval[0]);
        if (beta <= alpha) {
          break;
        }
      }
 
      return [minEval, bestMove];
    }
  }
}

推荐答案

这是因为它看到任何一步都会赢,而且你没有一个条件告诉引擎,一步配对比五步配对更好.如果在搜索结束时发现你有0次合法移动,并且你处于判断状态,那么你将被将死.在这种情况下,您希望发回将死分数(大负值),并从中添加厚度.这样一来,你就可以少走几步,而不是多走几步.

我建议你用Negamax算法代替minimax算法.这将意味着更少的代码和更容易调试.

Javascript相关问答推荐

如何使用侧边滚动按钮具体滚动每4个格?

if/else JavaScript中的条件行为

我可以使用CSS有效地实现最大宽度=100%和最大高度=100%,而无需父母有明确的/固定的宽度和高度,替代方法吗?

yarn安装一个本地npm包,以便本地包使用main项目的node_modules(ckeditor-duplicated-modules错误)

. NET中Unix时间转换为日期时间的奇怪行为

我应该绑定不影响状态的函数吗?'

使用JavaScript重新排序行

在服务器上放置了Create Reaction App Build之后的空白页面

查询参数未在我的Next.js应用路由接口中定义

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

如何在不影响隐式类型的情况下将类型分配给对象?

在css中放置所需 colored颜色 以填充图像的透明区域

图表4-堆叠线和条形图之间的填充区域

react 路由如何使用从加载器返回的数据

我为什么要使用回调而不是等待?

Django模板中未加载JavaScript函数

Chrome上的印度时区名S有问题吗?

如何向内部有文本输入字段的HTML表添加行?

如何使用Angular JS双击按钮

Iterator.Next不是进行socket.end()调用后的函数