3

私が作っているゲームには2つのクラスがあります。

ゼロとクロスのゲームのための gui クラスとロジック クラス。GUI クラスには、JButton の配列を使用し、同じ匿名の内部クラス アクション リスナーでそれらすべてを返すメソッドがあります。

問題はこれです。ボタンをクリックすると、プレーヤー1または2の移動に応じてテキストをxまたはaoに変更したいのですが、このコードはロジッククラスにあるはずなので、何らかの形でメソッドを作成する必要がありますロジック クラスを作成し、make ボタン メソッドの anon 内部クラス アクション リスナーから呼び出します。ただし、ロジック クラスは GUI への参照を持つべきではありません。GUI にはロジック クラスへの参照があるためです。

私はこれに対するまともな解決策を考えることができません

ありがとう

4

8 に答える 8

3

次のクラスのスケッチを検討してください。

public class Game{
    public void switchPlayer(){
        // among other things calls all GameListeners
    }
    public void setMarker(int x, int y);

    public Player getCurrentPlayer();
    public Player getPlayerOwningField(int x, int y);

    public void registerGameListener(GameListener l);
}

public interface GameListener(){
    void gameChanged(Game g)
}

public class GUI implements GameListener(){
    private Game game;
}

フィールドがクリックされると、game.setMarker(x,y) が呼び出されます。ゲームは現在のプレーヤーが誰であるかを認識しているため、フィールドを適切にマークできます。また、GameChanged イベントを発生させます。アプリケーションのセットアップ中に、GUI を登録するか、自分自身を GameListener としてゲームに登録する必要があります。そのため、情報も得られます。ゲームのゲッターを使用して、GUI を更新します。終わり。

もちろん、改良の余地は十分にあります。たとえば、大規模なゲームでは、1 つのフィールドが変更されたという理由だけで UI 全体を更新することはお勧めできません。

于 2009-03-16T11:09:53.783 に答える
1

多分イベントを使用します。そのため、ロジックの計算の GUI 側で反応し、単に命令どおりに実行することができます ;)

于 2009-03-16T10:44:36.637 に答える
0

複数のボタンのアクション リスナーとして同じインスタンスを使用することは、ほぼ間違いなく悪い考えです。ボタンの位置でパラメーター化された同じ実装クラスの別のインスタンスを使用します。その後、リスナーは、モデルに適したインターフェースを使用してモデルを呼び出すことができます。

于 2009-03-16T11:04:49.630 に答える
0

設計に重点を置いている場合 (これは宿題のように聞こえます)、MVC (Model-View-Controller)を試すことができます。

この場合、

model = game logic, rules (fire events when things change)
  gui = (in this case and many swing apps) is both view and controller. Manipulates the model (control) and the model fires events back to update the widgets (view)
于 2009-03-16T11:07:14.103 に答える
0

双方向の参照 (GUI にはモデルの参照があり、その逆) が問題になるとは思いません。あなたが探しているのは、MVC (Model-View-Controller) アプローチだと思います。そのゲームのプログラミングに使用しているプログラミング言語はわかりません。このアプローチを適用するかどうかは、このコンテキストではオーバーヘッドになる可能性があります。Java で MVC アプローチの小さなデモを作成しました: http://blog.js-development.com/2008/03/logical-separation-with-mvc.html

多分それはあなたを助ける、私に知らせてください。

于 2009-03-16T11:09:12.087 に答える
0

ボタンのクリックが発生すると、GUI はロジックを呼び出して、現在のプレーヤー (ロジックは現在のプレーヤーを認識しています) がグリッドのどこかをクリックしたことを通知します。次に、ロジックは状態を更新し (グリッドの更新、現在のプレーヤーの更新など)、イベントを GUI に送り返し、GUI 自体を更新する必要があることを通知します。

GUI は、操作を呼び出すためのロジックを「認識」しています。ロジックが GUI を認識しないようにし、問題を適切に分離するには、ロジックが GUI を直接呼び出すのではなく、Observer パターンを介してロジックを GUI に結合する必要があります。GUI は、ロジックからのイベントをリッスンします。その場合、ロジックは GUI に動的に結合されるだけであり、これは問題ではありません。

于 2009-03-16T11:09:47.373 に答える
0

MVCパターンを適用できます。

UI クラス (コントローラー) はメッセージをロジック クラス (モデル) に送信し、ロジック クラス (モデル) はビュー (クラス) を更新します。これを定義する必要があります。ブール値の配列と同じくらい簡単です。

ボタンのテキストを変更するには、UI コードで View クラスを読み取る必要があります。そのため、View が変更された場合、ボタンのテキストが更新されるように、「無効化」メッセージを UI クラスに送信する必要があります。

ここで重要な点は、UI コードが View オブジェクトを参照してボタンをレンダリングすることです。UI クラスがこのオブジェクトを読み取り、ロジック クラスがそれを書き込むのは完全に正しいことです。

于 2009-03-16T11:12:35.183 に答える
-2

データベースまたは sth にイベント フラグを保存します。そのようにして、GUIでこのフラグを照会すると、非同期のように機能します。イベント

于 2009-03-16T11:10:07.293 に答える