2012-03-26 4 views
1

Iveは問題を抱えています。Chesspresso 0.9.2メソッドのPosition#doMove(短い移動)を使用すると、動きを追加できません。Chesspresso:Position#doMove()を呼び出すときの問題

package com.gmail.bernabe.laurent.j2se.chesspresso_test; 

import javax.swing.JFrame; 

import chesspresso.Chess; 
import chesspresso.game.Game; 
import chesspresso.game.view.GameBrowser; 
import chesspresso.move.IllegalMoveException; 
import chesspresso.move.Move; 

public class ChessFrame extends JFrame { 

    public ChessFrame(){ 
     setTitle("Chesspresso gamebrowser test"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     add(gameBrowser); 
     pack(); 

     addMove(Chess.E2, Chess.E4, false, "Debut pour une partie ouverte"); 
     addMove(Chess.E7, Chess.E5, false, "Reponse symetrique forte"); 
     addMove(Chess.G1, Chess.F3, false, null); 
     addMove(Chess.B8, Chess.C6, false, null); 
     addMove(Chess.F1, Chess.B5, false, null); 
    } 

    private void addMove(int fromSquareIndex, int toSquareIndex, 
      boolean isCapturingMove, String comment){ 
     try { 
      short move = Move.getRegularMove(fromSquareIndex, toSquareIndex, 
        isCapturingMove); 
      if (Move.isValid(move)) { 
       chessGame.getPosition().doMove(move); 
       if (comment != null && comment.length() > 0) 
        chessGame.addComment(comment); 
      } 
     } catch (IllegalMoveException e) { 
      e.printStackTrace(); 
     } 
    } 


    private Game chessGame = new Game(); 
    private GameBrowser gameBrowser = new GameBrowser(chessGame); 
    private static final long serialVersionUID = -6856238414376776882L; 

} 

そしてここでは、私のメインクラスです:

方法ゲーム#doMoveは、()ここでIllegalMoveException

をスローする必要がありますけれども、不正な動きは、私の実験のクラスで、法律上の移動だけでなく、受け入れられているように見えます

package com.gmail.bernabe.laurent.j2se.chesspresso_test; 


public class ChesspressoGraphicalTest { 

    public static void main(String[] args) { 
     ChessFrame chessFrame = new ChessFrame(); 
     chessFrame.setVisible(true); 
    } 

} 

ご覧のとおり、私はJFrameカスタムクラスのChessPresso GameBrowserクラスから継承しました。これは、コード化したチェスのオープニング(Ruy Lopez)をナビゲートするためです。 addMoveメソッドは、Chesspressoのすべての呼び出しをラップして、移動とコメントを1行に追加します。

ChesspressoGraphicalTestクラスを起動すると、そのChesspressoGraphicalTestのデフォルトのChesspresso GameBrowser実装と動作であるボードを表示するフレームが表示されます。移動を読んだり、次の移動に移動したり、戻ることができます古い動きに...ボードの底にあるボタンのおかげで。

だから何が問題なのですか?それは非常に簡単です:(最初の移動の代わりに、例えば

addPawnMove(Chess.E2, Chess.F8, false, "Debut pour une partie ouverte"); 

)違法な動きを与えたときに、これは全く検出されていません。私はIllegalMoveExceptionを取得しませんでした。

さらに、テストMove.isValid(move)(addMove()メソッド内)を削除しても、すべての移動の有効なステータスは何でも変更されることはありません。

chesspressoの問題ですか、それとも簡単でないのですか?

助けてください。ありがとう。

+1

* if(Move.isValid(move))*を削除するとエラーオーブンが表示されませんか? –

+0

はい、それは私が直面している問題です。私は動きが違法であるかどうかを知るために今のところ何もしていません。Move.isValid()のテストを削除しました。また、私は最初の動きをE2-E8に変更しましたが、何も変わりませんでした。私の質問をあなたの通知で更新しました。 – loloof64

答えて

2

Move.isValidMove(move)は、移動自体が有効な移動または無効な移動として作成されたかどうかをチェックします。ゲームのある時間中に移動自体が有効であるかどうかをチェックしません。

あなたがする必要があることは、有効な移動のリストを取得するためにゲームの位置を使用することです(移動を自分で作成しないでください)。 chessGame.getPosition()。getPieceMove(...)を使用して、有効な移動または無効な移動を返すこともできます。

+1

ありがとうございます。 Position#getPieceMove()メソッドを使用したいと思いますが、(Javadocを見ていても)使用方法がわかりませんでした。メソッドの引数は何を意味しますか?私はしようとしました[int pieceAtStartSquare = position.getStone(fromSquareIndex);短いmove = position.getPieceMove(pieceAtStartSquare、Chess.sqiToCol(fromSquareIndex)、 Chess.sqiToRow(fromSquareIndex)、toSquareIndex);私のaddMove()メソッドでposition.doMove(move);]、私は奇妙な結果を得ました。 PLease、http://pastebin.com/wC4CvnFYを参照してください – loloof64

+1

私は最後のコメントでリンクを与えたコードで得た結果のスクリーンショットです:http://hpics.li/fa46779 – loloof64

+1

最後に私は管理しています。あなたの提案をありがとう:http://pastebin.com/n7uGpSeA。この方法はあまり速くないかもしれませんが、それは私のニーズに合っています。 – loloof64

関連する問題