我正在用java制作国际象棋游戏,然后典当给我一个问题。我老实说不知道为什么,因为他们的动作是最简单的。这是Piece声明和Pawn(extends Piece)声明。移动类定义了一个简单的x; y对象,用于标记棋盘上可能的移动目标。我有一个GameHandler类,以后根据游戏规则来描述所有不可能的移动。但Pawn的动作阵列看起来很干净;所有其他作品的动作都像奇迹一样!提前谢谢!
Piece class
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;
}
}
Pawn class
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;
}
}
答案 0 :(得分:2)
我认为这一行存在一个错误:
if(isWhite){
if(y>0) moves.add(new Movement(x, y-1));
...
应该是:
if(!isWhite) {
if(y> ...
(因此黑色,而不是白棋子的级别在向前移动时会减少)。
正如已经指出的那样,典当移动是最难编码的 - 它可以从起始位置向前移动2个方格(但前提是没有其他部分),它会对角捕获,它可以促进其中一个其他4种类型。另外,请考虑这个立场:
Chess diagram http://s14.postimage.org/sndhigwkx/Chess_Diagram.jpg
这里(假设白色要移动)白色棋子完全没有法律动作,因为它是由黑人主教固定的。但是,如果黑方的最后一次移动是c7-c5,那么白棋子可以捕捉黑棋子并移动到c6("En passant" rule)。
您可以将x
和y
分别重命名为file
和rank
,从而提高代码的可读性。我也会考虑引入一个
enum PieceColour {
WHITE, BLACK
}
并使用PieceColour pieceColour
和if (pieceColour == PieceColour.BLACK)
代替boolean isWhite
和if(!isWhite)
。
答案 1 :(得分:1)
好的一个想法。
看看你的if语句。
尝试
if(this.isWhite)
或
if(isWhite())
同样对于国际象棋棋盘,我认为你应该检查位置是否等于1或6.不是0或7.