Я разрабатываю игру BlackJack для iOS. Отслеживание текущего состояния и того, что необходимо сделать, становится сложным. Например, у меня есть класс C++, который отслеживает текущую игру:Дизайн шаблона для ожидания взаимодействия с пользователем в iOS?
class Game {
queue<Player> playerQueue;
void hit();
void stand();
}
В настоящее время я его реализации с помощью событий (метод А):
- (void)hitButtonPress:(id)sender {
game->hit();
}
void Game::hit() {
dealCard(playerQueue.top());
}
void Game::stand() {
playerQueue.pop();
goToNextPlayersTurn();
}
по мере добавления все больше и больше опций к игре, создание событий для каждого из них становится утомительным и трудно отслеживать.
Другой способ, которым я думал о его реализации, как так (метод В):
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:
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? Или есть другой метод, который я не упомянул ранее?
Третий вариант, о котором я могу думать, это использование конечного автомата. Я слышал о них немного, но я уверен, что это поможет мне в этом случае или нет.
Какова рекомендуемая модель дизайна для моей проблемы?
Обычно вы подписываетесь на события, которые сообщают вам, когда пользователь внес какой-либо ввод. При кодировании игр у вас обычно есть цикл, в котором вы проходите, также проверяя ввод пользователя. В этом случае вы обычно хотите взглянуть на Cocos2D и функцию обновления. – Daniel
блоки могут помочь вам решить это легко. – holex