2

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

我制作了 brps,意思是:机器人剪刀石头布,一个 1-3 的随机数,其中相应的数字将导致一个 cout 说明机器人选择的项目。

代码的 rand 部分是通过查看不同的论坛和对以前问题的答案制作的,但我似乎无法解决这个问题。每当我运行程序时,无论我做什么,它都会显示“Bot 选择了岩石”。但是,如果我删除 if statemets,并简单地打印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(); 
}

}
4

5 回答 5

4

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

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

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

而且,正如克里斯在他的评论中所说,打开编译器警告。不同的编译器会给出不同的警告,但 g++ 会给出警告,建议在赋值周围使用括号作为您使用=而不是==的真值。编译器警告是试图帮助您的编译器,而编程非常困难,您不应该拒绝任何帮助。

于 2013-07-10T05:54:44.850 回答
1

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

代码还有其他问题:

1)if (brps = 1)等人是分配,而不是比较。

2) 的

int game();
{

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

于 2013-07-10T05:54:10.723 回答
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. 我在和例程return的末尾添加了语句。maingame
  6. =改为==
  7. 添加了一个循环

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

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

于 2013-07-10T05:56:28.767 回答
0

本页介绍了使用 rand()、srand() 等进行随机化的基础知识。对您来说可能值得一看:

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

于 2013-07-10T05:57:31.970 回答
0

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

您还必须这样#include <ctime>做才能调用 time(0)。

于 2014-09-20T19:25:35.717 回答