2014-10-03 125 views
2

在我正在寫的一個hang子手程序中,當用戶第一次輸入「e」,然後嘗試輸入「鰻魚」或「蜜蜂」時, e「作爲第二個提示,將顯示」你已經猜到了這封信「兩次。我怎樣才能解決這個問題?某些語句打印兩次

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


int main(){ 

char w[13][3] = { 
     { 'c', 'a', 't' }, //0 
     { 'd', 'o', 'g' }, //1 
     { 'r', 'a', 't' }, //2 
     { 'e', 'e', 'l' }, //3 
     { 'c', 'o', 'w' }, //4 
     { 'o', 'w', 'l' }, //5 
     { 'e', 'm', 'u' }, //6 
     { 'b', 'a', 't' }, //7 
     { 'e', 'l', 'k' }, //8 
     { 'p', 'i', 'g' }, //9 
     { 'b', 'e', 'e' }, //10 
     { 'h', 'e', 'n' }, //11 
     { 'f', 'o', 'x' }, //12 
}; 

char u, 
    newline, 
    dis[16]; 

int random, 
    guesses = 3, 
    finish = 0; 

_Bool successfulGuess = false; 

srand(time(NULL)); 
random = rand() % 13; 

    printf("Animal %d\n", random); //check random number 
    printf("---------\n\n"); 
    printf("Enter a letter: "); 
    u = getchar(); 
    newline = getchar(); 

    for (int i = 0; i < 3; i++){ 

     if (w[random][i] == u){ 
      successfulGuess = true; 
      dis[i] = u; 
     } 
     else { 

      dis[i] = '_'; 
     } 
    } 

    for (int j = 0; j < 3; j++){ 
     dis[j] = dis[j]; 

    } 

    printf("\n"); 

    for (int i = 0; i < 3; i++){ 
     printf("%c", dis[i]); 
    } 

    if (successfulGuess == false){ 
     --guesses; 
    } 
    printf("\n\nGuesses left: %d", guesses); 
    printf("\n\n"); 

while (guesses > 0){ 
    finish = 0; 
    successfulGuess = false; 
    printf("Enter a letter: "); 
    u = getchar(); 
    newline = getchar(); 

    for (int i = 0; i < 3; i++){ 

     if (u == dis[i]){ 
      successfulGuess = true; 
      printf("\nYou already guessed this letter.\n"); 
      printf("\ninput = dis[i]\nGuesses left: %d\n\n", guesses); 
     } 
     else if (w[random][i] == u){ 
      successfulGuess = true; 
      dis[i] = u; 
      printf("\ninput = array char\nGuesses left: %d\n\n", guesses); 
     } 
    } 
     for (int i = 0; i < 3; i++){ 
      printf("%c", dis[i]); 
     } 

     if (successfulGuess == false){ 
      guesses--; 
      printf("\n\nbool statement\nGuesses left: %d\n\n", guesses); 
     } 

     if (guesses == 0){ 
      printf("Sorry, you've run out of guesses."); 
     } 

     for (int i = 0; i < 3; i++) { 
      if (dis[i] != '_') { 
       finish++; 
      } 
      if (finish == 3){ 
       printf("\n\nYou guessed the word!"); 
       guesses = 0; 
      } 
      else{ 
       continue; 
      } 
     } 
     printf("\n\n"); 
} 

system("pause"); 
} 
+1

爲什麼你有'for(int j = 0; j <3; j ++){dis [j] = dis [j]; ''在你的程序中? – 2014-10-03 05:58:29

+0

'for(int j = 0; j <3; j ++){dis [j] = dis [j]; }'循環? – AnT 2014-10-03 05:58:50

+3

請閱讀[「最小,完整,可驗證,示例」中的「最小」](http://stackoverflow.com/help/mcve)。爲什麼我們需要看到所有「工作」可能性的數組?如果您的隨機選擇正在工作,請將其解決並硬編碼問題案例。簡而言之:不要發佈*「這是我的所有代碼,找到我的錯誤」*,而是*「我已經將我的代碼削減到了顯示問題的最重要版本的程序」*。這將集中您的問題,並且您可能在過程中發現自己的錯誤... – HostileFork 2014-10-03 06:02:09

回答

3

即使您已經顯示消息,您仍在循環三次。我認爲它應該打破這個消息:

for (int i = 0; i < 3; i++){ 

    if (u == dis[i]){ 
     successfulGuess = true; 
     printf("\nYou already guessed this letter.\n"); 
     printf("\ninput = dis[i]\nGuesses left: %d\n\n", guesses); 

     /* BREAK HERE */ 
     break; 
    } 
+0

這個工作就像一個魅力。 – Novaea 2014-10-03 06:09:18