C ++ 1-100猜测游戏,计算机是一个猜测

时间:2013-11-14 14:56:32

标签: c++

我正在使用C ++编写“原则与实践”一文中的一些问题,我遇到的具体问题如下。用户必须考虑1到100之间的数字,然后计算机将通过一系列猜测找出问题所在。

当前代码除数字1外有效(由于除以2时整数向下舍入)。我似乎无法想办法解决这个问题。

以下是当前的源代码:

#include <iostream>
using namespace std;

const int MAX_VALUE = 100;
const int MIN_VALUE = 1;

int guess;
int high = MAX_VALUE;
int low = MIN_VALUE;

char choice;

int main(){


cout<<"Think about a number between "<<MIN_VALUE<<" and "<<MAX_VALUE<<". \n\n";
guess = ( high-low ) / 2;

while((high-low)!=1){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n";
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        guess -= ( high - low ) / 2;
    }
    else if(choice=='n' || choice=='N') {
        low = guess;
        guess += (high - low ) /2;
    }
    else cout<<"Incorrect choice."<<endl;


}
cout<<"Your number is: "<<high<<".\n";

system("pause");
return 0;
}

3 个答案:

答案 0 :(得分:2)

你选择while((high-low)!=1)作为你的表达方式后你有什么想法?

您的代码基本上是在说 - 当highlow之间的差异为1时,正确的数字必须为high。这就是为什么当有人选择最低值(在这种情况下为1)时它不起作用。

您需要确保将最低值low作为guess呈现给用户。

所以 - 单步执行代码:

让我们使用MIN_VALUE为1的示例,并且玩家选择1作为他们的数字。现在,当high为3而guess为2时,您会经历while循环,因为当被问及所选数字是否小于或等于guess时,玩家会回答“Y” ,high最终为2。

有趣的是guess保持在2,因为它会减少(high-low)/2。哪个向下舍入为0.这意味着guess将永远不会达到最低值 - 这是一个问题。

继续 - 下次评估while表达式时,它返回false(因为2-1 == 1)。

然后您返回high(目前为2)。

所以我认为你有两个问题。

1)当你发现自己将guess减少0时,玩家对数字的想法low,你应该将guess设为{ {1}}允许将其作为计算机的猜测呈现给用户。

并且2) 当lowhigh之间的差异为1时,您需要找到一种方法来允许输入while循环。这允许在low向玩家展示时guess的可能性它等于low

有人发布了

while(high > low)

我认为没问题。

但是您还需要检查highlow之间的差异何时为1,因为a)您不希望无休止地将guess减少0和b)在这一点上,数字的想法必须<{1>}。

所以:

low

答案 1 :(得分:0)

你试过了吗?

while(high>low){
...
}

答案 2 :(得分:0)

此程序存在三个缺陷,但仅解决了一个缺陷,该缺陷不能单独起作用:

  • 该循环的正确退出条件是while(guess>low)while(high>low)while(guess!=high)都不退出,除非猜测的数字是1和guess=low

  • 最小值必须设置为0,const int MIN_VALUE = 0;,否则您需要对数字1进行8个猜测,但仅允许7个问题。它还可以防止循环在满足数字1的条件之前退出:

  • 达到猜中的数字时,猜测将设置为低,循环退出:

    if(high-low==1) guess=low;
       else guess -= ( high - low ) / 2;

请参阅下面经过更正和测试的代码:

#include <iostream>
using namespace std;

const int MAX_VALUE = 100;
const int MIN_VALUE = 0;

int guess;
int high = MAX_VALUE;
int low = MIN_VALUE;

char choice;

int main(){


cout<<"Think about a number between "<<MIN_VALUE<<" and "<<MAX_VALUE<<". \n\n";
guess = ( high-low ) / 2;

while(guess>low){
    cout<<"Is your number less than or equal to "<<guess<<"? \nEnter y or n. \n\n";
    cin>>choice;

    if(choice=='y' || choice=='Y') {
        high = guess;
        if(high-low==1) guess=low;
        else guess -= ( high - low ) / 2;
    }
    else if(choice=='n' || choice=='N') {
        low = guess;
        guess += (high - low ) /2;
    }
    else cout<<"Incorrect choice."<<endl;


}
cout<<"Your number is: "<<high<<".\n";

return 0;
}