2015-07-06 4 views
0

Создание простой игры в палач в C. У меня есть опыт работы на Java, и у меня возникают проблемы с методом guessLetter. Я пытаюсь определить, является ли символ, введенный пользователем символом в слове. Хотя, если вы видите какие-либо другие проблемы или имеете какие-либо советы для меня, все это оценили!Передача переменных в C - Создание игры палача

// Includes 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "hangman.h" 

//Function Declarations 
void getRandomWord(char* word); 

// Global Variable Declarations 
int wordLength = 0; 



//Main Function 
int main(void) 
{ 
    char word[MAX_WORD_LEN + 1]; 
    unsigned wrongGuesses = 0; 
    int guessedLetters[ALPHABET_SIZE] = { 
     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
    }; 





    srand(time(NULL)); 
    getRandomWord(word); 
    displayWord(word, wordLength); 
    guessLetter(word, guessedLetters); 








    return EXIT_SUCCESS; 
} 


//Gets Random Word from Words Array 
void getRandomWord(char* word) 
{ 
    const char* words[NUM_WORDS] = { 
     "array",  "auto",  "break",  "case",  "cast", 
     "character", "comment", "compiler", "constant", "continue", 
     "default", "double",  "dynamic", "else",  "enum", 
     "expression", "extern",  "file",  "float",  "function", 
     "goto",  "heap",  "identifier", "library", "linker", 
     "long",  "macro",  "operand", "operator", "pointer", 
     "prototype", "recursion", "register", "return",  "short", 
     "signed",  "sizeof",  "stack",  "statement", "static", 
     "string",  "struct",  "switch",  "typedef", "union", 
     "unsigned", "variable", "void",  "volatile", "while" 
    }; 


    int randomNumber = rand() % NUM_WORDS; 
    printf("Random Number is: %d\n", randomNumber); 
    wordLength = strlen(words[randomNumber]); 
    printf("Word Length is: %d\nWord is: %s\n", wordLength, words[randomNumber]); 
    word = words[randomNumber]; 
    return word; 



} 


//Prints Word Formatted with dashes 
void displayWord(char* word, int* guessedLetters) 
{ 

    int x = 0; 
    printf("%s \n", word); 


    for (x = 0; x <= wordLength * 2; x++) 
    { 
     printf("="); 
    } 
    printf("\n|"); 

    for(x = 0; x < wordLength; x++) 
    { 

     if (word[x] != guessedLetters) 
     { 



      printf("_|"); 
     } 
     else 
     { 
      printf(guessedLetters); 
     } 
    } 
    printf("\n"); 

    for (x = 0; x <= wordLength * 2; x++) 
    { 
     printf("="); 
    } 


} 


//User Makes Guess, Determines whether Guess is Correct or Incorrect 
int guessLetter(char* word, int* guessedLetters) 
{ 
    char firstGuess; 
    int x; 
    //puts(word); will print an @ and another strange symbol! This is where my problem is! 

    printf("\nEnter Your Guess: "); 
    scanf("%d\n", firstGuess); 

    for(x = 0; x < wordLength; x++) 
    { 
     if(firstGuess == word[x]) 
     { 
      printf("Correct Guess!!"); 
      return GOOD_GUESS; 
     } 
     else 
     { 
      printf("Incorrect"); 
      return BAD_GUESS; 
     } 
    } 

// Once a correct Guess is made that character will be added to the guessedLetters Array 


} 
+0

Независимо от того, ess, Неправильный Угадай всегда печатается, поскольку я чувствую, что слово неправильно передается, когда я пытаюсь его распечатать, я получаю знак @. Noobie Quesiton Я знаю! – Luke

+0

И вопрос в том, что? Вы должны изменить вопрос с этой информацией, а затем предоставить важную часть комментариев. – John

+0

Попробуйте отбросить. Самое сложное слово, чтобы угадать в hangman –

ответ

2

У вас много проблем.

Менее серьезная проблема:

int guessedLetters[ALPHABET_SIZE] = { 
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 
}; 

может быть сокращена до

int guessedLetters[ALPHABET_SIZE] = {0}; 

Серьезных проблем:

  • используется word = words[randomNumber];. Это просто изменяет локальный указатель word и указывает на указатель строки литерала на words[randomNumber]. Вероятно, вам нужно скопировать каждый символ по символу. Это можно сделать с помощью функции strcpy из string.h:

    strcpy(word, words[randomNumber]); 
    
  • Вы return word; от getRandomWord, который является функцией возвращения void (не возвращает ничего). Это не верно. Удалить return word;
  • Вы вызываете displayWord(word, wordLength); со вторым аргументом wordLength, который является int. Но

    void displayWord(char* word, int* guessedLetters) 
    

    ожидает int* в качестве второго параметра. Поскольку wordLength является глобальным, вам не нужно его передавать. displayWord не может видеть guessedLetters, так как он локальный в main.Передайте его displayWord вместо прохождения wordLength:

    displayWord(word, guessedLetters); 
    
  • Здесь if (word[x] != guessedLetters) вы сравните char с int*. Это не имеет никакого смысла. Это, вероятно, следует if (guessedLetters[x] == 0)
  • Вы используете printf(guessedLetters); и передать int* в качестве первого аргумента printf который ожидающей const char* в качестве первого аргумента. Вероятно, это должно быть printf("%c", word[x]);.
  • scanf("%d\n", firstGuess); должно быть scanf(" %c", &firstGuess); по причинам, указанным в @SouravGhosh'sanswer.
  • Вы возвращаете GOOD_GUESS и BAD_GUESS от guessLetter, но никогда не используйте возвращаемое значение. Вам не нужно ничего возвращать из этой функции. Просто назначьте другое значение, отличное от 0, в эту позицию в guessLetters. Так удалить оба возврата заявления и изменения

    int guessLetter(char* word, int* guessedLetters) 
    

    в

    void guessLetter(char* word, int* guessedLetters) 
    

    и

    if(firstGuess == word[x]) 
    { 
        printf("Correct Guess!!"); 
        return GOOD_GUESS; 
    } 
    else 
    { 
        printf("Incorrect"); 
        return BAD_GUESS; 
    } 
    

    в

    if(firstGuess == word[x]) 
    { 
        printf("Correct Guess!!"); 
        guessedLetters[x] = 1;  //Change the value of the current position 
    } 
    else 
    { 
        printf("Incorrect"); 
    } 
    
  • Вы объявляете только одну функцию:

    void getRandomWord(char* word); 
    

    Что относительно остального? Использование:

    void getRandomWord(char* word); 
    void displayWord(char* word, int* guessedLetters) 
    void guessLetter(char* word, int* guessedLetters) 
    

