2009-03-16 11 views
3

私は作っているゲームに2つのクラスを持っています。クラスデザイン

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

問題はこれをクリックすると、テキストがxまたはao依存に変更されますプレイヤー1または2の上で、このコードはロジッククラスにする必要がありますので、どうか私はロジッククラスでメソッドを作成して、ボタンクラスメソッドのanon内部クラスアクションリスナーから呼び出す必要があります。 GUIは、ロジッククラスへの参照を持っているようしかし、ロジッククラスは、

をGUIへの参照を持っているはずの私は感謝

答えて

1

は多分イベントを使用して、この

にまともな解決策を考えるカント。したがって、ロジックの計算のGUI側で反応し、コマンドされたとおりに行うことができます。)

+0

申し訳ありませんが、どのようにイベントを意味しますか、これを説明するためのよりよい方法がありますか、または私があなたが意味することに関するチュートリアルにリンクする可能性がありますか? –

+0

イベントに関するSunのドキュメント:http://java.sun.com/docs/books/tutorial/uiswing/events/index.html 私はJavaプログラマーではないので、例として掲示するコードはありません。 – Sascha

0

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

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

Iは、双方向参照(GUIがモデルとその逆の参照を持っている)ことが問題であるべきである見つけることはありません。あなたが探しているのは、MVC(Model-View-Controller)のアプローチだと思います。私はあなたがそのゲームをプログラミングするためにどのプログラミング言語を使用しているのか分かりませんし、このアプローチを適用するかどうかは、この文脈でオーバーヘッドになる可能性があります。 私はJavaでMVCアプローチのデモを書いています。http://blog.js-development.com/2008/03/logical-separation-with-mvc.html

多分、あなたに教えてください。

0

ボタンがクリックされると、GUIはロジックを呼び出して、現在のプレーヤー(ロジックは現在のプレーヤーが知っている)がどこかのグリッドをクリックしたことを知らせます。次に、ロジックは状態を更新し(グリッドの更新、現在のプレーヤーの更新...)、GUIにイベントを戻してGUIに更新する必要があることを通知します。

GUIは、操作を呼び出すロジックについて「認識」しています。ロジックがGUIを知ることを避け、懸念を十分に分離するには、GUIを直接呼び出すロジックではなく、オブザーバーパターンを介してロジックをGUIに結合する必要があります。 GUIはロジックからのイベントをリッスンします。ロジックは、GUIにのみ動的に結合されますが、問題はありません。フィールドをクリックすると、game.setMarker(x、y)が呼び出され

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

3

は、クラスの次のスケッチを考えます。ゲームは現在のプレイヤーが誰であるかを知るので、フィールドを適切にマークすることができます。 GameChangedイベントも発生します。アプリケーションのセットアップ中、GUIはゲームにGameListenerとして登録/登録される必要があります。だからそれはまた情報になるでしょう。ゲームのゲッターを使ってGUIを更新します。完了しました。

もちろん、洗練の余地が十分にあります。大規模なゲームでは、1つのフィールドが変更されたため完全なUIを更新することはお勧めできません。

-2

イベントフラグをデータベースまたはsthに保存します。あなたのguiのこのフラグを照会してください はasyncのように動作します。イベント

+0

次回にもっと努力してください、D +。 – CiscoIPPhone

0

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

UIクラス(Controller)はLogicクラス(Model)にメッセージを送信し、View(Class)を更新します。これを定義する必要があります。これは、ブール値の配列のように単純なものにすることができます。

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

ここで重要なポイントは、UIコードがボタンをレンダリングするためにViewオブジェクトに問い合わせることです。このオブジェクトとロジッククラスを読み込むには、UIクラスが完全に正しいです。

関連する問題