C++ 当我调用我的函数时没有发生什么?

C++ 当我调用我的函数时没有发生什么?,c++,function,C++,Function,我正在尝试为一个石头、布、剪刀游戏创建一个函数,其中有两个char参数,第一个参数代表用户对石头、布或剪刀的选择。第二个参数表示游戏的结果,可以是赢、输或平局。然而,当我试图调用该函数时,什么都没有发生。我不知道下一步该做什么。非常感谢您的帮助 #include <iostream> #include <cstdlib> using namespace std; double playRPS (char a, char b); int main() { c

我正在尝试为一个石头、布、剪刀游戏创建一个函数,其中有两个char参数,第一个参数代表用户对石头、布或剪刀的选择。第二个参数表示游戏的结果,可以是赢、输或平局。然而,当我试图调用该函数时,什么都没有发生。我不知道下一步该做什么。非常感谢您的帮助

#include <iostream>
#include <cstdlib>
using namespace std;

double playRPS (char a, char b);


int main() {

    char letter;
    char result = 0;

    cout << "Welcome to COP3014 ROCK PAPER SCISSORS!\n\n";

    cout << "Please select: " << endl
         << "Rock(r), Paper(p), or Scissors(s)? " << endl
         << "Or enter q to quit --> ";

    cin >> letter;

    if (letter == 'r' || letter == 'R' || letter ==  'p' || letter == 'P'     || letter == 's' || letter == 'S') {

        playRPS(letter, result);
    }
    else {
        cout << "Please enter r, p, or s" << endl;
    }

    return 0;
}

double playRPS (char x, char y) {

    int choice1 = 0, choice2 = 0, choice3 = 0;
    int user2 = rand() % 3 + 1;

    if (( x == 'r' || x == 'R') && (user2 == '2')) {
       cout << "The computer chose... PAPER!";
       cout << "You chose ROCK!";
       cout << "You LOSE!";
       y = choice2;
       return choice2;
    }

    else if ((x == 'r' || x == 'R') && (user2 == '1')) {
        cout << "The computer chose... ROCK!";
        cout << "You chose ROCK!";
        cout << "You TIED!";
        y = choice3;
        return choice3;
    }

    else if ((x == 'r' || x == 'R') && (user2 == '3')) {
        cout << "The computer chose... SCISSORS!";
        cout << "You chose ROCK!";
        cout << "You WIN!";
        y = choice1;
        return choice1;
    }

    else if (( x == 'p' || x == 'P') && (user2 == '2')) {
        cout << "The computer chose... PAPER!";
        cout << "You chose PAPER!";
        cout << "You TIED!";
        y = choice3;
        return choice3;
    }

    else if (( x == 'p' || x == 'P') && (user2 == '1')) {
        cout << "The computer chose... ROCK!";
        cout << "You chose PAPER!";
        cout << "You WIN!";
        y = choice1;
        return choice1;
    }

    else if (( x == 'p' || x == 'P') && (user2 == '3')) {
        cout << "The computer chose... SCISSORS!";
        cout << "You chose PAPER!";
        cout << "You LOSE!";
        y = choice2;
        return choice2;
    }

    else if (( x == 's' || x == 'S') && (user2 == '2')) {
        cout << "The computer chose... PAPER!";
        cout << "You chose SCISSORS!";
        cout << "You WIN!";
        y = choice1;
        return choice1;
    }

    else if (( x == 's' || x == 'S') && (user2 == '1')) {
        cout << "The computer chose... ROCK!";
        cout << "You chose SCISSORS!";
        cout << "You LOSE!";
        y = choice2;
        return choice2;
    }

    else if (( x == 's' || x == 'S') && (user2 == '3')) {
        cout << "The computer chose... SCISSORS!";
        cout << "You chose SCISSORS!";
        cout << "You TIED!";
        y = choice3;
        return choice3;
    }

    else{
        return main();
    }
#包括
#包括
使用名称空间std;
双播放模式(字符a、字符b);
int main(){
字符字母;
字符结果=0;

总论

using namespace std;

这将导致未定义的行为。另外,您的意图是什么

rand()
rand()
应该避免。下面是一个有趣的例子,说明为什么不应该使用它,而应该使用C++11

您正在通过值传递
y
,这意味着分配它不会从外部修改
y
。执行此操作时(即声明中的
char&y

为什么函数什么都不做?

…事实上,是的

user2 == '2'
您的比较被破坏。
'2'
实际上不是
2
,而是
50
。原因是
'2'
是一个字符,因此您实际上正在读取关联的字符代码

这意味着您在
playRPS
中的所有条件都为false,因此函数所做的唯一事情就是调用
main()
(在
返回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
/
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;
但是,使用
1
2
3
并不能使事情变得非常清楚。如果使用一个来表示这些值,会怎么样

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;
让我们做另一个决定谁获胜的简单函数:

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!
}
完成!这是中的所有改进(没有做任何事情来替换中的
rand()
in),并且是一个在线提示来尝试它

请注意,有更多的方法可以改进代码,使其更加简化和清晰。我最显著的想法是将
RPSChoice
值绑定到
字符串,将
char
绑定到
RPSChoice
。在某些情况下,您可能更喜欢
if

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


解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,应逐行检查代码。有关更多帮助,请阅读


一般评论

using namespace std;

这将导致未定义的行为。另外,您的意图是什么

rand()
rand()
应该避免。下面是一个有趣的例子,说明为什么不应该使用它,而应该使用C++11

您正在通过值传递
y
,这意味着分配它不会从外部修改
y
。执行此操作时(即声明中的
char&y

为什么函数什么都不做?

…事实上,是的

user2 == '2'
您的比较被破坏。
'2'
实际上不是
2
,而是
50
。原因是
'2'
是一个字符,因此您实际上正在读取关联的字符代码

这意味着您在
playRPS
中的所有条件都为false,因此函数所做的唯一事情就是调用
main()
(在
返回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
/
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;
但是,使用
1
2
3
并不能使事情变得非常清楚。如果使用一个来表示这些值,会怎么样

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;
让我们做另一个决定谁获胜的简单函数:

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!
}
完成!这是中的所有改进(没有做任何事情来替换中的
rand()
in),并且是一个在线提示来尝试它

请注意,有更多的方法可以改进代码,使其更加简化和清晰。我最显著的想法是将
RPSChoice
值绑定到
字符串,将
char
绑定到
RPSChoice
。在某些情况下,您可能更喜欢
if

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


解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,应逐行检查代码。有关更多帮助,请阅读


解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,应逐行检查代码。有关更多帮助,请阅读。至少应[编辑]您的问题将包括一个重现您的问题的示例,以及您在调试器中所做的观察。
user2==“2”
user2是一个int,您需要
user2==2
在比较之前使用
toupper
tolower
减少比较计数。我建议在其他情况下更换
ladde带有
开关的r
语句;IM