0

我正在尝试用 C++ 简单地猜我的数字游戏,但计算机需要猜我的数字。但问题是我陷入了这个无限循环。我只是一个初学者,所以它是一个非常基本的程序。

这是我的代码:

int secretNumber = rand() %100 + 1; // random number between 1-100
int tries=0;
int input;

cout <<"typ your number\n";
cin >> input;

do
{
    cout <<secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout <<"To high i guess?\n";
    }
    else if (secretNumber < input)
    {
        cout <<"To low I guess?\n";
    }
    else 
    {
        cout <<"Yes, i got it in " <<tries <<" tries!";
    }
}while (input != secretNumber);

return 0;

}
4

6 回答 6

5

放入cin >> input循环体

于 2012-02-15T14:34:54.847 回答
4

我认为你应该在循环内移动随机数生成。

于 2012-02-15T14:36:55.563 回答
3

变量的值input在循环中永远不会改变,因此终止条件input != secretNumber永远不会满足。

您应该在循环内输入。所以写cin >> input在循环的开头。

编辑:

如果计算机应该猜到,那么仍然input需要在循环中更改 的值,这在您的代码中不存在。input循环每次都以相同的值运行。

为了让您的计算机做出猜测,您应该遵循一些方案。计算机可能会随机抽取数字 - 您可以通过secretNumber = rand()%100 + 1在循环内移动来获得。但是这种方法可能效果不佳,循环可能仍然运行很长时间。这显示在@Kaii 的回答中。

一种更有效的方法是二分搜索。在这种情况下,您应该跟踪计算机所做的猜测。保留两个变量highlow它们应该分别存储高于和低于的猜测值input。每当猜测值高于数字时,将其存储在 中high,并将任何猜测值存储input在 中lowhigh然后计算机应该尝试在和之间进行新的猜测low。随机猜测应该是secretNumber = low + rand() % (high - low)。在最坏的情况下,它将需要多达 100 次迭代。为了获得最佳结果,每个猜测都应该是(high + low) / 2. 根据条件,high和之一low将在每次迭代中更新。这种方法将确保计算机在 7 次猜测中猜出正确的数字。

在您的代码中,它应该是这样的:

int secretNumber = rand() % 100 + 1; // random number between 1-100
int tries=0;
int input;
int low = 1, high = 100;

cout <<"typ your number\n";
cin >> input;

do
{
    secretNumber = (high + low) / 2;
    cout << secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout << "Too high I guess?\n";
        high = secretNumber;
    }

    else if (secretNumber < input)
    {
        cout << "Too low I guess?\n";
        low = secretNumber;
    }

    else 
    {
        cout << "Yes, i got it in " << tries << " tries!";
    }        
} while (input != secretNumber);

return 0;
于 2012-02-15T14:36:13.607 回答
2

计算机只在程序启动时(随机)猜测一次,但每次循环迭代时都应该猜测。您应该在循环内移动随机数生成:

int secretNumber = 0;
int tries=0;
int input;

cout <<"typ your number\n";
cin >> input;

do
{
    /* the fix is here */
    secretNumber = rand() %100 + 1; // random number between 1-100
    cout <<secretNumber <<endl;
    ++tries;

    if (secretNumber > input)
    {
        cout <<"To high i guess?\n";
    }
    else if (secretNumber < input)
    {
        cout <<"To low I guess?\n";
    }
    else 
    {
        cout <<"Yes, i got it in " <<tries <<" tries!";
    }
}while (input != secretNumber);

return 0;
于 2012-02-15T14:41:44.610 回答
0

您必须在循环内进行输入。现在你在开始循环之前提示输入一个值,然后永远不要向用户询问另一个数字。如果无法更改猜测,则循环将永远无法退出。

更改为

do {
    cin >> input;

将解决无限循环。

于 2012-02-15T14:36:28.730 回答
0

代码中的无限循环,因为在您获得真实数字之前,while 的参数始终为真。

您需要添加另一个参数。例如,您希望将最大尝试次数设置为 5 次。那么它会是这样的

do{
    //do your stuff here
}while((input != secretNumber)&&(tries<=5))

当您输入错误的数字5次时,应用程序将完成

于 2012-02-15T14:40:34.313 回答