gpt4 book ai didi

ios - 在 iOS 中等待用户交互的设计模式?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:44:55 24 4
gpt4 key购买 nike

我正在为 iOS 开发 BlackJack 游戏。跟踪当前状态和需要做的事情变得越来越困难。例如,我有一个跟踪当前游戏的 C++ 类:

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

目前我正在使用事件(方法 A)实现它:

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

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

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

随着越来越多的选项被添加到游戏中,为每个选项创建事件变得乏味且难以跟踪。

我想到的另一种实现方式是这样的(方法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 和 B 之间的本质区别如下:

答:

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

function CompleteA() {
finalize();
}

乙:

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

注意 B 如何使代码更有条理。甚至有办法用 Objective-C 做到这一点吗?或者是否有我没有提到的其他推荐方法?

我能想到的第三种选择是使用有限状态机。我听说过一些关于它们的信息,但我确定在这种情况下这是否对我有帮助。

针对我的问题推荐的设计模式是什么?

最佳答案

我理解您遇到的困境。当我第一次使用 iOS 时,我很难集中精力放弃对操作系统的控制权。

通常 iOS 会鼓励您使用方法 A。通常您的 ViewController 中有变量,这些变量是在方法 A() 中设置的,然后在 CompleteA() 中检查它们以验证 A() 是否先运行等。

关于您关于有限状态机的问题,我认为它可以帮助您解决问题。我在 iOS 中写的第一件事是 FSM(这是非常糟糕的代码)但是你可以在这里看看(靠近 FlipsideViewController.m 的底部:

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

一般的想法是将它放在@interface block 内的 .h 文件中

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

在你的 .m 中你有这个:

- (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];
}
}

在这个例子中(从 gi​​thub 上的那个修改而来)globalCommand 是一个代表用户输入的 int。如果 globalCommand 为 0,则 FSM 仅在状态 4 中旋转,直到 globalCommand 不为零。

要启动 FSM,只需将 running 设置为 1 并从 viewController 调用 [self tick]。 FSM 将每 0.1 秒“滴答”一次,直到运行设置为 0。

在我最初的 FSM 设计中,我必须响应用户输入和来自运行其自身软件的 Windows 计算机的网络输入。在我的设计中,Windows PC 也运行类似但不同的 FSM。对于此设计,我使用 NSMutuableArray 构建了两个命令的 FIFO 队列对象。用户交互和网络数据包会将命令排入队列,而 FSM 会将项目出列并对其做出响应。我最终使用了 https://github.com/esromneb/ios-queue-object对于队列。

如果您需要任何说明,请发表评论。

关于ios - 在 iOS 中等待用户交互的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14995611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com