2014-10-03 124 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