Вот версия, использующая become
для отслеживания состояния в функции приема:
class Game extends Actor{
def startTimer(): Cancellable = context.system.scheduler.scheduleOnce(5 seconds, self, "userMissed")
def receive = idleReceive(0)
def idleReceive(actsCount: Int): Actor.Receive = {
case "userStart" => startTimer()
context.become(waitingReceive(actsCount, startTimer()))
sender() ! "do move"
}
def waitingReceive(actsCount: Int, timer: Cancellable): Actor.Receive = {
case "userAct" =>
println("> user made his move")
context.become(idleReceive(actsCount + 1))
timer.cancel()
case "userMissed" =>
println("> user missed his move")
context.become(idleReceive(actsCount))
}
}
Требуется дополнительная обработка ошибок, включая условие гонки, когда таймер срабатывает, пока сообщение "userAct" находится в процессе передачи. Вам также нужно добавить еще одно сообщение, чтобы получить значение actsCount
.