Javaでマルチプレイヤーゲームを開発しています。これはネットワーク化とターンベースでなければならず、サーバーに接続するすべてのクライアント(2と4の間)に新しいスレッドを開始します。基本的には、各スレッドは自分のターンであるときにthrowthedice()関数を呼び出さなければならず、その後ゲームボードが新しい位置で更新されます。私はこのスレッドをwait()およびnotify()と同期させる方法を教えています(2つ以上のスレッドがある場合は、4としましょう)、各スレッドは、 ?)。また、スレッドを正しく同期させるための他の簡単な方法がありますか?それとも、本当にスレッドを同期させる必要がありますか?マルチスレッドネットワークターンベースゲーム
0
A
答えて
0
ターンベースのゲームをお持ちの場合、おそらく最も簡単な実装は、1つのスレッド内のすべてのゲームロジックを処理することです。 クライアントスレッドは、受け取ったアクションをスレッドセーフのキューに入れます。スレッドセーフなキューには、メインのゲームスレッドが読み取ります。
ロジックをスレッドに配布する場合は、異なるプレイヤーごとに異なるロックオブジェクト(つまり、Semaphore
)が必要になります(つまり、プロデューサ/コンシューマパターンのインスタンスです)。 プレイヤー1がターンした場合、スレッド1はプレイヤー2のロックを解除してスレッド2に通知します。
0
ターンベースのゲームでは、なぜこれらのスレッドを同期させる必要があるのか分かりません。クライアントのスレッドが同期されているかどうかに関係なく、サーバーがすべてのクライアントに情報を送信する限り、このターンベースのゲームを行うためのクライアント/サーバーアプリケーションを実装しています(これは良い考えです)。 。言い換えれば、「瞬間的な」アクションが起こっていない(すなわち、プレイヤーがデューティゲームのように同時に動き回る)ので、ターンベースのゲームのスレッドを同期させる理由はない。
クライアントスレッドが正しい順序で情報をメインスレッドに送信できるようにするにはどうすればよいですか? – Ana
ターンのある各クライアントに信号を送る。それがクライアントの順番でない場合、クライアントは単に情報を送信しません。正しい情報を送信するのはクライアントの責任です。ターンがないときに情報を送信する場合、サーバーはこれを適切に処理する必要があります(たとえば、単に無視するか、クライアントにエラーメッセージを送信するなど)。 –