1

mvc design で gui を使ってチェス ゲームを書いています。

ステップ 1: メイン メニューが表示され、ゲーム MOD を選択します。

ステップ 2: 選択すると、メイン メニューが閉じて新しいウィンドウが開き、ボードとピースが表示されます。次に、マウスでプレイします。

ステップ 1 の場合。actionEvent を使用して、クリックしたボタンの文字列を確認します。たとえば、標準ゲームのボタンがあり、モデルが dataBoard を設定し、observer(=view) に通知します。

ステップ 2 の場合。私は mouseEvent を使用し、相対座標 x/y をチェックします。モデルはその動作を実行し、ピースを移動できるかどうかを判断します。

2 つの更新メソッドを表示したいと考えています。1 つは 用step 1、もう 1 つは 用step 2です。現在、常に最初の更新に移動します。

// this is in the model, initializing once you chose a game mod,
// this is for the first step.
public void initializeGame(String givenString){
    abstractGame = factoryGame.createGame(givenString);
    abstractGame.startPlaying(boardTest);
    setChanged();
    notifyObservers(5);
}

// this is in the model, doing stuff, this is for the second step.
public boolean checkGivenCoordinates(int sourceRow, int sourceColumn, int     destinationRow, int destinationColumn) throws IncorrectCoordinatesException,     IncorrectColorException, InvalidMoveException
{
    if(abstractGame.checkCorrectCoordinates(sourceRow, sourceColumn, destinationRow, destinationColumn) == true)
    {
        abstractGame.checkMove(sourceRow, sourceColumn, destinationRow, destinationColumn);
        int [] changeView = {sourceRow, sourceColumn, destinationRow, destinationColumn};
        System.out.println("Model     : in the move ");
        setChanged();
        notifyObservers(changeView);
        return true;
    }
    else
        throw new IncorrectCoordinatesException();
}


// Called from the Model
public void update(Observable obs, Object obj) { // this is the one it always goes to now.

    //who called us and what did they send?
    System.out.println ("First update View    : Observable is " + obs.getClass() + ", object passed is " + obj.getClass());
} //update()

// Called from the Model
/* this is for step 2, but is not invoked.
   The array I send holds 4 ints, source row/column and destination row/column.
   this is what I do in model just prior to notifying,
   supposed to go to step 2's update method,
   but as stated, it doesnt.
*/
public void update(Observable obs, int[] obj) {

    //who called us and what did they send?
    System.out.println ("Second update View     : Observable is " + obs.getClass() + ", object passed is " + obj.getClass());
    graphBoardView.setMove(obj[0], obj[1], obj[2], obj[3]);

} //update()

それで、

1) 1 つのクラスで複数のアップデートを行うことはできますか?

2)もしそうなら、どうすれば正しい更新方法に通知することができますか?

3) q1 が不可能な場合、どうすればこれを回避できますか?

4) オブジェクト obj が原因で、常に最初のオブジェクトに移動する可能性がありますか?

前もってありがとう、アリエル。

4

1 に答える 1

1

実際、同じクラスに同じ名前の複数のメソッドを含めることができますが、パラメーターは異なります。

あいまいさがある場合にコンパイラがどのメソッドを使用するかを決定できない場合に、何が表示されるかがわかります。配列も同様であることに注意してObjectください。

簡単なテストケースで動作するはずです:

new Test().update(new Observable(), new int[]{1, 2});
new Test().update(new Observable(), new Object());

正しいメソッドが呼び出されます。

どのようにメソッドを呼び出していますか?

于 2013-02-20T13:23:05.147 に答える