2

为了同时学习 scala 和 akka,我正在编写一个 Battleship 游戏。我还没有真正开始编写任何代码,我只是在考虑事情会如何工作。

我有船只和玩家舰队的代理,以及诸如“开枪”、“命中”、“未命中”、“所有船只被击毙”之类的消息。我的第一个绊脚石是,当玩家 1 射击时,它会引发一系列事件,而玩家 2 必须等到一切都解决后才能轮到他玩。我怎样才能确定呢?我想也许无论如何我都会发送回复,然后计算发件人收到的答案与发送的消息一样多。也许 Battleship 不是代理的最佳候选应用程序。

这也带来了一个问题,即由于消息尚未处理而没有收到答复,代理没有回复任何内容,或代理死亡之间的区别。但我会保存那个以备后用。

4

1 回答 1

1

您可能想在这里做很多事情:

  • 让第一个参与者收到对其每条消息的回复,然后将轮到您的消息发送给第二个参与者

  • 向第二个参与者发送消息,指示在给定回合中必须接收多少事件

这些可以通过以下方式实现:

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

在上面的示例中,d1/2是目标参与者,m1/2是要发送的消息。这些参与者的回复被压缩在一起(到 a 中Tuple2)并转发给第二个参与者(that在示例中)

第二种机制涉及更多。我用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)

演员将在他们处理完他们在消息中的部分后继续转发d1d2that

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

通过这种方式,that它知道它正在等待来自多个参与者的消息,然后可以跟踪这些参与者何时执行了他们的处理。

于 2012-06-02T11:18:52.543 回答