2012-02-15 3 views
0

Я пытаюсь сделать простую догадки моей номерной игры в C++, но компьютер должен угадать мой номер. Но проблема в том, что я застрял в этом бесконечном цикле. Я просто начинающий, поэтому это действительно базовая программа.застрял в бесконечном do while loop

Это мой код:

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; 

} 
+2

Вы получаете только один номер от пользователя, затем вы сравниваете его снова и снова в своем цикле. Вероятно, вы должны запросить у пользователя число в цикле. –

+0

Компьютер должен угадать ваш номер? .... Может быть, вам нужно угадать номер компьютера? Я в замешательстве, и так жалуются, кажется ... – user1096188

+0

@ user1096188 ну, я уже сделал программу, где мне нужно угадать случайное число компьютеров. теперь я хотел бросить вызов себе и посмотреть, смогу ли я сделать это наоборот, оказалось, что я не могу – Stijn

ответ

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; 
+0

спасибо, что это помогло мне, он олни забирает компьютер надолго, чтобы угадать номер, поэтому я думаю, что смогу изменить диапазон в 1-20 вместо 1-100. спасибо allot dude. – Stijn

+0

вы можете улучшить это, динамически устанавливая нижнюю и верхнюю границы на каждой итерации, после того, как компьютер знает, если он догадался слишком высоко или слишком низко, а затем, наконец, он встретится в середине. Кроме того, вместо угадывания случайных есть статистические подходы, которые значительно улучшают возможности угадывания компьютеров (например: начните с 100, если слишком высокий, попробуйте половину значения в следующий раз .. и т. д.) – Kaii

+0

я отправил вопрос и 5 минут спустя, я так многому научился, и вы несете ответственность за это, я не могу вас поблагодарить достаточно – Stijn

5

место cin >> input в теле цикла

+0

спасибо, что это помогло мне на 90%, теперь проблема заключается в том, что она всегда говорит о том же номере, и нужно угадать, можете ли вы мне помочь? спасибо за то, что вы сделали до сих пор :) – Stijn

+1

компьютер должен угадать, а не пользователь. прочитайте мой ответ – Kaii

3

Значение переменной input никогда не изменяется в цикле, поэтому условие терминатор input != secretNumber никогда не встречались.

Вы должны взять входной сигнал внутри цикла. Поэтому напишите cin >> input в начале цикла.

Edit:

Если компьютер должен угадать, то до сих пор значение input должно быть изменено в цикле, который не присутствует в вашем коде. Цикл работает с тем же значением в input каждый раз.

Чтобы заставить вас сделать предположение, вы должны следовать какой-либо схеме. Компьютер может набирать цифры случайным образом - вы можете пройти через перемещение secretNumber = rand()%100 + 1 внутри цикла. Но этот подход может не работать хорошо, цикл может работать очень долго. Это показано в ответе @ Kaii.

Более эффективный подход - Binary Search. В этом случае вы должны следить за догадками, которые делает компьютер. Сохраняйте две переменные high и low, которые должны хранить догадки выше и ниже input соответственно. Всякий раз, когда угадывайтесь выше номера, храните его в high и сохраняйте любую догадки ниже input в low. Затем компьютер должен попробовать свое новое предположение между high и 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; 
+0

отличный ответ, обратный +1 – Kaii

+0

удивительный человек thakns allot! – Stijn

+0

@ Stijn, чтобы быть справедливым: это самый правильный ответ, который я думаю. Но спасибо за принятие;) – Kaii

0

Вы должны сделать вход в цикле. Прямо сейчас вы запрашиваете значение ПЕРЕД началом цикла, а затем никогда не запрашиваете у пользователя другого номера. Если догадка не может быть изменена, цикл никогда не сможет выйти.

изменяется на

do { 
    cin >> input; 

будет решать бесконечную петлю.

+0

компьютер должен угадать, а не пользователь. – Kaii

+0

@Kaii: и компьютер может набрать номер на клавиатуре ... как? –

+0

компьютер может угадать случайное число 'secretNumber = rand()% 100 + 1;', прочитать мой ответ. – Kaii

4

Думаю, вы должны переместить генерацию случайных чисел внутри цикла.

+0

+1 первый ответ, который учитывает, что компьютер должен угадать номер – stefaanv

0

бесконечный цикл в вашем коде, потому что аргумент while всегда верен, пока не получите истинное число.

вам нужно добавить еще один аргумент. Например, вы хотите установить максимальную попытку в 5 раз.то это будет как этот

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

при вводе неправильный номер в 5 раз, приложение завершит

+0

, он всегда будет терпеть неудачу, но, по крайней мере, перестанет терпеть неудачу после 5 итераций. – Kaii

+0

На самом деле истинный ответ - ответ Фишгора, Марка и триклозана. я не читал внимательно>. <, я сожалею :) –

+0

, затем прочитал снова, потому что триклозан и марк тоже ошибаются ;-) – Kaii