2013-02-21 4 views
2

iOS 용 BlackJack 게임을 개발 중입니다. 현재 상태를 추적하고 수행해야 할 작업이 어려워지고 있습니다. 더 많은 옵션을 추가로iOS에서 사용자 상호 작용을 기다리는 디자인 패턴?

- (void)hitButtonPress:(id)sender { 
    game->hit(); 
} 

void Game::hit() { 
    dealCard(playerQueue.top()); 
} 

void Game::stand() { 
    playerQueue.pop(); 
    goToNextPlayersTurn(); 
} 

:

class Game { 
    queue<Player> playerQueue; 
    void hit(); 
    void stand(); 
} 

은 현재 내가 이벤트 (방법 A)를 사용하여 구현하고있어 예를 들어, 나는 현재 게임의 추적하는 C++ 클래스가 게임에, 각각을위한 사건을 창조하는 것은 지루하고 어려워지고있다.

나는 그것을 구현하는 생각을 또 다른 방법은 매우처럼 (방법 B) :

void Game::playersTurn(Player *player) { 
    dealCards(player); 
    while (true) { 
    string choice = waitForUserChoice(); 
    if (choice == "stand") break; 
    if (choice == "hit") 
     dealCard(player); 
    // etc. 
    } 
    playerQueue.pop(); 
    goToNextPlayersTurn(); 
} 

waitForUserChoice는 사용자가 UIViewController와 상호 작용 할 수있는 특수 기능입니다 사용자는 다음 버튼을 누르면 한 번 컨트롤을 playersTurn 함수로 반환합니다. 즉, 사용자가 버튼을 클릭 할 때까지 프로그램을 일시 중지합니다.

방법 A를 사용하면 사용자 상호 작용이 필요할 때마다 기능을 분리해야합니다. 방법 B는 모든 것을 제어 할 수있게합니다.

A : : 방법 A와 B 사이의 본질적으로 차이는 다음과

function A() { 
    initialize(); 
    // now wait for user interaction by waiting for a call to CompleteA 
} 

function CompleteA() { 
    finalize(); 
} 

B :

function B() { 
    initialize(); 
    waitForUserInteraction(); 
    finalize(); 
} 

공지 사항 B는 코드가 더 조직 유지하는 방법. Objective-C로이 작업을 수행 할 수있는 방법이 있습니까? 아니면 제가 언급하지 않은 다른 방법이 있습니까?

내가 생각할 수있는 세 번째 옵션은 유한 상태 시스템을 사용하는 것입니다. 나는 그들에 대해 조금은 들었지만, 그것이이 경우 나를 도울 것인지 확신 할 수있다.

문제점에 대해 권장되는 설계 패턴은 무엇입니까?

+0

일반적으로 사용자가 입력을 알리는 이벤트를 구독합니다. 게임을 코딩 할 때 일반적으로 사용자가 입력 한 내용을 확인하고 반복 할 수있는 루프가 있습니다. 이 경우 일반적으로 Cocos2D와 업데이트 기능을 살펴보고 싶습니다. – Daniel

+0

블록을 사용하면이 문제를 쉽게 해결할 수 있습니다. – holex

답변

1

내가 처해있는 딜레마를 이해합니다. 처음 iOS를 시작했을 때 운영 체제와의 제어권을 포기하는 데 어려움을 겪었습니다.

일반적으로 iOS에서는 메서드 A를 사용하는 것이 좋습니다. 일반적으로 메서드 A()에서 설정된 ViewController에 변수가 있고 CompleteA()에서 A()가 처음 실행되었는지 확인하는 등의 변수가 있습니다.

Finite State Machines에 관한 질문은 귀하의 문제를 해결하는 데 도움이 될 것이라고 생각합니다.

https://github.com/esromneb/ios-finite-state-machine

일반적인 생각이다 : 나는 아이폰 OS에 쓴 첫 번째 것은 당신이 FlipsideViewController.m의 하단 (여기 좀 걸릴 수 있습니다 그러나 FSM (이것은 아주 나쁜 코드가 거기에 대한)이었다 이것을 @interface 블록 안에있는 .h 파일에 넣으시오.

static int state = 0; 
static int running = 0; 

그리고.globalCommand 사용자의 입력을 나타내는 int이다 (GitHub의 하나의 변형) 본 실시 예에서는

- (void) tick { 

    switch (state) { 
     case 0: 
      //this case only runs once for the fsm, so setup one time initializations 

      // next state 
      state = 1; 

      break; 
     case 1: 
      navBarStatus.topItem.title = @"Connecting..."; 
      state = 2; 
      break; 
     case 2: 
      // if something happend we move on, if not we wait in the connecting stage 
      if(something) 
       state = 3; 
      else 
       state = 1; 
      break; 
     case 3: 
      // respond to something 

      // next state 
      state = 4; 
      break; 
     case 4: 
      // wait for user interaction 
      navBarStatus.topItem.title = @"Press a button!"; 
      state = 4; 

      globalCommand = userInput; 

      // if user did something 
      if(globalCommand != 0) 
      { 
       // go to state to consume user interaction 
       state = 5; 
      } 

      break; 

     case 5: 
      if(globalCommand == 6) 
      { 
       // respond to command #6 
      } 
      if(globalCommand == 7) 
      { 
       // respond to command #7 
       } 

         // go back and wait for user input 
         state = 4; 
      break; 

     default: 
      state = 0; 
      break; 
    } 

    if(running) 
    { 
     [self performSelector:@selector(tick) withObject:nil afterDelay:0.1]; 
    } 
} 

: M이있다. globalCommand가 0이면 FSM은 globalCommand가 0이 아닐 때까지 상태 4에서 시작합니다.

FSM을 시작하려면 단순히 running을 1로 설정하고 viewController에서 [self tick]을 호출하면됩니다. FSM은 실행이 0으로 설정 될 때까지 0.1 초마다 "틱"합니다.

원래의 FSM 디자인에서는 자체 소프트웨어를 실행하는 Windows 컴퓨터에서 사용자 입력 및 네트워크 입력에 응답해야했습니다. 내 디자인에서는 윈도우 PC도 비슷하지만 다른 FSM을 실행하고있었습니다. 이 설계에서는 NSMutuableArray를 사용하여 두 개의 FIFO 대기열 객체를 작성했습니다. 사용자 상호 작용 및 네트워크 패킷은 FSM이 항목을 대기열에서 제외하고 응답하는 동안 대기열에 명령을 대기열에 넣습니다. 큐에 https://github.com/esromneb/ios-queue-object을 사용하여 종료되었습니다.

설명이 필요하면 의견을 말하십시오.

+0

이것이 완전히 끔찍한 생각인지 지금 아는 사람 있습니까? 누구도 회신 할만큼 충분히 관심이있는이 게시물을 읽지 않을 것입니다. – portforwardpodcast