C ++随机数猜谜游戏

时间:2013-10-29 02:14:27

标签: c++

我必须编写一个可以运行随机猜谜游戏的程序。游戏是1-100的数字,猜测者有20次尝试,最后应该被问到他们是否想再玩一次。如果猜测者是高或低,还必须有多种打印输出选项。我已经完成了部分程序我知道我仍然需要为打印输出添加其他选项但是现在我的问题是,当我尝试运行我所拥有的它说成功但是然后有一个错误,表示变量“数字“正在使用而未初始化。我不知道该怎么办才能明确初始化它。 (我是C ++的新手) 我已更新了我的计划,现在遇到了另一个问题。我的程序运行,但如果猜测低于它打印的数字太高尝试再次尝试再次尝试但是当数字太高时它只打印太高再试一次。我还注意到,当用户选择再次播放时,尝试计数器不会随游戏重置。最后一件事我必须添加更多的消息,当他们赢,输,并被要求玩另一个游戏,我必须使用随机数来选择他们。因此,关于做到这一点的最佳途径的任何建议都会很棒

#include <iostream>
#include <iomanip> 
#include <ctime>
using namespace std;
char chr;

int main()
{
srand(time(NULL));                                           //the function that generates random numbers
int number=rand()%100+1;                                     //the range of the random numbers
int guess;                                                   //The guess is stored here
int tries=0;                                                 //The number of tries stored here
   char answer;                                                 //The answer to the question is stored here
answer='y';                  

while(answer=='y'||answer=='Y') 
{
    while (tries<=20 && answer=='y'|| answer=='Y')
    {
    cout<<"Enter a number between 1 and 100 "<<endl;          //The user is asked for a guess
    cin>>guess;                                               //The guess is stored here
    tries++;                                                 //Adding a number for every try
    if(guess==0||guess>100)                                  //If statement that produces an error message if user enters a number out of the peramiters
    {
     cout<<"This is not an option try again"<<endl;          //Error message
    }

    if(tries<20)                                            
    cout<<"Tries left: "<<(20-tries)<<endl;                   //Output to let the user know how many guess they have left

    if(number<guess);                                         //if the guess is to high
    cout<<"Too high try again"<<endl;                         //This message prints if guess it to high

    if(number>guess)                                          //if the guess is to low
    cout<<"Too low try again"<<endl;                          //This message prints if the guess is to low

    if(number==guess)                                          //If the user guesses the number
    {
     cout<<"Congratualtions!! "<<endl;                          //Message printed out if the user guesses correctly
     cout<<"You got the right number in "<<tries<<" tries"<<endl;  //Lets the user know how many guess they used
     answer = 'n';
    }
    if(tries >= 20)                                               //If the user uses all their guesses
    {
    cout << "You've run out of tries!"<<endl;                      //The message that prints when a user is out of guesses
    answer='n';
    }
    if(answer=='n')
    {
     cout<<"Would you like to play again?  Enter Y/N"<<endl;       //asking if play would like to play again
     cin>>answer;                                                  //Store users answer
     if (answer=='N'|| answer=='n')                                //if the user says no
     cout<<"Thanks for playing!"<<endl;                            //This message prints out if they choose not to play again

    else
        number=rand()%100+1;                                        //This starts the game over if they choose to play again
    }

    }
    }

cin>>chr;
    return 0;

}

5 个答案:

答案 0 :(得分:8)

[编辑:添加演员以摆脱编译器警告。]

正如Jim Rhodes在评论中所说,问题在于

srand(number>0);

srand()用于初始化随机数生成器,因此使用number>0或甚至number调用它是没有意义的。它需要一个“种子”值,每次运行程序时都应该有所不同。获得这样种子的常用方法是使用系统时间:

srand(static_cast<unsigned int>(time(NULL)));

您可能需要#include其他标头才能访问time()

答案 1 :(得分:3)

编译器警告你的问题是这两行:

int number;
//...
srand(number>0);

在这里,你没有给变量number一个初始值,所以它是未初始化 - 你绝对无法知道此时的值是什么。事实上,每次运行程序时都可能会发生变化。接下来你要问的是神秘值是否大于零 - 它可能是,它可能不是,但你只是不知道。这是神秘的行为,这是编译器警告你的。

当然,你正在试图初始化随机种子,所以拥有这种神秘行为可能就是你所追求的!但不幸的是,即使这样也不会起作用。

在C ++中,表达式number>0是布尔值,即表达式的结果是truefalse。但srand()函数采用unsigned int作为参数,因此编译器必须将bool转换为unsigned,并通过更改false来实现到0true1(可能:我认为这在技术上取决于实施)。所以无论number的初始值是什么,你的随机种子只会有两个可能的值之一 - 根本不是随机的!

最好是使用基于某种(相对)不可预测的随机种子。非加密需要基于当前时间初始化种子是很常见的。类似的东西:

#include <ctime>

std::time_t now = std::time(0);
srand(static_cast<unsigned>(now));

没关系。

答案 2 :(得分:2)

我看到的一个问题是,您为每个用户猜测选择一个新的随机数。这是错的。

要解决这个问题,你应该把

number=rand()%100+1;

在do while循环之前行循环请求猜测。

第二个问题是该循环的条件不正确。你应该循环直到数字==猜不是数字&gt;猜测并将两个couts告诉用户,如果猜测在循环内是高还是低,并在循环内增加你的尝试。

此外,你可能想要一个外部do while()循环来询问你再次播放的问题,而不是在循环之后等待用户获得正确的数字。

答案 3 :(得分:1)

在使用它们之前初始化你的变量(总是!!),否则你要在任何操作中调用未定义的行为(甚至是coppiler错误)!

int number = 0;
int guess = 0;
int tries = 0;
char answer = '\0';

注意(对于downvoters,怀疑评论者):
当然,这个答案并不能说明如何使srand(number>0);语句适合所需的结果(即使用比number更合适的值初始化0,但它解决了编译问题首先要求时间错误,对于任何其他方案都是好建议,导致类似的编译器错误(警告)。使用适当的值初始化number以传递给srand()种子方法以在运行时获得正确的结果,这是一个完全不同的问题,应该这样问。

答案 4 :(得分:0)

我是否可以建议使用gettimeofday函数作为向随机函数提供种子的方法?

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
//clock_t times(struct tms *buffer);
int
main(int argc, char **argv)
{
    int a;
    struct timeval _wall;
    gettimeofday( &_wall, NULL ); //(_wall.tv_sec,_wall.tv_usec);
    srand(_wall.tv_usec);
    a = rand() % 100 + 1;
    printf("%d\n",a);
    return 0;
}