国际象棋棋子运动问题

我正在用java做一个象棋游戏,而棋子给我一个问题。 我真的不知道为什么,因为他们的运动是最简单的。 这是Piece声明和Pawn(extends 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;
    }
}

编辑:添加王级作为参考

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语句。

尝试

if(this.isWhite)

要么

if(isWhite())

对于国际象棋棋盘,我认为你应该检查位置是否等于1或6.不是0或7。


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

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

应该:

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

(所以黑方,而不是白方棋子的等级在向前移动时减小)。

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

国际象棋图http://s14.postimage.org/sndhigwkx/Chess_Diagram.jpg

在这里(假设白棋要移动)白色棋子完全没有法律动作,因为它是由黑主教钉住的。 然而,如果黑棋的最后一步是c7-c5,那么白棋可以捕捉到黑棋并移动到c6(“En passant”规则)。

通过将xy分别重命名为filerank ,可以提高代码的可读性。 我也会考虑介绍一个

enum PieceColour {
   WHITE, BLACK
}

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

链接地址: http://www.djcxy.com/p/84611.html

上一篇: <Java> Chess pawn movement issue

下一篇: Modeling a chess board in wxpython