gpt4 book ai didi

java - 国际象棋棋子移动问题

转载 作者:行者123 更新时间:2023-12-04 05:23:22 26 4
gpt4 key购买 nike

我正在用 Java 制作国际象棋游戏,而 pawns 给我带来了一个大问题。老实说,我不知道为什么,因为他们的 Action 是最简单的。这是 Piece 声明和 Pawn(扩展 Piece)声明。运动类定义了一个简单的 x;y 对象,我用它来标记棋盘上可能的运动目标。我有一个 GameHandler 类,稍后会根据游戏规则清除所有不可能的运动。但是 Pawn 的移动阵列似乎很干净;所有其他作品的 Action 都像奇迹一样!提前致谢!

计件类

public abstract class Piece{
protected int x, y;
protected boolean isWhite;
protected ArrayList<Movement> moves;
public Piece(int x, int y, boolean isWhite) {
this.x=x;
this.y=y;
this.isWhite = isWhite;
moves = new ArrayList<Movement>();
}
public abstract ArrayList<Movement> getMoves();
//obvious methods
public int getX()
public int getY()
public boolean isWhite()
//end obvious methods
public void setCoordinates(int x, int y){
this.x=x;
this.y=y;
}
}

典当类
public class Pawn extends Piece{
public Pawn(int x, int y, boolean isWhite){
super(x,y,isWhite);
}
public ArrayList<Movement> getMoves() {
moves.clear();
if(isWhite){
if(y>0) moves.add(new Movement(x, y-1));
if(y==7) moves.add(new Movement(x, y-2));
}else{
if(y<7) moves.add(new Movement(x, y+1));
if(y==0) moves.add(new Movement(x, y+2));
}
return moves;
}
}

编辑:添加 King 类作为引用
public class King extends Piece{
public King(int x, int y, boolean isWhite){
super(x,y,isWhite);
}
public ArrayList<Movement> getMoves() {
moves.clear();
if(y-1>=0 && x-1>=0) moves.add(new Movement (x-1, y-1));
if(y-1>=0 && x+1<8) moves.add(new Movement (x+1, y-1));
if(y+1<8 && x+1<8) moves.add(new Movement (x+1, y+1));
if(y+1<8 && x-1>=0) moves.add(new Movement (x-1, y+1));
if(y-1>=0) moves.add(new Movement (x, y-1));
if(y+1<8) moves.add(new Movement (x, y+1));
if(x+1<8) moves.add(new Movement (x+1, y));
if(x-1>=0) moves.add(new Movement (x-1, y));
return moves;
}
}

最佳答案

我认为这一行有一个错误:

if(isWhite){
if(y>0) moves.add(new Movement(x, y-1));
...

应该是:
if(!isWhite) {
if(y> ...

(所以当它向前移动时,黑色而不是白色棋子的等级会降低)。

如前所述,pawn 移动是最难编码的——它可以从起始位置向前移动 2 个方格(但前提是前面没有其他棋子),它对角线捕获,它可以提升到其他 4 个方格之一件类型。另外,请考虑这个位置:

Chess diagram

这里(假设白棋要走)白棋根本没有合法走棋,因为它被黑象钉住了。但是,如果黑方的最后一步是 c7-c5,那么白棋可以捕获黑棋并移动到 c6 ( "En passant" rule )。

您可以通过重命名 x 来提高代码的可读性和 yfilerank ,分别。我也会考虑引入一个
enum PieceColour {
WHITE, BLACK
}

并使用 PieceColour pieceColourif (pieceColour == PieceColour.BLACK)而不是 boolean isWhiteif(!isWhite) .

关于java - <Java> 国际象棋棋子移动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13466671/

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