【问题标题】:C++ Using rand with if statementC++ 使用 rand 和 if 语句
【发布时间】:2013-07-10 05:51:33
【问题描述】:

我一天前开始使用 C++,但在尝试创建石头、剪子布游戏时遇到了问题。这段代码并不是完成后的样子,但我这样做是为了演示我的问题。

我已经做了 brps,意思是:bot 石头剪刀布,一个 1-3 的随机数,其中对应的数字会产生一个 cout,说明 bot 选择了什么项目。

代码的 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(); 
}

}

【问题讨论】:

    标签: c++ if-statement random


    【解决方案1】:

    您应该使用 == 进行比较,而不是 =

    如果你写brps = 1,你将值1赋给变量brps,那么赋值表达式的值就是与分配的值相同,即 1。这是非零值,并被转换为 true,所以你总是得到“石头”。

    还要注意,如果您的意图是创建一个名为 game 的函数,那不是您的代码所做的。额外的分号使其成为声明,表示在其他地方有一个名为 game 的函数,然后 { } 块就是这样,一个 { } 块,而不是函数体。

    并且,正如 chris 在他的评论中所说,打开编译器警告。不同的编译器会给出不同的警告,但 g++ 会给出警告suggest parentheses around assignment used as truth value,以便您使用 = 而不是 ==。编译器警告是编译器试图为您提供帮助,而编程非常困难,您不应该拒绝任何帮助。

    【讨论】:

    • 并开启编译器警告。
    • 这解决了它。不敢相信我错过了,我什至读过很多地方什么符号被用来做什么,但显然我错过了那个:)谢谢。
    • 也感谢您提供的信息。你们是最棒的:)
    【解决方案2】:

    您在 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. 我在maingame 例程的末尾添加了return 语句。
    6. 我把=改成了==
    7. 添加了循环

    另请注意,system("cls") 仅适用于存在此类调用的系统。这不是很好的代码,因为它依赖于平台并且会产生至少一个新进程(也许更多)。在输出流的抽象模型中没有清晰的屏幕,因为输出也可能是文件或打印机(例如,如果您使用输出重定向调用程序)。

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

    【讨论】:

    • 感谢您的回答 :) 您介意进一步解释如何调用 game(); ?
    • @Hitesh Vaghani:在这种情况下,需要做更多的工作(请参阅编辑后的答案)
    • 感谢您的编辑。我知道 'system("cls")' 可能不适合其他平台,如果您知道其他解决方案,请随时告诉我:) 我还想问是否有办法让游戏在 ' game()' sub 当一轮完成时。编辑:我想我可以循环它?
    • @Rezic:在示例中添加了一个循环。 some_kind_of_exit_condition 当然必须用真实的条件替换。
    【解决方案3】:

    您应该只在程序开始时调用一次srand()。不要在每次需要随机数时调用它,因为这会有效地重新初始化生成器。

    代码还有其他问题:

    1) if (brps = 1) 等人是任务,而不是比较。

    2) 该

    int game();
    {
    

    看起来它定义了一个嵌套函数,但事实并非如此。这里game() 是一个原型,花括号内的东西只是main() 内的一个嵌套块。我怀疑这不是你想要做的。

    【讨论】:

    • 不是只调用一次吗?
    【解决方案4】:

    This page 涵盖了使用 rand()、srand() 等进行随机化的基础知识。可能值得您看一看:

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

    【讨论】:

      【解决方案5】:

      还请注意,要尽可能接近真正的随机数,您必须使用不断变化的数字播种随机数生成器,这是通过以下方式完成的:srand(time(0)); 这可以放置在实际调用随机数之前的任何位置。

      您还必须#include &lt;ctime&gt; 才能调用 time(0)。

      【讨论】:

        猜你喜欢
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        • 2019-04-08
        • 2016-03-02
        • 2016-02-29
        • 2018-02-09
        相关资源
        最近更新 更多