2015-10-14 116 views
0

我一直在這個項目上花了幾個小時試圖弄清楚這一點,但我到了腦死亡的地步,我讀的所有東西都讓我感到困惑。猜數字遊戲,每#低

這個想法是輸入一個數字,程序會告訴我它是對還是錯。每次輸入數字後的最終響應都是數字太低。

另外,最終答案指出答案太低,而且它在同一時間是正確的。

最後,這件事情是假設再次問是否輸入的數字是不正確的,但我不知道如何做到這一點。

字面上,最小的建議是非常讚賞在這一點上。這是一個漫長而呻吟的夜晚。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 


int number; 
//new function 
void welcomeMessage(){ 
    printf("Welcome to my new guessing game!\n"); 
    printf("Let's get started!\n"); 
} 
//new function 
int randomNumber(){ 

    int range; 

    srand(time(NULL)); 
    range = (20 - 1) + 1; 

    number = rand() % range + 1; 

    return 0; 
} 
//new function 
int guessInput(){ 

    int guess, range; 

    printf("I'm thinking of a number between 1 and 20\n"); 
    printf("Care to give it a guess? Be careful! You only get 4 tries!\n"); 
    scanf("%d", &guess); 

    return 0; 
} 
//new function 
int wrongAnswer(){ 

    int guess, number; 

     if(guess < number) 
     { 
      printf("Try again, your guess is too low\n"); 
      return 0; 
    } 

     else if(guess > number) 
    { 
      printf("Give it another try, your guess was a bit to high\n"); 
      return 0; 
    } 
     return 0; 
} 
//new function 
int correctAnswer(){ 

    int guess, number; 

     if(guess == number) 
      printf("Great job! That time you got it right!\n"); 
      return 0; 
} 

int main(){ 
    welcomeMessage(); 
    randomNumber(); 
    guessInput(); 
    wrongAnswer(); 
    correctAnswer(); 

} 
+1

您正在爲每個函數定義新變量 - 這些變量不是「全局」的,只存在於這些函數中。 – teppic

+1

每次打電話給'rand'時都不要調用'srand'。在程序啓動時調用一次。 –

+0

@JonathonReinhart對不起,你能解釋一下嗎?還是可能給我看?我不太明白。 –

回答

4

你不是真正的guess的值傳遞給wrongAnswer()correctAnswer()guess在這兩個函數中未初始化,並且不包含存儲在guessInput()中的值。這就是爲什麼wrongAnswer告訴你這個猜測太低,correctAnswer告訴你它是正確的。

您還需要刪除這些函數中的number聲明。你現在有一個全球的number存儲隨機數,但在你的函數中聲明的新的number變量將優先 - 它是未初始化的,不包含你認爲它的隨機數。

您可能需要調整您的wrongAnswer()correctAnswer()功能採取guess作爲整數參數,並且在這兩個函數中取出guessnumber聲明。像

int wrongAnswer(int guess); 
int correctAnswer(int guess); 

東西,你也可以考慮讓你的guessInput()函數返回的guess值。嘗試類似

int guessInput() 
{ 
    int guess; 

    printf("I'm thinking of a number between 1 and 20\n"); 
    printf("Care to give it a guess? Be careful! You only get 4 tries!\n"); 
    scanf("%d", &guess); 

    return guess; 
} 

int main() 
{ 
    ... 
    int guess = guessInput(); 
    wrongAnswer(guess); 
    correctAnswer(guess); 
    ... 
} 

這樣你路過猜測的價值,你的兩個功能,使他們能夠真正計算的數量是否正確或不正確的。

你也想看看你的返回函數的值。現在他們並沒有真正告訴你什麼,並且無論如何他們都返回0。考慮如果猜測是正確的,則將它們更改爲返回0,如果猜測不正確,則返回1。

int correctAnswer(int guess) 
{ 
    if(guess == number) { 
     printf("Great job! That time you got it right!\n"); 
     return 0; 
    } else { 
     return 1; 
    } 
} 

有了這些信息,你可以創建一個while循環不斷要求輸入用戶,直到輸入正確的答案。像

int main() 
{ 
    ... 
    int is_correct = 1, is_wrong = 1; 
    int guess; 
    while (is_correct == 1) { 
     guess = guess_input(); 
     is_wrong = wrongAnswer(guess); 
     is_correct = correctAnswer(guess); 
    } 
    ... 
} 

東西while以上循環將調用各自的三大功能,永遠,直到用戶猜測正確的輸入。它評估is_correct == 1,不斷檢查is_correct的值,並重復其自身。當is_correct == 0循環會中斷,程序將終止。這是我上面提到的返回值進來的地方 - 返回值0表示正確答案,並且將允許您的程序停止。返回值1將重複循環。還有其他的方法可以做到這一點,但它可能會幫助你,當你開始。

希望這可以幫助你。我也考慮重新設計你的wrongAnswer()correctAnswer()的功能 - 你真的需要兩個?你可以減少到一個功能?

+0

感謝所有這些。可悲的是,它需要我有兩個錯誤和正確答案的功能。最好我想簡化成一個,但這是不允許的。 –

2

我在程序中看到的最基本的問題是您沒有將值傳遞給函數。每一個功能本身就是有效的,或者我應該說它必須使用的「數字」沒有被傳遞給它們。

您可以使用全局變量或直接傳遞值。這是我會做:

輸入功能:

int guessInput(){ 
int guess, range; 
printf("I'm thinking of a number between 1 and 20\n"); 
printf("Care to give it a guess? Be careful! You only get 4 tries!\n"); 
scanf("%d", &guess); 
return guess;} 

隨機數生成器功能:

int randomNumber(){ 
int range; 
srand(time(NULL)); 
range = (20 - 1) + 1; 
number = rand() % range + 1; 
return number;} 

應答功能:(你真的不需要此功能2 )

int Answer(int guess, int number){ 

int counter=0; 
    if(guess < number) 
    { 
     printf("Try again, your guess is too low\n"); 
     counter=1; 
} 

    else if(guess > number) 
{ 
     printf("Give it another try, your guess was a bit to high\n"); 
     counter=1; 
} 

    else if(guess == number) 
{ 
     printf("Great job! That time you got it right!\n"); 
     counter=2; 
} 
    return counter;} 

既然您所有的函數都可以接受變量,那麼修改Main函數

int main(){ 

int number=0; 
int guess=0; 
int answr=0; // This does not have to exist but since your doing a return. 
welcomeMessage(); 
number=randomNumber(); 
guess=guessInput(); 
Do { 
answr=Answer(guess,number); 
}(while answr<2) 
} 

所以當計數器達到2時,這意味着答案是正確的,當用戶猜測正確的答案時,while循環將停止。 PS:你可能需要擦亮我的代碼,因爲我也在腦死亡模式atm。 :D

+0

非常感謝你。我同意將答案函數降至一個會更簡單,但指示說我們必須將它們分爲兩個,一個是正確的,一個是不正確的。 –

+0

好吧,如果這是一個要求,你可以用最初的想法,並在while循環中具有兩個函數(修改我最喜歡創建的方式)。確保結果有返回值,代碼將執行這兩個函數,並且一旦滿足正確答案的返回值,就可以使循環退出。 讓我知道你是否想讓我爲你創建一個代碼片段。 –