2012-11-20 41 views
2

我在用java製作象棋遊戲,棋子給我一個地獄般的問題。我真的不知道爲什麼,因爲他們的運動是最簡單的。這是Piece聲明和Pawn(extends Piece)聲明。運動類定義了一個簡單的x; y對象,我用它來標記棋盤上的可能運動目標。我有一個GameHandler類,稍後將根據遊戲規則來處理所有不可能的運動。但Pawn的動作陣列似乎很乾淨;所有其他作品的動作都像奇蹟般運作!提前致謝!<Java>國際象棋棋子運動問題

件類

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類

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; 
    } 
} 
+0

你有任何其他遊戲作品可以發佈嗎? –

+0

典當並不是最簡單的一種。它可以從雙動開始,它可以變成皇后。例如,比主教更復雜。 – Thilo

+2

它也可以攻擊對角線 –

回答

1

好的一個想法。

看看你的if語句。

嘗試

if(this.isWhite) 

if(isWhite()) 

也爲國際象棋的棋盤,我認爲你應該檢查,如果位置等於1或6不爲0或7

+0

已經修復!真正的1-6位.. 此外,問題是,我在列中檢查,而不是在典當行。因爲典當是唯一的部分,在一個固定的方向移動它需要harderly定義..和我misdefined它hahahah它不斷給我沒有任何可用的動作,因爲它是檢查在棋子的兩側空的位置,而不是在前面:應該比較x而不是y –

1

我認爲這行有一個錯誤:

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)。

分別將xy分別改爲filerank,可以提高代碼的可讀性。我也會考慮引入

enum PieceColour { 
    WHITE, BLACK 
} 

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

+0

這是一些有趣的想法..我目前正在編碼這是典型的典當,但我還沒有編寫死亡條件。另外,這是我在Java中的第一部作品之一,第一次學習對象的拼貼編程,還有更多我們沒有時間覆蓋;所以我將不得不讀一些關於那個「枚舉」類,接口,結構,對象,..之前,我可以使用它(並瞭解它是哈哈哈)感謝所有幫助順便說一句! –