2014-01-08 3 views
-3

Прошу прощения за прослушивание этого форума моими постоянными проблемами Hangman. Я надеюсь, что с этим все скоро. На самом деле было трудно работать над этим. Вот мой код:(Надеюсь) один последний цикл в моей игре палача,

#include <stdio.h> 
#include <time.h> 
#include <string.h> 
#define MAX_WORD_LEN 20 
#define MAX_TRIES 6 
char* GetWordFromFile(); 
int HideWord(char* randomWordfromFile); 
void PlayAgain(); 
void GameLogic(char *randomWordfromFile); 
void clear_stdin(); 
void PlayGame(); 

int main() 
{ 
printf("Welcome to Hangman. Would you like play? Please answer Y/N. \n"); 
int PlayorNot = getchar(); 
if (PlayorNot == 'Y' || PlayorNot == 'y') 
    PlayGame(); 
else 
    system("cls"); 
    printf("Goodbye"); 

return 0; 
    } 

void PlayGame() 
{ 
    char* word = GetWordFromFile(); 
    GameLogic(word); 
    PlayAgain(); 
    } 





char* GetWordFromFile() 
{ 
FILE* pointertoFile = NULL; 
char randomWordfromFile[MAX_WORD_LEN]; 
int i = 0 , ran = 0; 
srand(time(NULL)); 
pointertoFile = fopen("C:\\Users\\Aditya\\Dropbox\\Hangman\\hangman.txt" , "r+"); 
for(; fgets(randomWordfromFile , MAX_WORD_LEN, pointertoFile) ; i++) 
      ; 
ran = rand() % i; 
rewind(pointertoFile); 
for(i = 0 ; i < ran ; i++) 
    fgets(randomWordfromFile , MAX_WORD_LEN , pointertoFile); 
return randomWordfromFile; 
} 



void GameLogic(char *randomWordfromFile) 
{ 
    int UserGuess; 
    int i, x; 
    int WrongGuesses; 
    size_t j; 
    size_t len = strlen(word); 
    char HiddenWord[len]; 
    for (j = 0; j < len; ++j) 
    { 
     HiddenWord[i] = "_ "; 
    } 
    printf("%s", HiddenWord); 


    for(i = 0; i < MAX_TRIES; i++) 
    { 
     printf("Go ahead and guess a letter\n"); 
     clear_stdin(); 
     scanf("%d", &UserGuess); 


     for (x = 0; x < len; x++) 
     { 
      if (randomWordfromFile[x] == UserGuess) 
       UserGuess = HiddenWord[x]; 
      else 
       break; 
     } 
} 
    printf("%s", randomWordfromFile); 

} 




void PlayAgain() 
{ 
    printf("Do you want to play again? Please answer with Yes/No?"); 
    char PlayAgainAnswer = getchar(); 
    if (PlayAgainAnswer == 'Y' || PlayAgainAnswer == 'y') 
     PlayGame(); 
    else if (PlayAgainAnswer == 'N"' || PlayAgainAnswer == 'n') 
     printf("Thanks for playing"); 
    else 
     printf("Thanks for playing"); 
} 


void clear_stdin() 
{ 
    while(getchar() != '\n'){;} 
} 

Его окончательная компиляция после того, что похоже на дни и дни работы и отладки. По какой-то причине, когда я запускаю свои печатные письма, этого не должно быть. Я считаю, что он входит в первый цикл, спрашивая, хочет ли пользователь играть. Отвечая «да», он просит вас угадать письмо. Но прежде чем спросить, что он должен показывать _ _ _ или тому подобное, в зависимости от количества букв в слове.

Я думаю, что проблема заключается в следующем цикле:

for (j = 0; j < len; ++j) 
{ 
    HiddenWord[i] = "_ "; 
} 
printf("%s", HiddenWord); 

Я же не могу показаться, чтобы найти проблему в этом цикле на это очень простой цикл.

+0

Эта строка 'SIZE_T LEN = STRLEN (слово);'. Где определение слова? – pzaenger

+0

char * word = GetWordFromFile(); – user2955782

+0

Я думаю, вы хотите написать 'randomWordfromFile', а не' word', потому что 'word' не является именем параметра вашей функции. – pzaenger

ответ

1
  1. i против j как указал asbumste
  2. HiddenWord[j] = '_'; поскольку вы присваивание полукокса
  3. HiddenWord[len] = '\0' и, конечно же, массив должен быть один символ больше

Надеются, что это помогает

PS Вы могли бы хотеть что-то вроде:

HiddenWord[2*j] = '_'; 
HiddenWord[2*j+1] = ' '; 

но вы получите точку :)

+0

Спасибо! Это сработало чудеса.Похоже, возможно, тот факт, что «" вместо «разрушил мой код». Урок научился быть очень осторожным! – user2955782

2

Вы используете J в цикле и я, как индекс, вы хотите, чтобы быть такой же

+0

О, крики. это было неправильно, но он по-прежнему не исправляет проблему:/ – user2955782

1

Смените

char HiddenWord[len]; 

в

char* HiddenWord = (char*)malloc(len); 

Так как вы хотите, чтобы ваш массив иметь динамический размер, вы хотите выделить память во время выполнения. Вы также должны проверить, было ли выделение памяти успешным. Посмотрите на http://www.programiz.com/c-programming/c-dynamic-memory-allocation и не забудьте освободить память после того, как вы закончите с ней.

+0

Я не совсем уверен, как освободить память и как работает динамическая память, но я добавил это в свой код. Однако ошибка все еще не работает. Есть идеи? – user2955782

+0

В конце вашей функции добавьте бесплатный (HiddenWord), вот и все. Рад, что ваша проблема разобралась. –

Смежные вопросы