2

ScalaとAkkaの両方を学ぶために、私は戦艦ゲームを書いています。私はまだ実際にコードを書き始めていません。ただ物事がどのように機能するかを考えているだけです。

船とプレイヤーの艦隊のエージェントがいて、「発砲」、「ヒット」、「ミス」、「すべての船が殺された」などのメッセージがあります。私の最初のつまずきは、プレーヤー1がシュートすると、イベントのバーストが発生し、プレーヤー2は、すべてが落ち着くまで待ってから自分のターンをプレイできるようにする必要があることです。どうすればそれを確認できますか?何があっても常に返信を送信し、送信者が送信されたメッセージとまったく同じ数の回答を受信することを数えるのではないかと思いました。たぶん戦艦はエージェントにとって最良の候補アプリケーションではありません。

これはまた、メッセージがまだ処理されていない、エージェントが何も応答しなかった、またはエージェントが死亡したために応答がないことを区別するという問題をもたらします。しかし、後で使用するためにそれを保存します。

4

1 に答える 1

1

ここでやりたいことがいくつかあります。

  • 最初のアクターに各メッセージへの返信を受信させてから、2番目のアクターに順番のメッセージを送信します

  • 特定のターンにいくつのイベントを受信する必要があるかを示すメッセージを2番目のアクターに送信します

これらは次のように達成できます。

import akka.pattern._
(d1 ? m1) zip (d2 ? m2) pipeTo that

上記の例でd1/2は、は宛先アクターでm1/2あり、は送信されるメッセージです。これらのアクターからの応答は(に)一緒に圧縮され、2番目のアクター(例ではTuple2)に転送されます。that

2番目のメカニズムはもう少し複雑です。を使用して同様のことを書きましたSyncPoints。だから、このようなもの:

case class SyncPoint(id: UUID, participants: ActorRef*)
object SyncPoint {
  def newFor(participants: ActorRef*) = SyncPoint(UUID.createRandomUUID, participants)
}

次に、メッセージの作成者は、最初にSyncPointを最終的なオブザーバーに送信します

val sync = SyncPoint.newFor(d1, d2)
that ! sync

SyncPointこれで、最終的な受信者は、参加者ごとにこれに関するメッセージを期待していることを認識します。

d1 ! SyncPart(m1, sync)
d2 ! SyncPart(m2, sync)

どこ

case class SyncPart(msg: Any, sync: SyncPoint)

アクターはd1、メッセージ内の自分の部分を処理したときにd2転送します。that

case class SyncPartial(sync: SyncPoint, participant: ActorRef)

このようにthatして、多数の参加者からのメッセージを予期していることを認識し、これらの参加者がいつ処理を実行したかを追跡できます。

于 2012-06-02T11:18:52.543 に答える