2012-02-15 41 views
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; 

} 
+2

你只從用戶那裏得到一個數字,然後你在你的循環中再次比較它。您可能應該提示用戶輸入循環內的數字。 – 2012-02-15 14:34:32

+0

電腦需要猜你的電話號碼?....也許你需要猜測電腦的號碼?我很困惑,答案也是這樣,看起來...... – user1096188 2012-02-15 14:42:22

+0

@ user1096188我已經做了一個程序,我需要猜測計算機的隨機數。現在我想挑戰自己,看看我能否以相反的方式做出來,結果我不能 – Stijn 2012-02-15 14:46:40

回答

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

感謝這個幫助我的人,它olny需要很長時間來猜測電腦的數量,所以我認爲我會改變範圍在1-20而不是1-100,謝謝allot dude。 – Stijn 2012-02-15 14:50:43

+0

你可以通過在每次迭代中動態設置一個下限和上限,在計算機知道他是否猜到太高或太低之後,而不是隨機猜測,有一些統計方法可以提高計算機的猜測能力(例如:從100開始,如果過高,下次嘗試一半值等等) – Kaii 2012-02-15 14:52:59

+0

我發佈了一個問題和5分鐘後,我學到了很多東西,你對此負責,我不能夠感謝你 – Stijn 2012-02-15 15:03:31

5

地方cin >> input進入循環體

+0

感謝它幫助我達到90%爲止,現在的問題是它總是說相同的數字,需要猜測的是,你能幫助我嗎?感謝你迄今爲止做了什麼:) – Stijn 2012-02-15 14:41:42

+1

計算機應該猜測,而不是用戶。閱讀我的回答 – Kaii 2012-02-15 14:45:10

3

變量input的值在循環永遠不會改變,因此終止條件input != secretNumber永遠都無法滿足。

您應該在循環內採取輸入。所以在循環開始處寫cin >> input

編輯:

如果計算機應該猜的話還是要在循環,這是不存在於你的代碼改變input需求的價值。循環每次在input中以相同的值運行。

爲了讓你的電腦做出猜測,你應該遵循一些方案。計算機可以隨機抽取數字 - 您可以通過在循環內移動secretNumber = rand()%100 + 1來獲取數字。但是這種方法可能表現不佳,循環可能會持續很長時間。這在@ Kaii的答案中顯示。

更有效的方法是Binary Search。在這種情況下,你應該跟蹤計算機的猜測。保留兩個變量highlow,它們應分別存儲高於和低於input的猜測值。每當猜測數字高於此數字時,將其存儲在high中,並在low中存儲低於input的任何猜測。然後計算機應嘗試highlow之間的新猜測。隨機猜測應該是secretNumber = low + rand() % (high - low)。在最壞的情況下,它將需要多達100次迭代。爲了獲得最佳結果,每個猜測應該是(high + low)/2。根據條件,在每次迭代中將更新highlow之一。這種方法將確保計算機會在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 2012-02-15 15:18:42

+0

驚人的男人thakns分配! – Stijn 2012-02-15 16:52:55

+0

@Stijn要公平:這是我認爲最正確的答案。但謝謝你的接受;) – Kaii 2012-04-04 06:45:05

0

你要做的循環內的輸入。現在,您在開始循環前提示輸入值,然後再不要求用戶輸入其他號碼。如果猜測不能改變,循環永遠不能退出。

更改爲

do { 
    cin >> input; 

會解決這個無限循環。

+0

計算機應該猜測,而不是用戶。 – Kaii 2012-02-15 14:42:26

+0

@Kaii:電腦可以在鍵盤上輸入數字......怎麼樣? – 2012-02-15 14:43:48

+0

計算機可以通過'secretNumber = rand()%100 + 1;'來猜測一個隨機數,閱讀我的答案。 – Kaii 2012-02-15 14:45:40

4

我認爲你應該將循環內的隨機數生成。

+0

+1第一個答案是考慮到計算機應該猜測數字 – stefaanv 2012-02-15 14:46:39

0

無限循環在你的代碼中,因爲while的參數總是爲true,直到你得到真實的數字。

您需要添加另一個參數。例如,您要將最大嘗試設置爲5次。那麼它會是這樣

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

時5次你輸入號碼錯誤,應用程序將完成

+0

它總是會失敗,但至少在5次迭代後停止失敗。 – Kaii 2012-02-15 14:43:05

+0

其實真正的答案是chiphor's,Marc's和triclosan的答案。我沒有仔細閱讀>。<,我很抱歉:) – 2012-02-16 02:33:31

+0

然後再讀一遍,因爲三氯生和marc也是錯的;-) – Kaii 2012-02-16 07:15:08