gpt4 book ai didi

java - 需要帮助弄清楚基本的国际象棋移动逻辑

转载 作者:行者123 更新时间:2023-12-02 00:28:54 25 4
gpt4 key购买 nike

抱歉,文字墙很长,但目前很困难。我并不是要求“填鸭式”,因为我对每件作品都有基本的想法,只是我在如何完成确定我的移动逻辑方面遇到了困难。请允许我进一步解释一下。我也会发布我的代码以供更好的引用。

我正在使用 MVC 结构进行编码。我有一个模型,它是 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;
}

目前我的所有作品都扩展了一个抽象 BoardPiece 类,该类也有几个抽象方法,但我的作品知道它在棋盘上的位置、它的名称、它的颜色以及我生成的 2D 棋盘数组的方式有效的 Action 。

我通过检查它可以移动到的空间并查看它们是否为空并将它们添加到 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;
}

就像我说的,任何帮助或插入正确的方向将不胜感激。抱歉,文字墙很长,但我试图尽可能清晰,以便任何想要提供帮助的人都可以完全理解和看到我的逻辑。

编辑:忘记注意 Rook 也有自动生成的 Getter 和 Setter。

最佳答案

我会用最暴力、最直观的方式来处理它:想象一下在车轮流时一次移动一格,看看它是否与任何东西发生碰撞。也就是说,让它跳过每个方格,直到到达所需的位置,并检查每个方格的移动是否有效。

这是一个很好的方法,因为

  • 很容易理解
  • 在你的棋盘变得非常巨大之前,它并不昂贵,所以暴力破解不是问题。
  • 它适用于所有棋子:车必须“滑行”到目的地,但骑士可以“跳跃”或“传送”其他棋子到新位置,因此不需要中间跳跃。

这听起来很接近您当前的实现,但您需要在碰撞时停止跟踪。也就是说,如果路上有一个黑色棋子,那么该棋子之后的列就不再是有效的空格,对吗?换句话说,将移动视为车采取的 Action ,而不是可能移动的独立状态空间,因为除了车之前被阻挡之外,某些空间是合法的移动。您需要知道车来自哪里以及它将在哪里确定有效的移动,而不仅仅是空间是否位于同一行。

因此,阅读您的代码(顺便说一句,感谢您发布上下文,这非常有帮助),您真正需要做的不是在每个方 block 上迭代,而是迭代移动每个方 block ,当你被阻塞时停止迭代。

关于java - 需要帮助弄清楚基本的国际象棋移动逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9521748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com