切换语句与 "Choose Your Own Adventure" 中的 If 语句
Switch statement vs. If Statement in "Choose Your Own Adventure"
我该如何解释在"Choose Your Own Adventure"游戏中如何以及何时使用if语句和switch语句?
游戏的基本结构是,如果你输入一个特定的答案,它就会改变游戏的流程或方向。我通常在函数中使用if语句,但这是最有效和最简单的教学方法吗?
谢谢!
哇,非常感谢你提供了这么多很棒的答案!!最后一点:如果你是一个13岁的孩子,在没有任何编程知识的情况下试图理解这个概念,你将如何尝试去理解它?说真的,非常感谢你的帮助!!对于"我收到了这个输入,我现在该做什么",有(大概)五种不同的解决方案。
- If/else If/else…链。优点是,您可以使用任何可以制成
true
或false
的表达式。缺点是,当你有一个很长的链时,它会变得非常混乱。 - Switch -非常适合"有很多几乎相似的事情要做"。缺点是
case
标签必须是整数值(或char
值,但不是字符串,浮点值等)。 - 一个表,使长if/else变成一个更简单的
if(table[index].something) ...
- 函数指针——类似于表指针的变体——存储指向函数的指针,如果你朝那个方向移动,该函数可以做任何你想做的事情。
- 使用虚函数的对象。同样,这是
table
解决方案的一个变体,但不是存储函数指针,而是使用一些成员函数来存储对象,我们可以使用这些成员函数来"做任何你需要做的事情"。
在这种情况下,正确的解决方案可能是后三者之一的组合/变化-至少在我看来。
在您描述的这个场景中,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;
}
在识别数字或序数值时使用switch
语句
switch (number)
{
case 1: DoSomething();
break;
case 2: DoSomethingElse();
break;
}
对于更复杂的条件,如数字范围,使用if
, elseif
和else
。
if (number > 0 && number <= 100)
{
DoSomething();
}
else if (number > 100 && number <= 1000)
{
DoSomethingElse()
}
else
{
NotifyOutOfRange();
}
switch
语句是为了速度。这就是为什么它们只是数字。编译器将尝试为非稀疏(即连续)的值范围创建一个查找表,这可以在代码不断执行时显着提高性能。这是因为它只需要对一个连续的范围进行1次比较,就可以确定执行哪段代码。
switch
语句可能会导致难以发现的bug,因为在每个case
的末尾,您需要指定一个break
,否则执行将会掉到下一个case
。
if
/else if
/else
语句用于更一般的用途。如果对相同的值进行多次比较,则它们通常比等效的switch
语句慢。但是,如果if
语句链没有执行很多,并且该链不是那么长,则性能改进可以忽略不计。
对于更一般的用法,if
是可行的。在CYOAG中,你不需要速度。游戏中最慢的部分是用户。
向一个13岁的孩子解释:
如果你认为你将在单个对象上执行比较整数(整数值)值一次超过1,000,000次或更多,并且您需要如果要尽快完成,请使用
switch
语句。否则,没关系。只是在使用switch
时要小心,因为如果你在每个case
的末尾没有break
,你会抓耳挠腮试着弄清楚刚刚发生了什么?当执行两个或多个case
时。
如果有太多"else if"语句,可以使用switch语句:)
更严重的是,如果玩家有许多不同的选择(游戏邦注:比如从26个不同的选项中进行选择),那么切换便是最佳选择。
嗯,你不能把字符串放到switch
/case
中。剩下的就是if
了。或者您需要实现解析器,读取字符串,将它们映射到某些enum
类型,然后在switch
/case
中使用所述enum
。
然而,一个更好的(更可扩展的)方法是使用map of函数回调。
像这样:
#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绑定,使其更具可扩展性。
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- "类模板示例<int>;"语句对 C++11 是什么意思?
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- c++:定义if语句中的模板
- 切换语句与 "Choose Your Own Adventure" 中的 If 语句