我正在开发一个依赖于回合顺序的本地游戏。
规则;
- 游戏中有许多
phases
(即:买入,卖出) - 在每
phase
,玩家进行一个回合 - 在每个玩家(依次)完成回合之前,每个
phase
都不是完成的。
我不确定如何管理这些数据。 有很多事情需要跟踪。
- 我们所处的阶段
- 轮流当前玩家
- 当所有玩家完成回合时
- 当达到转弯顺序的终点时,我们可以进入下一阶段。
- 当所有阶段完成时,重置所有回合完成
我认为订阅模式是最好的方法,但我不习惯这种模式。
目前,我正在使用与待办事项类似的系统,其中阶段本身可以标记为完成或不完成。
这就是我目前在 Swift 操场中处理轮次顺序和阶段的方式。
// 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和TurnOrderManager。
这是关于协议的苹果文档。
这是一篇关于授权的好文章。
首先,您需要定义一个协议。像这样:
protocol TurnManagerDelegate {
func complete(turn: objectType)
func allTurnsComplete()
}
接下来,您必须使 PhaseManager 符合协议:
class PhaseManager: TurnManagerDelegate {
...
func complete(turn: objectType) {
// implement
}
func allTurnsComplete() {
// implement
}
...
}
最后,您必须使用委托在 TurnOrderManager 上添加一个属性:
class TurnOrderManager {
...
var delegate: TurnManagerDelegate
...
}
并在 TurnOrderManager 中在需要时调用这些函数:
...
delegate?.allTurnsComplete() //example
...
您还必须将 PhaseManager 设置为委托,然后 TurnOrderManager 才会尝试调用任何委托方法。