Шахматная фигура легальные ходы - PullRequest
0 голосов
/ 12 февраля 2019

Привет, ребята, мне очень нужна помощь, я очень плохо разбираюсь и я действительно застрял здесь.

Итак, я сделал шахматную игру с vue.js, и сейчас я пытаюсь выяснить возможные ходы каждого куска и смог исправить допустимые проверки ходов для knight, pawn and bishop

во время работы сПроверка епископа Я столкнулся с проблемой, чтобы иметь возможность проверить, есть ли кусок, который стоит перед епископом

Пожалуйста, смотрите изображение, чтобы понять больше.

enter image description here

Вы видите, как красные фигуры проходят пешку и продолжают вверх.он должен остановиться на фигуре пешки.

Вот мой код для вычисления слона.и если это возможно, если бы вы могли также предоставить проверку для королевы и других частей, было бы действительно полезно.

    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);

1 Ответ

0 голосов
/ 12 февраля 2019

Ваш цикл for просто не содержит код для обнаружения коллизий.Он идет до самого края доски.Попробуйте разбить петлю на четыре отдельных for петли, каждая из которых заканчивается на краю доски ИЛИ при обнаружении столкновения.Столкновение необходимо обрабатывать отдельно для фрагмента того же цвета (недопустимый ход) или противоположного цвета (захват).

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. Очевидно, что вы должны параметризовать dx и dy, чтобы перебрать все комбинации +1 и -1, чтобы вы не повторяли приведенный выше код четыре раза.
  2. Если память не является проблемой, вы можете заполнить матрицу некоторыми специальными значениями на всех четырех сторонах, чтобы вам не нужно было проверять правильность x и y каждый раз.Например, если белые должны двигаться, и вы дополняете матрицу белыми пешками, тогда вы можете удалить onBoard все вместе;цикл прекратится, когда samePiece станет истинным.Это увеличивает вашу доску с 64 квадратов до 100, что может быть значительным, когда вы добавляете таблицы транспонирования.
  3. Еще лучше, рассмотрите возможность взглянуть на повернутые битборды , что совершенно другое,и намного быстрее, подход к генерации ходов.
...