2

私は Java でチェス ゲームを作成していますが、ポーンが問題を引き起こしています。彼らの動きは最も単純なので、正直なところ理由はわかりません。ここに Piece 宣言と Pawn (Pawn を拡張する) 宣言があります。動きのクラスは、単純な x;y オブジェクトを定義します。これを使用して、ボード上で可能な動きのターゲットをマークします。後でゲームのルールに基づいて、不可能な動きをすべて排除する GameHandler クラスがあります。しかし、ポーンの動きの配列はきれいに見えます。他のすべてのピースの動きは驚異のように機能します! 前もって感謝します!

ピースクラス

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 つのうちの 1 つに昇格できます。ピースタイプ。また、次の位置も考慮してください。

チェス図

ここで (白が動くと仮定して) 白のポーンは、黒ビショップによって固定されているため、正当な動きはまったくありません。ただし、黒の最後の動きが c7-c5 だった場合、白のポーンは黒のポーンを捕らえ、c6 に移動できます ( "En passant" ルール)。

と の名前をそれぞれ とにx変更することで、コードの読みやすさを向上させることができます。導入も検討したいyfilerank

enum PieceColour {
   WHITE, BLACK
}

PieceColour pieceColourif (pieceColour == PieceColour.BLACK)の代わりにboolean isWhiteとを使用しif(!isWhite)ます。

于 2012-11-22T17:14:14.133 に答える
1

さて、1つのアイデア。

if ステートメントを見てください。

試す

if(this.isWhite)

また

if(isWhite())

また、チェス盤の場合、位置が1または6に等しいかどうかを確認する必要があると思います。0または7ではありません。

于 2012-11-21T05:29:08.777 に答える