首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >棋子合法动作

棋子合法动作
EN

Stack Overflow用户
提问于 2019-02-12 01:15:54
回答 1查看 2.4K关注 0票数 2

我和vue.js下了一盘国际象棋,现在我正试着找出每一件棋子的可能动作。我能够修复knight, pawn and bishop的合法动作验证。

在进行主教验证的时候,我遇到了一个问题。它是能够验证,如果有一块站在主教面前。

请看图片,以了解更多。

你看,红色的数字是如何在典当和继续上升的。它应该停在当铺的数字上。

这是我计算主教的代码。如果有可能的话,如果你也能为女王和其他作品提供验证,那将是非常有帮助的。

代码语言:javascript
复制
    var el = {  };
    // sample Data
    el.whiteMoves = [{"x":1,"y":1,"type":"Rook1","name":"1A","cleanType":"rook"},{"x":8,"y":1,"type":"Rook2","name":"1H","cleanType":"rook"},{"x":2,"y":1,"type":"Knight1","name":"1B","cleanType":"knight"},{"x":7,"y":1,"type":"Knight2","name":"1G","cleanType":"knight"},{"x":3,"y":1,"type":"Bishop1","name":"1C","cleanType":"bishop"},{"x":6,"y":1,"type":"Bishop2","name":"1F","cleanType":"bishop"},{"x":4,"y":1,"type":"Queen","name":"1D","cleanType":"queen"},{"x":5,"y":1,"type":"King","name":"1E","cleanType":"king"},{"x":1,"y":2,"type":"Pawn1","name":"2A","cleanType":"pawn"},{"x":2,"y":2,"type":"Pawn2","name":"2B","cleanType":"pawn"},{"x":3,"y":2,"type":"Pawn3","name":"2C","cleanType":"pawn"},{"x":4,"y":2,"type":"Pawn4","name":"2D","cleanType":"pawn"},{"x":5,"y":2,"type":"Pawn5","name":"2E","cleanType":"pawn"},{"x":6,"y":2,"type":"Pawn6","name":"2F","cleanType":"pawn"},{"x":7,"y":2,"type":"Pawn7","name":"2G","cleanType":"pawn"},{"x":8,"y":2,"type":"Pawn8","name":"2H","cleanType":"pawn"}];
    
    el.blackMoves = [{"x":1,"y":8,"type":"Rook1","name":"8A","cleanType":"rook"},{"x":8,"y":8,"type":"Rook2","name":"8H","cleanType":"rook"},{"x":2,"y":8,"type":"Knight1","name":"8B","cleanType":"knight"},{"x":7,"y":8,"type":"Knight2","name":"8G","cleanType":"knight"},{"x":3,"y":8,"type":"Bishop1","name":"8C","cleanType":"bishop"},{"x":6,"y":8,"type":"Bishop2","name":"8F","cleanType":"bishop"},{"x":4,"y":8,"type":"Queen","name":"8D","cleanType":"queen"},{"x":5,"y":8,"type":"King","name":"8E","cleanType":"king"},{"x":1,"y":7,"type":"Pawn1","name":"7A","cleanType":"pawn"},{"x":2,"y":7,"type":"Pawn2","name":"7B","cleanType":"pawn"},{"x":3,"y":7,"type":"Pawn3","name":"7C","cleanType":"pawn"},{"x":4,"y":7,"type":"Pawn4","name":"7D","cleanType":"pawn"},{"x":5,"y":7,"type":"Pawn5","name":"7E","cleanType":"pawn"},{"x":6,"y":7,"type":"Pawn6","name":"7F","cleanType":"pawn"},{"x":7,"y":7,"type":"Pawn7","name":"7G","cleanType":"pawn"},{"x":8,"y":7,"type":"Pawn8","name":"7H","cleanType":"pawn"}]

    el.rank = ["A", "B", "C", "D", "E", "F", "G", "H"];
    var result = []
    type = "white";
    piece= "bishop";
    var x = 5;
    var y = 1;
    var v = {
    // the validation methods
    bishop: function () {
        var offSet = [];

        for (var i = 1; i <= 8; i++) {
          if (x + i < 8 && y + i < 8)
            offSet.push({ x: x + i, y: y + i });

          if (x + i < 8 && y - i < 8)
            offSet.push({ x: x + i, y: y - i });

          if (x - i < 8 && y + i < 8)
            offSet.push({ x: x - i, y: y + i });

          if (x - i < 8 && y - i < 8)
            offSet.push({ x: x - i, y: y - i });
        }
                       
                  
  if (type == "white") 
    result = offSet.flatMap((item) => item.y + el.rank[item.x]).filter((item) => el.whiteMoves.filter((x) => x.name == item).length <= 0);
    else result = offSet.flatMap((item) => item.y + el.rank[item.x]).filter((item) => el.blackMoves.filter((x) => x.name == item).length <= 0);

  return result;
   }
  }
  v[piece]();
  // there is some invalid values like -5A or NaN but its not a problem these will be removed later on
  console.log(result);

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-12 07:03:39

您的for循环根本不包括检测冲突的代码。它一直延伸到董事会的边缘。考虑将循环分成四个独立的for循环,每个循环在板的边缘终止,或者当它检测到碰撞时终止。对于同一颜色(非法移动)或相反颜色(捕获),碰撞需要单独处理。

代码语言:javascript
复制
var dx = +1, dy = +1;
do {
  x += dx;
  y += dy;

  // Running into any color piece terminates the loop.
  // However, running into an opposite color piece adds one last legal move.
  var onBoard = (x >= 0) && (x < 8) && (y >= 0) && (y < 8);
  var samePiece = onBoard ? (detect_collision_with_same_color_piece) : false;
  var oppPiece = onBoard ? (detect_collision_with_opp_color_piece) : false;

  if (onBoard && !samePiece) {
    offSet.push({ x: x, y: y });
  }
} while (onBoard && !samePiece && !oppPiece);

很难提供确切的冲突检测代码,所以我在那里留下了一些占位符。一些额外的想法:

  1. 显然,您应该参数化dxdy来循环所有+1和-1组合,这样就不会重复上面的代码四次了。
  2. 如果内存不是一个问题,您可以在所有四个方面使用一些特殊的值来填充矩阵,这样就不需要每次检查xy是否正确。例如,如果white要移动,然后用白爪子填充矩阵,那么您可以一起删除onBoard;循环将在samePiece变为真时终止。这确实增加了您的董事会从64平方到100,这可能是重要的,一旦你添加转位表。
  3. 更好的是,考虑一下旋转位板,它是一种完全不同、而且速度更快的移动生成方法。
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54641485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档