Можно ли вручную обходить вложенные операторы if? - PullRequest
0 голосов
/ 25 января 2011

Бинарные деревья вводят меня в заблуждение, поэтому я решил попробовать более простой (хотя и значительно более грязный) подход.
Например ...

if (a) {
    do something
    // wait for a button press before checking the next 'if'
    if (aa) {
        do something
    } else if (ab) {
        do something
    }
} else if (b) {
    do something else
}

и так далее.
Как заставить мое приложение ждать нажатия кнопки, прежде чем спрашивать, возвращает ли «aa» значение true? (И так далее, и тому подобное.)

Переключатели кажутся более чистой альтернативой, поэтому, если у кого-то есть ответ на этот метод, я был бы рад попробовать. Это та же проблема, хотя. Я не могу понять, как прогрессировать шаг за шагом, а не все сразу.

Ответы [ 2 ]

1 голос
/ 25 января 2011

Вот другой подход, использующий переменную состояния или управления для представления, чтобы определить, что он должен делать дальше при нажатии кнопки.

// pseudo-code based on your example
-(IBAction) buttonPress1
if (a) {
    do something
    self.setState = stateA;
} else if (b) {
    do something else
    self.setState = stateB;
}

-(IBAction) buttonPress2
 if (self.state == stateA) {
    if (a) {
        do something
    } else if (b) {
        do something
    }
 }

надеюсь, что поможет, если нет, спросите в комментариях.


[EDIT]

ОК, после того, как вы объяснили ссылку DA / ME / ME2, я получил то, что вы ищете.

То, что вы, возможно, захотите сделать, это сохранить ваш диалог в списке, чтобы загрузить в NSDictionary. (читай NSDictionary)

Каждый NSDictionary должен выглядеть следующим образом:

ключ = значение

@ "prompt" = @ "привет, меня зовут Боб" @ "MEAN" = NSDictionary объект для следующего выбора convo для среднего @ "NICE" = NSDictionary объект для следующего выбора convo для nice

const BOOL NICE = YES;
const BOOL MEAN = !NICE;

NSDictionary *convo = //loaded to initial starting point from your plist file

- (IBAction) playerChoseMean:(id)sender
{
    [self sayConvo:convo withChoice:MEAN];
}

- (IBAction) playerChoseNice:(id)sender
{
    [self sayConvo:convo withChoice:NICE];
}

- (void) sayConvo:(NSDictionary)convo withChoice:(BOOL)b
{
  NSLog(@"NPC says: %@", [convo valueForKey:@"prompt"]);
  if(b) {
     convo = (NSDictionary*)[convo valueForKey:@"NICE"];
  } else {
     convo = (NSDictionary*)[convo valueForKey:@"MEAN"];
  }

  if (convo == [NSNull null] || convo == nil) then continue;
  //else continue
}

Вот пример графика NSDictionary, с которого следует начать.

NSDictionary *intro = [NSDictionary dictionaryWithCapacity:3];
NSDictionary *nice = [NSDictionary dictionaryWithCapacity:3];
NSDictionary *nicenice = [NSDictionary dictionaryWithCapacity:3];
NSDictionary *nicegoodbye = [NSDictionary dictionaryWithCapacity:3];
NSDictionary *mean = [NSDictionary dictionaryWithCapacity:3];
NSDictionary *meangoodbye = [NSDictionary dictionaryWithCapacity:3];

[intro addValue:@"hi there!" forKey:prompt];
[intro addValue:nice forKey:@"NICE"];
[intro addValue:mean forKey:@"MEAN"];

[nice addValue:@"that was nice" forKey:prompt];
[nice addValue:nicenice forKey:@"NICE"];
[nice addValue:mean forKey:@"MEAN"];

[nicenice addValue:@"awww" forKey:prompt];
[nicenice addValue:nicegoodbye forKey:@"NICE"];
[nicenice addValue:mean forKey:@"MEAN"];

[nicegoodbye addValue:@"you were super nice, here's a bonus for being so nice" forKey:prompt];
[nicegoodbye addValue:[NSNull null] forKey:@"NICE"];
[nicegoodbye addValue:[NSNull null] forKey:@"MEAN"];

[mean addValue:@"that was mean" forKey:prompt];
[mean addValue:nice forKey:@"NICE"];
[mean addValue:meangoodbye forKey:@"MEAN"];

[meangoodbye addValue:@"you're a jerk!  goodbye!" forKey:prompt];
[meangoodbye addValue:[NSNull null] forKey:@"NICE"];
[meangoodbye addValue:[NSNull null] forKey:@"MEAN"];

Посмотрите на этот превосходный пример на GameDeve.SE

1 голос
/ 25 января 2011

Если текущая функция находится во вторичном потоке, тогда вы можете использовать

CFRunLoopRun () - остановить поток, затем после нажатия кнопки вызвать CFRunLoopStop () для возобновления операции.

Я бы предпочел, чтобы вы делали одну и ту же реализацию по-разному: Тормозить поток на 2 части

в первой части ---

if (a) {
    do something

    }
} else if (b) {
    do something else
}

во второй части сделать --- сделать это после нажатия кнопки.

   if (aa) {
        do something
    } else if (ab) {
        do something
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...