如何在游戏中设置对话逻辑?

时间:2014-02-09 17:11:46

标签: ios objective-c algorithm logic artificial-intelligence

我正在制作一个游戏,其中一部分玩家必须参与对话。游戏向玩家询问question并让3 options回答。当玩家回答时,根据玩家之前的回答,会弹出一个新问题。这意味着,现在有3个潜在的问题。这些问题中的每一个都带来了3个新答案,因此现在有9个潜在answers。并且每个答案都会再次提出问题,因此现在有9 questions27潜在answers等等等等......

我不要求解决方案,但是如何设置它的想法将非常感激。我只是不知道如何正确组织它。开发人员通常如何在他们的游戏中做到这一点?

谢谢!

修改

感谢 Duncan C 的想法。我为解决这个问题所做的只是一个带有字典的plist,里面包含很多小字典。每个小字典 - 一个可能答案和唯一ID的问题。我举了一个模型的例子:

<key>q1</key>
<dict>

<key>question</key>
<string>Do you want to go left, right or straight?</string>

<key>a1</key>
<string>Left.</string>

<key>a2</key>
<string>Right.</string>

<key>a3</key>
<string>Straight.</string>

<key>a1key</key>
<string>q2.0</string>

<key>a2key</key>
<string>q2.1</string>

<key>a3key</key>
<string>q2.2</string>

</dict>


<key>q2.0</key>
<dict>

<key>question</key>
<string>You went left and found the key.</string>

<key>a1</key>
<string>Take the key.</string>

<key>a2</key>
<string>Go forward.</string>

<key>a3</key>
<string>Go back.</string>

<key>a1key</key>
<string>q2.01</string>

<key>a2key</key>
<string>q2.02</string>

<key>a3key</key>
<string>q2.03</string>

</dict>




<key>q2.1</key>
<dict>

<key>question</key>
<string>You went right and met a monster.</string>

<key>a1</key>
<string>Fight it.</string>

<key>a2</key>
<string>Run away.</string>

<key>a3</key>
<string>Hide from it.</string>

<key>a1key</key>
<string>q2.11</string>

<key>a2key</key>
<string>q2.12</string>

<key>a3key</key>
<string>q2.13</string>

</dict>


<key>q2.2</key>
<dict>

<key>question</key>
<string>You went straight and found a castle!</string>

<key>a1</key>
<string>Enter it.</string>

<key>a2</key>
<string>Continue going straight without visiting the castle.</string>

<key>a3</key>
<string>Go back.</string>

<key>a1key</key>
<string>q2.21</string>

<key>a2key</key>
<string>q2.22</string>

<key>a3key</key>
<string>q2.23</string>

</dict>

依此类推。因此,每次玩家选择其中一个选项时,都会出现下一个链接词典。我认为它的效果非常好,并且可以使用相同的问题在彼此之间进行链接,因此没有必要重写相同的内容。

2 个答案:

答案 0 :(得分:2)

我建议使用plist而不是XML。 Plists更容易创建,更易于阅读。

在任何一种情况下,将您的问题和答案都放到外部文件中会使您的程序变得灵活,而不需要太多努力。然后,如果您稍后决定要提出50个问题,则只需将记录添加到您的文件中即可。

我会建议一系列字典。您可以像这样创建它:

#define K_QUESTION_KEY @"question"
#define K_ANSWERS_KEY @"answers"
#define K_CORRECT_ANSWER_INDEX @"answerIndex"


NSArray *questions = @[
  @{K_QUESTION_KEY: @"What is your quest",
    K_ANSWERS_KEY: @[@"I seek truth and enlightenment", 
                     @"I seek to escape from reality",
                     @"I seek the Holy Grail"];
   K_CORRECT_ANSWER_INDEX: @(2)
   },
  @{K_QUESTION_KEY: @"What is your favorite color",
    K_ANSWERS_KEY: @[@"Blue", 
                     @"Red",
                     @"Blue - no, green!"];
   K_CORRECT_ANSWER_INDEX: @(1)
   },
  @{K_QUESTION_KEY: @"What is the airspeed velocity of an unladen swallow",
    K_ANSWERS_KEY: @[@"42", 
                     @"I don't know",
                     @"A European or African swallow?"];
   K_CORRECT_ANSWER_INDEX: @(2)
   }

];

然后使用

将其写入磁盘
[questions writeToFile: file_path atomically: YES];

然后你会使用类似的语法来读取文件并遍历它。

答案 1 :(得分:1)

我没试过,但这是我的建议:

<qa>
<question_1 question="what is your name ?">
<option value="mikel"  />
<option value="john"  />
<option value="sosan"  />
</question_1>

<mikel value="what is the biggest thing in the word ?">
<option value="thing1" isTrue="false"/>
<option value="thing2" isTrue="false"/>
<option value="thing3" isTrue="true"/>
</mikel >

....
<!--and for other answers -->

<thing1 value="what is the biggest thing in the word ?">
<option value="thing11" isTrue="false"/>
<option value="thing22" isTrue="false"/>
<option value="thing33" isTrue="true"/>
</thing1>
... so on
</qa>

如果您使用了xml,那么您甚至可以将任何其他文件用于同一个应用程序。其他问题。

希望这对你有所帮助,祝你好运!