【发布时间】:2017-05-08 17:50:30
【问题描述】:
我正在开发一款依赖回合顺序的本地游戏。
规则;
- 游戏中有多个
phases(即:买、卖) - 在每个
phase期间,一名玩家转一圈 - 在每个玩家(按顺序)完成他们的回合之前,每个
phase都不会被视为完成。
我不确定如何管理这些数据。有很多事情要跟踪。
- 我们所处的阶段
- 当前轮到的玩家
- 当所有玩家完成他们的回合时
- 当回合顺序结束时,我们可以进入下一阶段。
- 在所有阶段完成后重置所有回合完成
我认为订阅模式是解决此问题的最佳方法,但我不习惯这种模式。
目前我正在使用与待办事项类似的系统,其中阶段本身可以标记为完成或不完整。
这就是我目前在 Swift Playground 中处理轮班订单和阶段的方式。
// Turn order management
class TurnOrderManager: NSObject
{
static var instance = TurnOrderManager()
var turnOrder: [Player] = [Player]()
private var turnOrderIndex = 0
var current: Player {
return turnOrder[turnOrderIndex]
}
func next() {
if (self.turnOrderIndex < (self.turnOrder.count-1)) {
turnOrderIndex += 1
}
else {
print("Reached end of line")
}
}
}
class Player: NSObject {
var name: String = ""
override var description: String {
return self.name
}
init(name: String) {
super.init()
self.name = name
}
}
let p1:Player = Player.init(name: "Bob")
let p2:Player = Player.init(name: "Alex")
TurnOrderManager.instance.turnOrder = [p1,p2]
print (TurnOrderManager.instance.current)
TurnOrderManager.instance.next()
print (TurnOrderManager.instance.current)
TurnOrderManager.instance.next()
print (TurnOrderManager.instance.current)
// ---------------------------------
// Phase management
enum PhaseType: Int {
case buying = 1
case selling
}
struct Phase {
var id: PhaseType
var title: String
var completed: Bool = false {
didSet {
// Notify subscribers of completion
guard completed else { return }
handlers.forEach { $0(self) }
}
}
var description:String {
return "Phase: \(self.title), completed: \(completed)"
}
// Task queue
var handlers = [(Phase) -> Void]()
init(id: PhaseType, title: String, initialSubscription: @escaping (Phase) -> Void =
{_ in})
{
self.id = id
self.title = title
subscribe(completion: initialSubscription)
}
mutating func subscribe(completion: @escaping (Phase) -> Void) {
handlers.append(completion)
}
}
class MyParentController {
lazy var phase1: Phase = {
return Phase(id: .buying, title: "Phase #1") {
print("Do something with phase: \($0.title)")
}
}()
}
let controller = MyParentController()
controller.phase1.completed = true
问题:
我要通知:
- 转弯完成
- 所有回合都已完成(以便可以进入下一阶段)
如何让我的 TurnOrderManager 提醒 PhaseManager 当前转弯已完成。
我如何让我的 PhaseManager 知道所有回合都完成后才能进入下一阶段。
对于我的查询过于冗长,我深表歉意。
非常感谢
【问题讨论】:
标签: swift observer-pattern subscriber