Swift - 如何管理轮次顺序管理?



我正在开发一个依赖于回合顺序的本地游戏。

规则;

  • 游戏中有许多phases(即:买入,卖出)
  • 在每phase,玩家进行一个回合
  • 在每个玩家(依次)完成回合之前,每个phase都不是完成的。

我不确定如何管理这些数据。 有很多事情需要跟踪。

  1. 我们所处的阶段
  2. 轮流当前玩家
  3. 当所有玩家完成回合时
  4. 当达到转弯顺序的终点时,我们可以进入下一阶段。
  5. 当所有阶段完成时,重置所有回合完成

我认为订阅模式是最好的方法,但我不习惯这种模式。

目前,我正在使用与待办事项类似的系统,其中阶段本身可以标记为完成或不完成。

这就是我目前在 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 才会尝试调用任何委托方法。

最新更新