0

自分がやろうとしていることを簡潔に説明するのに少し苦労しているので、答えを探す能力が損なわれています。私は自分の問題を具体的にしようとします。誰かが提案をしたり、勉強する方向に私を向けたりすることができれば、私はそれを大いに感謝します。

カードゲームDominionのGUIバージョンをプログラムしようとしています。この場合、異なるカードをプレイすると、異なる結果と選択肢が得られます。これらのカードの多くは、開始の選択肢が似ていますが(たとえば、手札からカードを選択してゴミ箱に入れる/敵の手札を見る)、終了の選択肢が異なります(たとえば、そのゴミ箱のカードをアップグレードする/ゴミ箱のカードを別のプレイヤーに渡す)。カードを再生すると、プログラムは一意の数値カードコードを探し、そのカードに固有のコードの実行を開始します。

これが私が電話を切ったところです:

一意のカードコード内でユーザー入力をリッスンするより一般的なメソッドが欲しいのですが、エラーが発生し続けます。理想的には、私は次のようなことができるでしょう

for(int i = 0; i < totalPlayers; i++)
{
    showEnemyHand(i);
}

また

for(int i = 0; i < totalPlayers; i++)
{
    thiefEffect(i);
}

'buttonclicked'イベント(具体的には「トランプ」ボタン)内。showEnemyHand(int)およびthiefEffect(int)メソッドは、ユーザー入力を待機し、応答を保存してから、呼び出されたforループに戻ります。からですが、当初思っていたほど簡単ではありません。

私は自分が何を探しているのかさえわからないことに最も苦しんでいます。私はイベント処理とデリゲートについて読んでいますが、それが必要かどうかはわかりません。誰かが私が学ぶ必要がある方向に私を向けることができますか、または私がそれを少し簡単に検索できるように私が解決しようとしていることのトピックを私に与えることができますか?(もちろん、私がそれを解決するのを手伝ってくれるとありがたいです= D)

本当にありがとう!ジェイク

4

1 に答える 1

0

あなたの解決策は、コマンドラインベースのゲーム、継続/コルーチンのある言語、またはマルチスレッドアプリケーションで、showEnemyHandetcがユーザー入力をブロックする場合に適しています。GUIベースのゲームの場合、イベント駆動型アーキテクチャが実際に最適に機能するので、原則として、それについてさらに学ぶことをお勧めします。

しかし、本当にループを使用してそれを実行したい場合は、スレッド化呼び出しのブロックについて読むことをお勧めします。概念を理解すると、次のことができるようになります。

  1. ループをホストするための別のスレッドを作成します。
  2. ユーザーが何かを入力するまで実行をブロックするロックを作成します(リンクされた質問の例を参照してください)。
  3. ループとユーザー入力のコールバックで そのロックを使用します。
    1. ループの開始時に、ロックを待ちます。
    2. ユーザーが何かを入力すると(イベントハンドラーを使用して検出します。使用している特定のGUIフレームワークのドキュメントを参照してください)、選択したアクションを保存してロックを解除します。
    3. ループは自動的に続行され、保存されたアクションを読み取り、同じポイントに再び到達して別のユーザー入力を待つまで反復を実行します。

この方法がイベント駆動型ロジックを使用してルールをコーディングするよりも簡単か難しいかにかかわらず、議論の余地があります。コルーチンについても同じことが言えます(コルーチンについてはあまり経験がありませんが、私は意見を述べることができません)。私が与えたポインタは、あなたが始めるのに役立つはずです。

于 2012-07-03T05:26:54.513 に答える