2017-03-21 68 views
0

這個程序不工作,我看不出爲什麼! 當我猜想一個不是45的數字剛剛停止,它甚至不會給我一個猜測新數字的機會嗎?簡單的遊戲循環與C++

有什麼建議嗎?

int main() 
{ 

char try_again; 
int count = 5; 
int num; 

cout << "Hello, Guess a number between 1 - 100! You have " << count << " guesses to find the right number!\n"; 
cin >> num; 


while (num != 45); 

{ 
    count--; 

    if (count > 0) 
    { 
     cout << "Wrong number, guess again!\n You have " << count << " guesses left" << endl; 
     cin >> num; 
    } 


    else 
    { 
     cout << "Out of guesses! Try again? y/n\n"; 
     cin >> try_again; 

     if (try_again == 'y' || try_again == 'Y') 
      main(); 

     else if (try_again == 'n' || try_again == 'N') 
      return 0; 

    } 

} 

cout << "Congratz, you guessed right! Play again? y/n\n"; 
cin >> try_again; 

if (try_again == 'y' || try_again == 'Y') 
    main(); 
else if (try_again == 'n' || try_again == 'N') 
    return(0); 

return 0; 
} 
+3

'while(num!= 45);' - 多餘的分號 –

+1

不要調用'main()'。這是一個很大的禁忌。 –

+0

爲什麼?還有,「void」數據類型只有在函數不返回值時纔可用? –

回答

3

while循環後分號基本意思是「當條件爲真,什麼也不做」,如果不採取任何措施,情況永遠不會改變。

解決這類問題的方法是在編譯時使用-Wall或甚至-Wextra。它仍然會編譯,但你會得到一個警告。這裏是你的程序的輸出,當我編譯:

$ g++ foo.cpp -Wall -Wextra 
foo.cpp: In function ‘int main()’: 
foo.cpp:16:3: warning: this ‘while’ clause does not guard... [-Wmisleading-indentation] 
    while (num != 45); 
    ^~~~~ 
foo.cpp:18:3: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘while’ 
    { 
^

如果你想知道爲什麼這甚至是允許的,其實有它的一些用途。我上面提到,這種情況永遠不會改變。這不一定是真實的,因爲條件可以通過另一個流程或其他方式改變。例如,我們可以做一個while(!keypressed());等待,直到按下一個鍵。它也可以用來查找鏈接列表中的最後一個元素while(ptr && (ptr=ptr->next)->next);

但是除非您知道自己在做什麼,否則請勿在循環標題後面加分號。這也適用於for循環。