Нужна помощь в выяснении базовой логики движения в шахматах - PullRequest
0 голосов
/ 01 марта 2012

Извините за стену текста, но в настоящее время в тупик. Я не прошу «кормить ложкой», так как у меня есть базовая идея для каждого куска, просто у меня трудное время, как закончить определение моей логики движения. Позвольте мне объяснить подробнее. Я также опубликую свой код для лучшей справки.

Я пишу со структурой MVC. У меня есть модель, которая представляет собой 2D-массив BoardSquares. Какие эти BoardSquares отслеживают его местоположение на доске, какой кусок в нем (если он есть), какого цвета этот кусок (если он есть), и если он пустой. Вот код для этого:

public class BoardSquare {
// Private information stored in each BoardSquare
private boolean isSquareEmpty;
private int row;
private int col;
private String space;
private String pColor;

// Constructor to make an empty space on the board
public BoardSquare(int row, int col) {
    space = "";
    pColor = "";
    this.row = row;
    this.col = col;
    SquareEmpty();
}

//Constructor to get the information of a space with a piece
public BoardSquare(BoardPiece piece, int row, int col) {
    this.space = piece.getModelName();
    this.pColor = Character.toString((piece.getModelName().charAt(0))); 
    this.row = row;
    this.col = col;
    SquareNotEmpty();
}

public String getpColor() {
    String temp = getPieceColor(pColor);
    return temp;
}

//A bunch of auto generated getters/setters...

    // Gets the correct color label for the piece
public String getPieceColor(String info){
    String temp;
    if(info.equalsIgnoreCase("b")){
        temp = "Black";
    }
    else {
        temp = "White";
    }
    return temp;
}

В настоящее время все мои Pieces расширяют абстрактный класс BoardPiece, который также имеет несколько абстрактных методов, но мой кусок знает о его расположении на доске, его названии, цвете и массиве 2D-плат для того, как я генерирую действительные ходы.

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

Однако у меня возникают проблемы с размышлениями о том, как прекратить проверку, если, скажем, Черная Ладья находилась на левой стороне доски и хотела двигаться полностью вправо, но справа от Ладьи была Черная Пешка предотвращая это от этого. Я пытаюсь в общих чертах подумать об этом, чтобы сделать мою жизнь проще, и я могу реализовать ее и в других классах, так что вот код Rook:

public class Rook extends BoardPiece{
private String name = "Rook";
private String color;
private String modelName;

BoardSquare board[][];

// Both should remain 0 - 7
private int row;
private int col;

public Rook (String modelName, int row, int col, String color, BoardSquare[][] field) {
    this.modelName = modelName;
    this.row = row;
    this.col = col;
    this.color = color;
    this.board = field;
}

@Override
void move(BoardSquare target) {
    if(!getPossibleMove(board).contains(target)){
        //Sysout false move
    }

}

@Override
Collection<BoardSquare> getPossibleMove(BoardSquare[][] board) {
    ArrayList<BoardSquare> validMoves = new ArrayList<BoardSquare>();
    for(int i = 0; i < 8; i++){
        // Checks every column of the row that the piece is on
        if(moveValidator(board[row][i])){
            validMoves.add(board[row][i]);
        }
        // Checks every row of the column that the piece is on
        if(moveValidator(board[i][col])){
            validMoves.add(board[i][col]);
        }
    }
    return validMoves;
}

@Override
boolean moveValidator(BoardSquare space) {
    // Removes the current square the piece is on as a valid move
    if(space.getRow() == getRow() && space.getCol() == getCol()){
        return false;
    }
    //Checks if the space is not empty and the piece in the spot is the same color as the piece itself
    if(!space.isEmptySquare() && space.getpColor().equalsIgnoreCase(color)){
        return false;
    }
    return true;
}

Как я уже сказал, любая помощь или толчок в правильном направлении будут оценены. Извините за стену текста, но стараюсь быть настолько ясным, насколько я могу, чтобы тот, кто хочет помочь, мог полностью понять и увидеть мою логику.

РЕДАКТИРОВАТЬ: Забыл заметить, что Ладья также имеет автоматически генерируемые геттеры и сеттеры.

1 Ответ

3 голосов
/ 01 марта 2012

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

Это хороший подход, потому что

  • это легко понять
  • Это не дорого, пока ваша шахматная доска не станет огромной, поэтому грубая сила не проблема.
  • это обобщает на все фигуры: ладьям приходится «скользить» к месту назначения, но рыцари могут «перепрыгивать» или «телепортироваться» через другие фигуры на новое место, поэтому промежуточные прыжки не нужны.

Это звучит близко к вашей текущей реализации, но вам нужно прекратить трассировку при столкновении. То есть, если на пути есть черная пешка, столбцы после этой пешки больше не являются допустимыми пробелами, верно? Другими словами, думайте о движении как о действии , которое ладья принимает вместо независимого пространства состояний возможных ходов, поскольку некоторые пространства являются законными ходами, за исключением того, что ладья была ранее заблокирована. Вам нужно знать, где находится ладья и где она будет определять правильные ходы, а не только, если пространство находится в одном ряду.

Итак, чтение вашего кода (спасибо за публикацию контекста, кстати, это очень полезно), на самом деле все, что вам нужно сделать, это не итерировать на каждом квадрате, а итерировать , перемещаясь по каждый квадрат и остановите итерацию, когда вас заблокируют.

...