0

複数のスレッドを同時に実行することになっているプログラムがあります。

これはカードゲームの Uno のシミュレーションで、各プレイヤーにスレッドを用意することになっています。

ここでキャッチがあります: プレーヤーが手札の山の上にあるカードと同じ番号と色のカードを持っているが、このプレーヤーの番ではないときはいつでも、彼はラインを「カット」してカードを置くことができます. その後、ラインを切ったプレーヤーの隣のプレーヤーが続行します。

私はクラス Player を持っています:

class Player implements Runnable {

    public boolean isHisTurn = false;

    public Thread makeMove(final Card topCard, final boolean isHisTurn) {
        Thread thread = new Thread(this);
        thread.start();
        return thread;
    }
}

次に、thread.start() が run メソッドを開始します。ここで、ロジックと意思決定が行われます。run() の開始時に、スレッドは 300 ~ 700 ミリ秒のランダムな時間スリープします。これは、この時間枠内で行を切断できるようにするためです。

私の質問は、スレッドをどこかに保存する必要があるかということです。もしそうなら、別のプレイヤーの番になったときに、どこに、どのようにスレッドを切り替えることができますか? ブール値の isHisTurn と関係があることは知っていますが、使い方がわかりません。

はい、それは宿題ですが、私はそれのほんの一部を求めているだけです。完全な答えは望んでいません。正しい方向に私を後押しする何かだけです.

4

2 に答える 2

3

また、別のプレイヤーの番になったときにスレッドを切り替えるにはどうすればよいですか?

スレッドの特徴は、複数のスレッドを同時に実行できることです。その機能を使用しない場合、スレッドを使用しても意味がありません。プレーヤーは自分の番ではないときにも移動できるため、実際にはすべてのプレーヤーが同時にアクティブであることは理にかなっています。したがって、プレイヤーごとに 1 つのスレッドを作成 (および開始) します。そのスレッドは、睡眠と移動を交互に繰り返します。

これにより、スレッドがどのように相互作用できるかという問題が残ります。そのために、次のようなクラスを作成します。

class Game {
    Card topCard;
    Player nextPlayer;

    ...
}

各プレイヤー スレッドに game のインスタンスを渡します。プレイスレッドが自分の動きについて考えているとき、彼は一番上のカードと自分の番かどうかを見ることができます。移動するときは、Game インスタンスのフィールドを更新するだけです。

もちろん、異なるスレッドが同時にアクティブになる可能性があるため、2 人のプレーヤーが同時に移動しようとする可能性があります (別の言い方をすれば、あるプレーヤーがカードをプレイすることを決定しても、別のプレーヤーの方が速く、最初のプレーヤーの移動は無効になります)。Gameこれは、インスタンスへのアクセスを同期することによって最も簡単に防止できます。リアルさを求めるなら、ゲームの状態を見て同期し、考えてから、もう一度同期して行動に移したくなるかもしれません。ただし、「見て、考えて、動く」サイクル全体で同期する方が簡単な場合があります。これは、プレイヤーが他のプレイヤーの思考に干渉しないようにし、対処する必要があるまれなケースの数を減らすためです。

もう一つのしわは終了です。最初のプレイヤーの手札がなくなるとすぐにゲームが終了するため、他のプレイヤーはその事実に気付く方法が必要です。おそらく最も簡単な方法は、最後のプレーヤーが勝者を宣言し (たとえば、インスタンスにフィールドwinningPlayerを設定することGameによって)、勝者が宣言されるとすぐに他のスレッドが終了することです。

于 2013-05-19T08:45:42.580 に答える
0

通常、教授は特定の種類の解決策を探し、問題を正しく解決しようとしますが、間違った方法で解決することは、あなたにとって不利になる可能性があるため、宿題の質問を手伝うことは困難です。たとえば、プレイヤーごとに 1 つのスレッドを持つことになっていると言うのは、他にも有効な方法がたくさんあるため、非常に役立ちますが、そのようにすると宿題に問題が生じます。したがって、予想される解決策について共有する情報が他にある場合は、共有してください。この問題が選択されたのは、まだセマフォを待機していないためだと思います。

プレーヤーごとにスレッドを作成する場合は、人間のプレーヤーがどのようにプレイするかについてプログラムをモデル化できます。各プレイヤーは、ダンプの上にあるカード、他のプレイヤーが誰であるか、プレイする順番、最後にプレイしたのは誰か、何をプレイしたかを認識しています。したがって、すべてのスレッドが見ることができるいくつかのオブジェクトで、これらすべての事実を表現したいと考えています。

各スレッド (プレーヤー) には、自分だけが見ることのできる独自のハンドもあるため、スレッドごとのオブジェクトとしてモデル化する必要があります。

肝心なのはプレイヤー(スレッド)が動くこと!メイン プログラムはスレッドを開始し、ゲームが終了するのを待つだけです。プレイヤーはランダムな時間だけ眠り、目を覚まし、動くことができるかどうかを確認し、動くことができれば動くことができ、その後再び眠りにつくことができます。

于 2013-05-19T09:02:45.840 に答える