C++ Switch 语句在中断后执行
C++ Switch statement executes after break
我正在尝试编写一个C++程序来为剪刀布纸游戏评分。
两个用户中的每一个都键入 P、R 或 S。然后程序宣布获胜者以及确定获胜者的依据:(我必须使用 switch 语句,不能使用任何 if、if-else、else if 语句(
遇到的问题是我得到了 2 个输出,因为它在休息后执行。 例如剪刀剪纸。玩家 2 获胜!剪刀剪纸。玩家 1 获胜!
这是我的代码,提前感谢。
#include <iostream>
using namespace std;
int main()
{
char pl1;
char pl2;
cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
cout << "Player 1: ";
cin>>pl1;
cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
cout << "Player 2: ";
cin>>pl2;
switch (pl1)
{
case 'R':
case 'r':
{
switch(pl2)
case 'P':
case 'p':
{
cout << "Paper beats Rock." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
case 'S':
case 's':
{
cout << "Rock smashes Scissors." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
break;
}
break;
}
switch (pl1)
{
case 'P':
case 'p':
{
switch(pl2)
case 'R':
case 'r':
{
cout << "Paper beats Rock." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
case 'S':
case 's':
{
cout << "Scissors cuts Paper." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
break;
}
break;
}
switch (pl1)
{
case 'S':
case 's':
{
switch(pl2)
case 'R':
case 'r':
{
cout << "Rock smashes Scissors." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
case 'P':
case 'p':
{
cout << "Scissors cuts Paper." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
break;
}
break;
}
switch (pl1)
{
case 'R':
case 'r':
case 'P':
case 'p':
case 'S':
case 's':
{
switch(pl2 == pl1)
{
case true:
{
cout<<"Nobody wins"<<endl;
break;
}
}
break;
}
break;
}
return 0;
}
基本问题是你错过了{
......}
某些 switch 语句的(预期(正文周围,导致除第一个情况之外的所有情况都成为封闭 switch 语句的一部分。 例如,您的第一个 coupound 开关:
switch (pl1)
{
case 'R':
case 'r':
{
switch(pl2)
case 'P':
case 'p':
{
cout << "Paper beats Rock." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
case 'S':
case 's':
{
cout << "Rock smashes Scissors." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
break;
}
break;
}
实际上是(添加大括号和固定缩进(:
switch (pl1)
{
case 'R':
case 'r':
{
switch(pl2) {
case 'P':
case 'p':
{
cout << "Paper beats Rock." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
}
case 'S':
case 's':
{
cout << "Rock smashes Scissors." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
break;
}
break;
}
因此,使用输入'r'
和'p'
,它会打印第一条消息,然后落入's'
大小写并打印第二条消息......
最令人惊讶的是,即使使用 -Wall -Wextra,您也没有看到任何编译器警告 - 这绝对是编译器应该警告的事情。
删除所有代码
}
switch (pl1)
{
除了最后一个。
添加默认子句。
在打印胜利信息而不是休息时间后添加返回语句。
下面是按预期工作的代码版本。
#include <iostream>
using namespace std;
int main ()
{
char pl1;
char pl2;
cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
cout << "Player 1: ";
cin >> pl1;
cout << "Enter [R]ock, [P]aper, or [S]cissors" << endl;
cout << "Player 2: ";
cin >> pl2;
switch (pl1)
{
case 'R':
case 'r':
{
switch (pl2)
{
case 'P':
case 'p':
{
cout << "Paper beats Rock." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
case 'S':
case 's':
{
cout << "Rock smashes Scissors." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
}
break;
}
case 'P':
case 'p':
{
switch (pl2)
{
case 'R':
case 'r':
{
cout << "Paper beats Rock." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
case 'S':
case 's':
{
cout << "Scissors cuts Paper." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
}
break;
}
case 'S':
case 's':
{
switch (pl2)
{
case 'R':
case 'r':
{
cout << "Rock smashes Scissors." << endl;
cout << "Player 2 WINS!" << endl;
break;
}
case 'P':
case 'p':
{
cout << "Scissors cuts Paper." << endl;
cout << "Player 1 WINS!" << endl;
break;
}
}
break;
}
}
switch (pl2 == pl1)
{
case true:
cout << "Nobody wins" << endl;
break;
}
}
您犯的主要错误是忘记为内部switch(pl2)
块添加示波器,从而导致双重射击。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- C++,系统无法执行指定的程序
- 使用C++中的模板和运算符重载执行矩阵运算
- 递归期间代码执行中断
- 为什么Visual Studio Release生成在未执行的代码行中断
- 中断代码执行
- 中断正在执行MKL或其他第三方函数的线程
- 在std::for_each的执行过程中累积结果,该异常被中断
- 为什么即使在执行atexit或SetConsoleCtrlhandler的ConsoleHandler时线程也会中断
- cuda 执行块是否可以在执行过程中中断
- 如果执行时间过长,我可以中断功能吗?
- 无法中断执行.此进程当前未执行该类型的代码
- 虽然循环中断,但之后的代码永远不会执行
- 一次执行后,嵌套for循环出现意外/未见的中断:高斯消去
- c++ opencv copyTo()函数执行中断
- c++程序完全执行,但在结束时中断
- 每X秒执行一次代码,但在事件发生时立即中断
- 为什么此中断不终止程序,而是继续执行下一个操作?
- 当代码执行进入Dll或Lib空间时中断
- 执行 int 3 中断是否会停止 Linux 上的整个过程,还是仅停止当前线程