C ++ Switch语句在中断后执行

时间:2018-04-07 00:23:08

标签: c++ switch-statement break

我正在尝试编写一个C ++程序来评分纸质岩石剪刀游戏 两个用户中的每一个都在P,R或S中输入。 然后该程序宣布获胜者以及确定获胜者的基础:(我必须使用switch语句,不能使用if if,else-else if else语句)

我遇到的问题是我得到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;
}

3 个答案:

答案 0 :(得分:0)

删除所有类似

的代码
}
switch (pl1)
{

除了最后一个。

添加默认子句。

在打印胜利信息而不是中断后添加return语句。

答案 1 :(得分:0)

以下是您的代码版本,可以按预期运行。

#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)块添加一个范围,导致双重攻击。

答案 2 :(得分:0)

基本问题是你在某些switch语句的(预期)主体周围缺少} ... 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',它会打印第一条消息,然后进入{{1}}大小写并打印第二条消息......

最让您感到惊讶的是,即使使用-Wall -Wextra,您也看不到任何关于此的编译器警告 - 这似乎是编译器应警告的内容。