2

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

件类

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;
    }
}
4

2 回答 2

2

我认为这行有一个错误:

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

应该:

if(!isWhite) {
   if(y> ...

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

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

国际象棋图

在这里(假设白方要移动)白棋根本没有合法的移动,因为它被黑主教钉住了。但是,如果黑方的最后一步是 c7-c5,那么白棋可以捕获黑棋并移动到 c6(“过路”规则)。

x您可以通过分别重命名和yasfile和来提高代码的可读性rank。我也会考虑引入一个

enum PieceColour {
   WHITE, BLACK
}

并使用PieceColour pieceColourandif (pieceColour == PieceColour.BLACK)代替boolean isWhiteand if(!isWhite)

于 2012-11-22T17:14:14.133 回答
1

好的一个想法。

看看你的 if 语句。

尝试

if(this.isWhite)

或者

if(isWhite())

同样对于棋盘,我认为您应该检查位置是否等于 1 或 6。不是 0 或 7。

于 2012-11-21T05:29:08.777 回答