Исправлен код: (непроверенные):

// Includes 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "hangman.h" 

//Function Declarations 
void getRandomWord(char* word); 
void displayWord(char* word, int* guessedLetters) 
void guessLetter(char* word, int* guessedLetters) 

// Global Variable Declarations 
int wordLength = 0; 

int main(void) 
{ 
    char word[MAX_WORD_LEN + 1]; 
    unsigned wrongGuesses = 0; 
    int guessedLetters[ALPHABET_SIZE] = {0}; 

    srand(time(NULL)); 

    getRandomWord(word); 
    displayWord(word, guessedLetters); 
    guessLetter(word, guessedLetters); 

    return EXIT_SUCCESS; 
} 


//Gets Random Word from Words Array 
void getRandomWord(char* word) 
{ 
    const char* words[NUM_WORDS] = { 
     "array",  "auto",  "break",  "case",  "cast", 
     "character", "comment", "compiler", "constant", "continue", 
     "default", "double",  "dynamic", "else",  "enum", 
     "expression", "extern",  "file",  "float",  "function", 
     "goto",  "heap",  "identifier", "library", "linker", 
     "long",  "macro",  "operand", "operator", "pointer", 
     "prototype", "recursion", "register", "return",  "short", 
     "signed",  "sizeof",  "stack",  "statement", "static", 
     "string",  "struct",  "switch",  "typedef", "union", 
     "unsigned", "variable", "void",  "volatile", "while" 
    }; 

    int randomNumber = rand() % NUM_WORDS; 
    printf("Random Number is: %d\n", randomNumber); 
    wordLength = strlen(words[randomNumber]); 
    printf("Word Length is: %d\nWord is: %s\n", wordLength, words[randomNumber]); 
    strcpy(word, words[randomNumber]); 
} 


//Prints Word Formatted with dashes 
void displayWord(char* word, int* guessedLetters) 
{ 

    int x = 0; 
    //printf("%s \n", word); Why print it here? No need for this 


    for (x = 0; x <= wordLength * 2; x++) 
    { 
     printf("="); 
    } 
    printf("\n|"); 

    for(x = 0; x < wordLength; x++) 
    { 

     if (guessedLetters[x] == 0) 
     { 
      printf("_|"); 
     } 
     else 
     { 
      printf("%c", word[x]); 
     } 
    } 
    printf("\n"); 

    for (x = 0; x <= wordLength * 2; x++) 
    { 
     printf("="); 
    } 
} 


//User Makes Guess, Determines whether Guess is Correct or Incorrect 
void guessLetter(char* word, int* guessedLetters) 
{ 
    char firstGuess; 
    int x; 

    printf("\nEnter Your Guess: "); 
    scanf(" %c", &firstGuess); 

    for(x = 0; x < wordLength; x++) 
    { 
     if(firstGuess == word[x]) 
     { 
      printf("Correct Guess!!"); 
      guessedLetters[x] = 1;  //Change the value of the current position 
     } 
     else 
     { 
      printf("Incorrect"); 
     } 
    } 
} 
+0

сделал те изменения спасибо! – Luke

+0

woops не все из них только первые два! – Luke

+0

Что касается определения того, существует ли у слова пользователя письмо в слово, как я могу это сделать? Я внес изменения, которые вы предложили! Спасибо !! – Luke

0

В вашем случае, на первый взгляд,

scanf("%d\n", firstGuess); 

неправильно. Вы используете неправильный спецификатор преобразования. Это должно быть на самом деле

scanf(" %c", &firstGuess); //notice ALL the chnages 
  • Пункт 1: Вы должны использовать %c читать char.
  • Пункт 2: Ваш ввод должен быть точно соответствует прилагаемой строке формата. Я считаю, вам не нужно иметь \n в строке формата.
  • Точка 3: %c спецификатор формата ожидает, что соответствующий аргумент, чтобы быть указатель к char (как ширина поля по умолчанию в 1)
  • Точка 4: Обратите внимание на пробел перед тем %c, это помогает съесть любые возможные пробелы перед ожидаемым несимметричный ввод символов.
+0

Woops, Просто играл с кодом и забыл изменить его! Может ли% c и% d не использоваться взаимозаменяемо? – Luke

+0

@ Luke Nope, используя неправильный спецификатор формата, приводит к [неопределенному поведению] (https: //en.wikipedia.орг/вики/Undefined_behavior). –

+1

Большое спасибо :) – Luke

0

Что касается определения того, существует ли или не буква/символ в слове можно использовать strchr() function:

if(strchr (word,firstGuess)){ 
    printf("Correct Guess!!"); 
    flag_guess_correct = 1;  //flag is set when the guessed character is present in word 
} 
+0

Спасибо за это! : D – Luke