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