当我打电话给我的功能时什么都没发生?

时间:2016-10-22 16:40:19

标签: c++ function

我正在尝试使用两个char参数制作摇滚,纸张,剪刀游戏的功能,其中第一个参数代表用户选择的摇滚,纸张或剪刀。第二个参数代表游戏的结果,胜利,失败或平局。但是,当我试图调用该函数时,没有任何事情发生。我迷失在接下来我需要做什么。非常感谢所有帮助!

x -.^:2 y

1 个答案:

答案 0 :(得分:6)

一般性评论

using namespace std;

Avoid using namespace std

return main();

You are not allowed to call main in your code.这将导致未定义的行为。另外,你的目的是什么?

rand()
应该避免

rand()。这是一个有趣的video,为什么你不应该使用它,而是使用C ++ 11 random

y = choice2;

您按值传递y,这意味着分配它不会从外部修改y。这样做时你应该pass y by reference(即声明中的char& y)。

为什么功能没有做任何事情?

......实际上,确实如此!

user2 == '2'

你的比较被打破了。 '2'实际上不是2,而是50。原因是'2'是一个字符,因此您实际上正在阅读相关的字符代码。

这意味着您playRPS中的所有条件均为假,因此该函数唯一可以调用main()return main();)。

如何缩短代码?

您的测试用例非常冗余且繁重。您可以将其更改为大幅缩减代码大小。

让我们打印播放器选择的选项......

if (x == 'r' || x == 'R')
    cout << "You chose ROCK!" << endl;
else if (x == 'p' || x == 'P')
    cout << "You chose PAPER!" << endl;
else if (x == 's' || x == 'S')
    cout << "You chose SCISSORS!" << endl;

一切都好!让我们用计算机的选择做同样的事情!

if (user2 == 1)
    cout << "The computer chose... ROCK!" << endl;
else if (user2 == 2)
    cout << "The computer chose... PAPER!" << endl;
else if (user2 == 3)
    cout << "The computer chose... SCISSORS!" << endl;

然后,您应该比较玩家选择的内容与计算机选择的内容,并告诉谁是赢家。不幸的是,我们无法将xuser2进行比较,而无需再做很多情况......

如果我们决定以与x相同的方式保存user2选项会怎样?我们也可以使用tolower来避免检查字母的大写字母。

int user1 = 0;
x = tolower(x); // we force x to lower case
if (x == 'r')
    user1 = 1;
else if (x == 'p')
    user1 = 2;
else if (x == 's')
    user1 = 3;

好!现在,我们还可以改善第一个if / else if块中的条件:

if (user1 == 1)
    cout << "You chose ROCK!" << endl;
else if (user1 == 2)
    cout << "You chose PAPER!" << endl;
else if (user1 == 3)
    cout << "You chose SCISSORS!" << endl;

这意味着我们也可以将user1user2进行比较,以便我们知道谁赢了。

if (user1 == user2) {
    cout << "It's a TIE!" << endl;
}
else if ((user1 == 1 && user2 == 2) ||
         (user1 == 2 && user2 == 3) ||
         (user1 == 3 && user2 == 1)) {
    cout << "You LOSE!" << endl;
}
else {
    cout << "You WIN!" << endl;
}

但是,使用123并不能说明问题。如果您使用enum来表示这些值,该怎么办?

enum RPSChoice
{
    ROCK = 1,
    PAPER = 2,
    SCISSORS = 3
};

例如,第一个块现在看起来像:

if (user1 == ROCK)
    cout << "You chose ROCK!" << endl;
else if (user1 == PAPER)
    cout << "You chose PAPER!" << endl;
else if (user1 == SCISSORS)
    cout << "You chose SCISSORS!" << endl;

如果我们将新的两个第一个块包装到一个函数中,以避免重复自己怎么办?

void printDecision(string who, int choice) {
    cout << who; // no matter what, we will tell who took a decision
    if (choice == ROCK)
        cout << " chose ROCK!" << endl;
    else if (choice == PAPER)
        cout << " chose PAPER!" << endl;
    else if (choice == SCISSORS)
        cout << " chose SCISSORS!" << endl;
}

通过这种方式,我们可以通过将两个大块替换为简单的短函数调用来使playRPS更加清晰:

printDecision("You", user1);
printDecision("The computer", user2);

让我们做另一个简单的函数来决定谁赢了:

int winner(int user1, int user2) {
    if (user1 == user2) {
        return 0; // tie
    }
    else if ((user1 == ROCK && user2 == PAPER) ||
             (user1 == PAPER && user2 == SCISSORS) ||
             (user1 == SCISSORS && user2 == ROCK)) {
        return 2; // user2 is the winner
    }
    else {
        return 1; // user1 is the winner
    }
}

最后一个返回我们根据给定字符给出的值:

int characterToChoice(char c)
{
    c = tolower(c);
    if (c == 'r')
        return ROCK;
    else if (c == 's')
        return SCISSORS;
    else if (c == 'p')
        return PAPER;
    else
        return 0; // Not a proper choice!
}

完成!这是the final program,其中包含所有改进(无需替换rand()),而here是在线提示,可以尝试使用。

请注意,您可以通过多种方式改进代码,进一步简化代码并使其更加清晰。我最关注的是std::unordered_mapRPSChoice值绑定到string,将char绑定到RPSChoice。在某些情况下,您可能还希望switchif

正如您对问题的评论所述,您可以使用调试器诊断出此问题。 πάνταῥεῖ的评论供参考:

  

解决此类问题的正确工具是您的调试器。在询问Stack Overflow之前,您应该逐行浏览代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)