数字猜谜游戏与不合逻辑的bug

时间:2014-03-20 02:58:34

标签: c++

#include <iostream>
#include <cstdlib>
#include <windows.h>

using namespace std;
srand(time(NULL)); 

int main(){
    int botguess;
    int playerinput;
    int mi=1, ma=100;
    int turns = 0;
    cout<<" what do you want guessed:";

    cin>> playerinput;
    cout<< "time for me to start guessing\n";

    for(int i = 0;i < 50;i++) {
        botguess = rand() % ma + mi;

        if(playerinput > botguess){  //<--the problem 
            mi = botguess;
        }

        if(playerinput < botguess) {
            ma = botguess;
        }

        cout<<"Max:"<<ma<<"\n"<<botguess<<"\n";
        Sleep(1000);
        if(botguess == playerinput)
        {
            cout<<"you win";
        }
    }

    cin.get();
    return 0;
}

所以我一直在撕扯我的头发,为什么逻辑上这不起作用。这是一个程序,应该快速猜测球员号码,但不是立即。该程序的外观不像它看起来那样。

我注意到的行导致了一个错误,其中可能的最大数量被忽略。我得到的数字是100+但不到200,我不知道为什么。当我删除有关嵌套在for循环语句中的mi变量的行时。该计划不会超过100,但我没有得到解决玩家编号的程序的另一端。

另外,如果你弄明白,请告诉我,我不仅仅想要答案。

2 个答案:

答案 0 :(得分:2)

botguess = rand() % (ma - mi + 1) + mi

你不希望ma个不同的数字,你想要的更少。请看一个示例:(5..10)包含6个不同的数字:[5, 6, 7, 8, 9, 10];但如果你rand() % 10 + 5,则会从55 + 0)到145 + 9)获得数字。您需要的是rand() % 6 + 5,其中610 - 5 + 1

答案 1 :(得分:1)

你遇到的问题是由于mi设置为botguess,这很容易大于零,然后在下一个周期,如果ma仍然是100(或接近它的任何地方),你将会有时会将大于100的数字设置为botguess。

编辑添加:C ++中的%运算符是mod除法(即给出整数除法的余数)例如,98%100 + 15将是98 + 15,即113

此链接可以帮助您:

http://www.cplusplus.com/reference/cstdlib/rand/