CS 教育の一環として、Ruby/EventMachine に基づく TCP サーバーによってリンクされたクライアントを使用して、ゲーム イベントを表す JSON メッセージがやり取りされるマルチプレイヤー Android yatzy ゲームを構築中です。
しかし、ゲーム ターン管理をどのように最適に処理するかについて、私は確信が持てません。
典型的なヤッツィー ゲームは 15 ラウンドで構成されます。私の実装では、最大 4 人のプレーヤーを処理します。サイコロのロール、サイコロのホールド、スコアの選択などのイベントは、Ruby サーバーに送信され、他のプレイヤーにブロードキャストされます。
現在、私のサーバーはゲーム ターンを処理しています。クライアントから新しいスコアの選択肢を受け取るたびに、スコアを他のクライアントにブロードキャストします。続いて、次にサイコロを振るプレイヤーのユーザー ID を含むメッセージをブロードキャストします。
私はシステムが脱落したプレイヤーを処理できるようにしたいと考えています。解決策を思いつきましたが、それが理想的であるとは確信が持てません。
@turnfiber = Fiber.new do
15.times do
@players.each do |key, value|
Fiber.yield value
end
end
end
@turnfiber
実行中のゲームを表すゲームオブジェクトに属するインスタンス変数です。@players
プレーヤーの一意の ID をキーとして使用し、対応するプレーヤー オブジェクトを値として使用するハッシュです。
@turnfiber.resume
ターンが終了するたびに (スコアの選択の提出を通じて) 呼び出され、サイコロを転がす次のプレーヤーを取得し、サイコロを振る許可をブロードキャストします。プレイヤーがターン 4 でゲームを離れた場合、クライアントは終了メッセージを送信して、去るプレイヤーを@players
ハッシュから削除し、彼の離脱をブロードキャストし、プレイヤーがハッシュに存在しなくなったため、@players
後続の反復を防止するという考え方です。サイコロのコントロールを「死んだ」プレーヤーに渡すことから、デッドロックを回避します。これまでのところ、私の Android クライアントは不完全なので、この理論が実際に実際に機能するかどうかはまだテストしていません。
私がファイバー クラスを選択したのは、 を 15 回繰り返し@players
てサイコロを 1 つずつ振らせたいという欲求に基づいています。ファイバーは、呼び出されるたびにループを一時停止しyield
てプレーヤーを返すため、これを可能にします。
このアプローチについて、特にどのような弱点があるか、ターン管理の問題を解決するために検討すべき代替手段について、ご意見をお聞かせください。