java - <Java> 国际象棋棋子移动问题

标签 java chess

我正在用java制作一个国际象棋游戏,而典当给了我一个很大的问题。老实说我不知道​​为什么,因为他们的 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> ...

(因此,当黑棋子向前移动时,其等级会降低,而不是白棋子)。

正如已经指出的,棋子移动是最难编码的 - 它可以从起始位置向前移动 2 个方格(但前提是前面没有其他棋子),它沿对角线捕获,它可以提升到其中之一其他 4 种作品类型。另外,请考虑这个位置:

Chess diagram

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

您可以通过将 xy 分别重命名为 filerank 来提高代码的可读性。我还会考虑引入一个

enum PieceColour {
   WHITE, BLACK
}

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

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

相关文章:

java - log4j:记录一个包,但不包括它的子包

java - Maven 项目找不到 Groovy 类

java - Java项目中国际象棋AI的实现

python - 国际象棋程序OO设计

tcp - 如何从管道中删除 EOF?或者 : How to use tail -f with netcat?

java - 如何通过Java恢复MySQL转储文件?

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 如何使用 Twitter4J 流 API 避免 OutOfMemory 错误?

php - Glicko-2 评级系统 : Bug or exploit?

python - 国际象棋 negamax 函数