2017-05-08 15 views
0

나는 턴 순서에 의존하는 지역 게임을하고있다.스위프트 - 순서 관리를 어떻게 관리 할 수 ​​있습니까?

규칙;

  • 게임에서 phases가 있습니다 : 각 phase 동안
  • (즉, 주문 판매), 플레이어는 다시 (모든 선수까지
  • phase이 완료된 것으로 간주되지 않는 하나의 회전을한다 주문)이 완료되었습니다.

이 데이터를 관리하는 방법이 확실하지 않습니다. 추적해야 할 여러 가지가 있습니다.

  1. 모든 플레이어가 턴 순서의 끝에 도달 할 때 그래서 우리는 다음 단계로 이동할 수 있습니다 자신의 턴
  2. 을 완료하면 우리가 차례
  3. 현재 플레이어에있는 단계입니다. 모든 단계가 내가 구독 모델이에 가장 좋은 방법이라고 생각하고

완료되면 모든 재설정

  • 은 완성을 설정,하지만 난 그런 패턴에 익숙하지 않아요.

    현재 위상 자체가 완전하거나 불완전한 것으로 표시 될 수있는 유사한 시스템을 사용하고 있습니다.

    이것은 스위프트 놀이터에서 현재 턴 순서와 단계를 처리하고있는 방식입니다.

    // 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에 알리는 방법.

    내 검색어에 대한 자세한 내용을 사과드립니다.

    많은 감사

  • 답변

    1

    당신은 위임 관계 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에서 필요할 때마다 함수를 호출 :

    ,321 0

    또한 TurnOrderManager가 위임 메소드를 호출하기 전에 PhaseManager를 위임자로 설정해야합니다.

    +0

    이 말이 더 합리적입니다. 도와 주셔서 감사합니다. 구독 모델을 사용할 수 있다고 생각했습니다. 하지만 실제로 어떻게 작동하는지 이해하지 못합니다. 그러나 대표/프로토콜 방법이 나에게 의미가있는 것처럼 보이므로 확실히 새로운 놀이터 파일에서 시도해보고 처음부터 시작합니다. – zardon

    +0

    문제 없습니다! NSNotifications (구독 모델)은 실제로 많은 객체와 통신해야하거나 시스템 알림 (예 : 키보드 알림)에 가입해야하는 경우에만 사용해야합니다. –