C ++使用带有if语句的rand

时间:2013-07-10 05:51:33

标签: c++ if-statement random

我在一天前开始使用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(); 
}

}

5 个答案:

答案 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();既不是函数调用(因为语法无效),也不是实现(因为;)。该行后面的花括号只是在代码中打开一个块。这个块不是必需的(但不是禁止的)。我将代码更改为我认为你想写的内容:

  1. 我在开头添加了一行int game();,用于定义子程序game(),使编译器能够验证调用(在2中)。
  2. 我添加了一行game();,它实际上调用了1中定义的子程序。
  3. 我在;之后删除了int game();,以便对下面的块进行子例程实现。
  4. 我最后删除了}并将其移至main()的末尾。
  5. 我在returnmain例程的末尾添加了game个语句。
  6. 我将=更改为==
  7. 添加了一个循环
  8. 另请注意,system("cls")仅适用于存在此类呼叫的系统。这不是很好的代码,因为它依赖于平台,并且会产生至少一个新进程(可能更多)。在输出流的抽象模型中没有清晰的屏幕,因为输出也可能是文件或打印机(例如,如果您使用输出重定向调用程序)。

    如果你想清除你的屏幕,这是不能用标准输出机制完成的(除了输出一堆换行 - 这不是很好,因为你不知道必须写多少行才能清除屏幕)。如果您想要做得更好,可以使用Win32控制台API或libncurses。这些库将使您能够控制可视终端,而不是标准库为您提供的抽象线输出。虽然标准输出很简单,但这些库不是,所以我建议继续使用cls但是记得稍后当你更熟悉c ++时更改它。

答案 3 :(得分:0)

This page涵盖了使用rand(),srand()等进行随机化的基础知识。对你来说可能值得一提:

此外,您应该在==比较中使用比较运算符(=),而不是赋值运算符(if);使用=实际上将设置和更改该值,并且每次比较都将为真,因为结果将被分配给非零值。由于这个原因,每次你的第一次if比较检查都会成功,所以其他测试都不会执行,每次你都会得到摇滚。

答案 4 :(得分:0)

请注意,为了尽可能接近真正的随机数,您必须使用更改的数字为随机数生成器播种,这可通过以下方式实现:srand(time(0)); 这可以放在实际调用随机数之前的任何地方。

您还需要#include <ctime>才能拨打时间(0)。