我在一天前开始使用C ++,我一直在尝试创建摇滚,纸张,剪刀游戏。这段代码并不完全是它完成时的样子,但我这样做是为了证明我的问题。
我已经制作了brps,意思是:机器人岩石剪刀,一个1-3的随机数,相应的数字将导致一个cout说明机器人选择了什么项目。
代码的rand部分是通过查看不同的论坛和以前的问题的答案,但我似乎无法解决这个问题。每当我运行该程序时,无论我做什么,它都会说“Bot选择了 the rock ”。但是,如果我删除if状态,只需打印 brps ,它每次都会显示一个随机数。所以我需要帮助来弄清楚为什么程序每次选择摇滚时应该用rand选择的数字来定义。
也可以随意评论代码的其他部分,因为我希望它写得有点糟糕:L
编辑:urps是用户输入答案的地方。我没有在这个例子中使用它。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
cout<<"Hi! Welcome to ROCK PAPER SCISSORS!\n";
cout<<"To play, press enter.\n";
cin.get();
system("cls");
int game();
{
srand(time(NULL));
int brps = rand()>>4, urps;
brps = brps % 3 + 1;
cout<<"Bot chose ";
if (brps = 1){
cout<<"the rock.\n";}
else if (brps = 2){
cout<<"the paper.\n"; }
else if (brps = 3){
cout<<"the scissors.\n"; }
else{
cout<<"invalid.\n.";}
cin.get();
}
}
答案 0 :(得分:4)
您应该使用 == 进行比较,而不是 = 。
如果您编写 brps = 1 ,则将值 1 分配给变量 brps ,然后赋值表达式的值为与分配的值相同,即 1 。这不是零,并且转换为 true ,所以你总是得到“摇滚”。
另请注意,如果您的意图是创建一个名为游戏的功能,那么这不是您的代码所做的。额外的分号使它成为一个声明,说在其他地方有一个名为游戏的函数,然后 {} 块就是那个, {} < / strong>阻止,而不是功能体。
而且,正如克里斯在评论中所说,打开编译器警告。不同的编译器会给出不同的警告,但是g ++会针对您使用 = 而不是 == 提供警告建议用作真值的括号 。编译器警告是编译器试图帮助你,编程很困难,你不应该拒绝任何帮助。
答案 1 :(得分:1)
您应该只在程序开始时拨打srand()
一次。每次需要随机数时都不要调用它,因为这有效地重新初始化了生成器。
代码还有其他问题:
1)if (brps = 1)
等分配,而不是比较。
2)
int game();
{
看起来像是在定义一个嵌套函数,但事实并非如此。这里game()
是原型,花括号内的东西只是main()
内的嵌套块。我怀疑这不是你想要做的。
答案 2 :(得分:1)
您在if语句中使用赋值运算符=
,它将值1分配给brps
并返回true
值。
改为使用运算符==
。
顺便说一下:你没有打电话给你game();
。
编辑:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int game(); // This one declares the subroutine game()
int main()
{
int exit; /* 0 to continue, something else to exit the game */
cout<<"Hi! Welcome to ROCK PAPER SCISSORS!\n";
cout<<"To play, press enter.\n";
cin.get();
system("cls");
do { // This block will execute at least once
exit = game(); // This one calls the subroutine game()
} while (exit == 0); // ...and will execute again and again until exit != 0
return 0; // Or something useful
}
int game() // This implements the subroutine game()
{
srand(time(NULL));
int brps = rand()>>4, urps;
brps = brps % 3 + 1;
cout<<"Bot chose ";
if (brps == 1) {
cout<<"the rock.\n";
} else if (brps == 2) {
cout<<"the paper.\n";
} else if (brps == 3) {
cout<<"the scissors.\n";
} else{
cout<<"invalid.\n.";
}
cin.get();
if (some_kind_of_exit_condition) {
return 1; // results in exit == 1
}
return 0; // results in exit == 0
}
我在代码中更改了内容:
代码中的行int game();
既不是函数调用(因为语法无效),也不是实现(因为;
)。该行后面的花括号只是在代码中打开一个块。这个块不是必需的(但不是禁止的)。我将代码更改为我认为你想写的内容:
int game();
,用于定义子程序game()
,使编译器能够验证调用(在2中)。game();
,它实际上调用了1中定义的子程序。;
之后删除了int game();
,以便对下面的块进行子例程实现。}
并将其移至main()
的末尾。return
和main
例程的末尾添加了game
个语句。=
更改为==
另请注意,system("cls")
仅适用于存在此类呼叫的系统。这不是很好的代码,因为它依赖于平台,并且会产生至少一个新进程(可能更多)。在输出流的抽象模型中没有清晰的屏幕,因为输出也可能是文件或打印机(例如,如果您使用输出重定向调用程序)。
如果你想清除你的屏幕,这是不能用标准输出机制完成的(除了输出一堆换行 - 这不是很好,因为你不知道必须写多少行才能清除屏幕)。如果您想要做得更好,可以使用Win32控制台API或libncurses。这些库将使您能够控制可视终端,而不是标准库为您提供的抽象线输出。虽然标准输出很简单,但这些库不是,所以我建议继续使用cls
但是记得稍后当你更熟悉c ++时更改它。
答案 3 :(得分:0)
This page涵盖了使用rand(),srand()等进行随机化的基础知识。对你来说可能值得一提:
此外,您应该在==
比较中使用比较运算符(=
),而不是赋值运算符(if
);使用=
实际上将设置和更改该值,并且每次比较都将为真,因为结果将被分配给非零值。由于这个原因,每次你的第一次if比较检查都会成功,所以其他测试都不会执行,每次你都会得到摇滚。
答案 4 :(得分:0)
请注意,为了尽可能接近真正的随机数,您必须使用更改的数字为随机数生成器播种,这可通过以下方式实现:srand(time(0));
这可以放在实际调用随机数之前的任何地方。
您还需要#include <ctime>
才能拨打时间(0)。