在“选择你自己的冒险”中切换语句与If语句

时间:2013-06-13 23:35:44

标签: c++

我如何解释在“选择你自己的冒险”游戏中如何以及何时使用if语句与switch语句?

游戏的基本结构是,如果你输入某个答案,它会改变游戏的流程或方向。我经常使用if语句和函数,但这是最有效和最简单的教学方法吗?

谢谢!

编辑:哇,非常感谢你们这么多很棒的答案!最后一个注意事项:如果你是一个13岁的孩子试图掌握这个概念而没有任何之前的编程知识,你会怎样尝试去理解它?说真的,非常感谢你的帮助!!

6 个答案:

答案 0 :(得分:3)

有(给予或采取)五种不同的解决方案“我收到了这个输入,我现在该怎么做”。

  1. 如果/ else if / else ... chain。优点是您可以使用可以在truefalse中使用的任何表达式。缺点是当你有一个长链时它会变得相当混乱。
  2. 转换 - 非常适合“有很多几乎相似的事情要做”。缺点是case标签必须是整数值(或char值,但不是字符串,浮点值等)。
  3. 一个表格,它将long if / else变为更简单的if(table[index].something) ...
  4. 函数指针 - 表指针变体的类型 - 存储指向函数的指针,该函数执行您在该方向上移动时要执行的操作。
  5. 使用虚拟功能的对象。同样,table解决方案的一个变体,但我们不是存储函数指针,而是存储具有某些成员函数的对象,我们可以使用它来“做你需要做的事情”。
  6. 在这种情况下,正确的解决方案可能是后者3中的一个的组合/变体 - 至少在我看来。

答案 1 :(得分:2)

在识别数字或序数值的情况时使用switch语句。

switch (number)
{
    case 1: DoSomething();
        break;

    case 2: DoSomethingElse();
        break;
}

使用ifelseifelse来处理更复杂的条件,例如数值范围。

if (number > 0 && number <= 100)
{
   DoSomething();
}
else if (number > 100 && number <= 1000)
{
   DoSomethingElse()
}
else
{
   NotifyOutOfRange();
}

答案 2 :(得分:2)

在这种情况下,您已经描述了if语句几乎是您的最佳选择,因为代码需要将用户提供的答案与某些预定义的选项进行比较。

这些选项很可能是字符串。 C ++中的switch语句不能用于字符串。因此,一系列if语句可能会更简单。

当答案只包含数字或单个字符时,可以使用switch语句。

例如,游戏主菜单的代码片段如下所示:

控制台输出:

Please select an action:
1) Start a new game.
2) Go to options screen.
3) Quit game.

代码:

int userChoice = getUserInput();

switch(userChoice){
case START_NEW_GAME: //1
    startGame(); break;
case OPTIONS: //2
    showOptions(); break;
case QUIT: //3
    exit(); break;
}

答案 3 :(得分:1)

switch语句用于提高速度。这就是他们只是数字的原因。编译器将尝试为非稀疏(即连续)值范围创建查找表,这可以在代码持续执行时显着提高性能。这是因为它只需要对连续范围进行1次比较,以确定要执行的代码段。

switch语句可能导致难以发现错误,因为在每个case结束时您需要指定break或执行将落到下一个case }。

if / else if / else语句更常用。它们通常比同等switch语句慢<=>如果相同值进行许多比较。但是,如果if语句链未执行很多且链条不长,则性能提升可以忽略不计。

对于更一般的用法,if是可行的方法。在CYOAG中,您不需要速度。游戏中最慢的部分是用户。

向13岁的人解释:

  

如果您认为您将在单个上执行比较   整数(整数)值一次超过1,000,000次或更多次,您需要   要尽快完成,请使用switch语句。   否则,没关系。使用switch时要小心,因为如果你   在每个break的末尾都没有case,你会抓挠你的头   当两个或多个case被执行时,试图找出刚刚发生的事情?

答案 4 :(得分:0)

如果你有太多“else if”语句,你可以使用switch语句:)

更严重的是,如果一个玩家有很多不同的选择(比如从26个不同的选项(a-z)中选择),那么切换就是最佳选择。

答案 5 :(得分:0)

好吧,你无法真正将字符串放入switch / case。这会让你if。或者您需要实现读取字符串的解析器,将它们映射到某种enum类型,然后在enum / switch中使用所述case

然而,更好(更可扩展)的方法是使用函数回调映射。

这样的事情:

#include <map>
#include <string>
#include <iostream>

typedef void(*ActionCallback)();
typedef std::map<std::string, ActionCallback> ActionMap;
static bool running = true;

void leftAction(){
    std::cout << "\"left\" entered" << std::endl;
}

void rightAction(){
    std::cout << "\"right\" entered" << std::endl;
}

void quitAction(){
    std::cout << "game terminated" << std::endl;
    running = false;
}

int main(int argc, char** argv){
    ActionMap actionMap;
    actionMap["left"] = leftAction;
    actionMap["right"] = leftAction;
    actionMap["quit"] = quitAction;

    while(running){
        std::string command;
        std::cout << "enter command. Enter \"quit\" to close" << std::endl;
        std::cin >> command;

        ActionMap::iterator found = actionMap.find(command);
        if (found == actionMap.end())
            std::cout << "unknown command " << command << std::endl;
        else
            (*found->second)();
    }
    return 0;
}

这种方法的一大优点是您可以在运行时更改命令。添加新命令,删除它们等等。您甚至可以进一步添加lisp / python / lua绑定并使其更具可扩展性。