【问题标题】:<Java> Chess pawn movement issue<Java> 国际象棋棋子移动问题
【发布时间】:2012-11-20 04:37:52
【问题描述】:

我正在用 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;
    }
}

【问题讨论】:

  • 目前还不清楚你是如何对你的队伍进行编号的,但听起来你想检查 y == 6y == 1 而不是 7 和 0,因为棋子先于其他棋子开始。
  • 您还有其他可以发布的游戏作品吗?
  • Pawn 并不是最简单的一种。它可以从双招开始,它可以变成皇后。例如,比主教复杂得多。
  • 它也可以攻击对角线
  • 并受en passant规则的约束

标签: java chess


【解决方案1】:

我认为这行有一个错误:

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

应该是:

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

(这样黑棋,而不是白棋棋子的等级在向前移动时会降低)。

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

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

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

enum PieceColour {
   WHITE, BLACK
}

并使用PieceColour pieceColourif (pieceColour == PieceColour.BLACK) 代替boolean isWhiteif(!isWhite)

【讨论】:

  • 这是一些有趣的想法.. 我目前正在为棋子编写 en passant,但我还没有编写将死条件。还有,这是我最早的 Java 作品之一,第一次在拼贴中学习对象编程,还有更多我们没有时间介绍;所以我必须先阅读一些关于“枚举”类、接口、结构、对象、.. 的东西,然后才能使用它(并理解它是什么哈哈)谢谢你的帮助!
【解决方案2】:

好的,一个想法。

看看你的 if 语句。

试试

if(this.isWhite)

if(isWhite())

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

【讨论】:

  • 已经修复!在 1-6 个位置上是正确的。此外,问题是我检查的是列而不是典当上的行。因为典当是唯一沿固定方向移动的部分,因此需要更难定义。我定义错误它哈哈哈它一直没有给我任何可用的动作,因为它正在检查棋子两侧的空位,而不是在前面:应该比较 x 而不是 y
猜你喜欢
  • 2015-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 1970-01-01
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多