Swift - 如何管理转单管理?
Swift - How to manage turn order management?
我正在开发一款依赖回合顺序的本地游戏。
规则;
- 游戏中有多个
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 { [=12=](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: \([=12=].title)")
}
}()
}
let controller = MyParentController()
controller.phase1.completed = true
问题:
我要通知:
- 转弯完成
- 所有回合都完成(以便可以进入下一阶段)
如何让我的 TurnOrderManager 提醒 PhaseManager 当前回合已完成。
如何让我的 PhaseManager 知道当所有回合都完成后才能进入下一阶段。
对于我的查询冗长,我深表歉意。
非常感谢
您将要定义委托关系 PhaseManager 和您的 TurnOrderManager。
Here 是有关协议的 Apple 文档。
Here 是一篇关于授权的好文章。
首先您需要定义一个协议。像这样:
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
...
在 TurnOrderManager 尝试调用任何委托方法之前,您还必须将 PhaseManager 设置为委托。
我正在开发一款依赖回合顺序的本地游戏。
规则;
- 游戏中有多个
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 { [=12=](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: \([=12=].title)")
}
}()
}
let controller = MyParentController()
controller.phase1.completed = true
问题:
我要通知:
- 转弯完成
- 所有回合都完成(以便可以进入下一阶段)
如何让我的 TurnOrderManager 提醒 PhaseManager 当前回合已完成。
如何让我的 PhaseManager 知道当所有回合都完成后才能进入下一阶段。
对于我的查询冗长,我深表歉意。
非常感谢
您将要定义委托关系 PhaseManager 和您的 TurnOrderManager。
Here 是有关协议的 Apple 文档。
Here 是一篇关于授权的好文章。
首先您需要定义一个协议。像这样:
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
...
在 TurnOrderManager 尝试调用任何委托方法之前,您还必须将 PhaseManager 设置为委托。