2017-04-06 178 views
0

所以我創建了一個猜謎遊戲。它應該讓玩家1輸入一個介於0和99之間的數字,如果他們輸入了代碼之外的任何內容,應該讓他們重試。用while循環猜測遊戲中的while循環和if語句調試

然後它會詢問一些猜測/嘗試玩家2必須輸入他們認爲的數字。如果程序太高,程序會這麼說,如果程序太低,程序會這麼說。如果它是正確的 - 玩家2贏了,如果他們沒有猜測的話,該計劃也是這樣說的。

我的問題是與此代碼的後半部分。我試圖在剩下的猜測中進行猜測的次數。循環不起作用;這裏是代碼:

int secretnumber; 
    int guesses; 
    int secretnumberguess; 
    int remainingguesses; 

    while (1) { 
    printf("Player 1: Type a number between 0 and 99 and press return:\n"); 
    scanf(" %d",&secretnumber); 

    if (secretnumber > 99 || secretnumber < 0) { 
     printf("Secret number cannot be greater than 99 or below 0.\n"); 
     continue; 
    } 
    break; 
    } 

    printf("Type the number of guesses that player 2 gets and press return: \n"); 
    scanf("%d",&guesses); 

    remainingguesses = guesses - 1; 

    while (remainingguesses != 0) { 
    printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",&remainingguesses); 
    scanf(" %d",&secretnumberguess); 

    if (secretnumberguess > secretnumber) { 
     printf("Your guess was greater than the secret number.\n"); 

     else if (secretnumberguess < secretnumber) 
     printf("Your guess was less than the secret number.\n"); 

     else (secretnumberguess == secretnumber) 
       printf("Your guess was equal to the secret number. You win!\n"); 
     continue; 
    } 
    break; 
    } 

    if (remainingguesses == 0) 
    printf("Sorry you are out of guesses. You lose.\n"); 

我完全不熟悉這一點,並試圖調試和修復我的代碼。但是循環對我來說確實是一場噩夢,特別是當你將這些聲明放入組合時。我意識到自己很無能,我很抱歉,但是有人可以幫助我,因爲我對代碼的後半部分完全感到困惑。

+0

您可以減少(減少)while循環之外的剩餘猜測數。因此,剩餘猜測的數量永遠不會達到零,並且您的循環永遠不會終止。將減量移到剛剛從用戶處獲得下一個猜測之後。 (這是學習使用調試器遍歷代碼的好時機;它可以在循環的一兩次中發現問題。調試器是您將要使用的功能最強大的工具之一當解決你的代碼問題時,學會盡早使用它。) –

+0

'&remainingguesses'是存儲變量'remainingguesses'的內存位置。你可能不想打印。嘗試閱讀來自編譯器的警告消息。並學習如何使用調試器(例如GDB或LLDB)。 –

+0

爲了將來的參考,像*循環這樣的短語不工作*不是問題語句,除非你具體解釋什麼*不工作*的意思。在這種情況下,問題是循環永遠不會終止,所以你應該說,而不是*不工作*。如果您需要幫助,請*具體*並明確說明問題。 –

回答

0

首先,這代碼:

while (remainingguesses != 0) { 
    printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",&remainingguesses); 
    scanf(" %d",&secretnumberguess); 

是錯誤的。當使用printf語句並且您試圖在語句中輸入變量時,您不需要將&放入其中。

所以,你需要更改代碼,您可以:

while (remainingguesses != 0) { 
    printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",remainingguesses); 
    scanf(" %d",&secretnumberguess); 

您需要在printf語句中刪除&。我們只使用&來存儲東西到一個變量中。

0

一步一步地寫代碼,尊重正確的語法和理解下一步要完成的內容。不要急於。學習和編程只是需要時間而已。

remainingguesses = guesses - 1; 

變量remainingguesses控制你的循環,但是你只有一次的值賦給它,不會事後更改。循環將永遠不會結束。糾正後,問問自己:如果我輸入3次猜測,我可以做多少次猜測?

printf("Player 2: Type your guess and press return (guesses remaining:%d):\n",&remainingguesses); 

這裏要打印保存價值remainingguesses,而不是其實際值的內存地址。這是指針背後的概念,爲了正確理解這裏涉及的機制,我建議您研究一下。

if (secretnumberguess > secretnumber) { 
    printf("Your guess was greater than the secret number.\n"); 

    else if (secretnumberguess < secretnumber) 
    printf("Your guess was less than the secret number.\n"); 

    else (secretnumberguess == secretnumber) 
      printf("Your guess was equal to the secret number. You win!\n"); 
    continue; 
} 
break; 

小心那些大括號!只有當猜測大於祕密編號時,纔會輸入整個塊。在任何其他情況下,執行將跳轉至中止,然後退出,同時循環。我相信這個混淆讓你混淆了繼續使用中斷的用法。

其他充當您的條件聲明的意外事件。它不需要布爾值,也不需要像你正在使用的比較。換句話說,如果猜測數字既不大也不小於祕密數字,它保證與它相等。

這已被提及,但我不能強調它足夠:注意編譯器。研究它爲您提供的每一個錯誤和警告。你將通過這種方式確保進展。