2016-02-23 2 views
0

Мне нужно создать программу, которая создает угадывание буквенной игры. Все построено успешно. Тем не менее, я столкнулся с проблемой, потому что функция GetTheLetter и функция CompareThe Letters объединяются и печатаются одновременно. Когда пользователь запрашивает угадать, он также распечатывает первый оператор if функции CompareTheLetters. Что я делаю не так?две функции происходят одновременно

#define _CRT_SECURE_NO_WARNINGS 
#define MAXGUESSES 4 
#include <stdio.h> 

void GuessItRules(); //Game instructions 
int PlayOneGame(char letter); //Runs a game 
char GetTheLetter(); //Prompts user to guess and returns guess 
int IsAWinner(char letter, char userguess); //Returns either a 1 or a 0 depending on if the user guessed correctly 
void CompareTheLetters(char letter, char userguess); //Prints message dependent on whether guess comes before, after, or is the letter 


int main() 
{ 
    //declare additional variables 
    //declare FILE pointer 
    FILE* PTR; 

    int numOfgames; //number of games user wants to play 
    int i;  //iterator 

    char letter; //letter from file 
    int win; //variable for the return of the PlayOneGame function 

    //display instructions 
    GuessItRules(); 
    //connect to the file HINT: use fopen 
    PTR = fopen("letters.txt", "r"); 
    //get number of games to play 
    printf("Let's start playing!\n\nHow many games would you like to play (1-5)?\n\n"); 
    scanf("%d", &numOfgames); 
    //this for loop will allow the player to play more than one game 
    //without recompiling 
    for (i = 0; i < numOfgames; i++) 
    { 
     //get a letter from file - use fscanf 
     fscanf(PTR, "%c", &letter); 

     //Play one game (Call PlayOneGame function) - remember the function has an int return type 
     win = PlayOneGame(letter); 
     //tell the player if they have won or lost (test the variable win)  
     if (win == 1) 
      printf("Congrats! You guessed the correct letter!!\n\n"); 
     else if (win == 0) 
      printf("I'm sorry you did not guess the correct answer :(The letter was %c\n\n", letter); 
    } 

    //close file 
    fclose(PTR); 
    return 0; 
} 

//Function definitions 

void GuessItRules() 
{ 
    printf("Welcome to the Guess the Letter Game!\n-------------------------------------\n\n"); 
    printf("You will have 4 chances to guess the letter per a game\n\n"); 
} 

int PlayOneGame(char letter) 
{ 
    int numOfguesses = 0; 
    int winOrLose = 0; //should be intialized 
    char userguess;  // user guess 

    //As long as the user has not used up the maximum number 
    //of guesses and has not guessed correctly 
    //the game will continue using this while loop 
    while (numOfguesses < MAXGUESSES && winOrLose == 0) 
    { 

     //function call to GetTheletter - returns to userguess variable 
     userguess = GetTheLetter(); 
     //function call to IsAWinner - returns to winOrLose variable (0 or 1) 
     winOrLose = IsAWinner(letter, userguess); 
     //function call to CompareTheLetters - gives the user a message 
     CompareTheLetters(letter, userguess); 
     //update counter for number of guesses used 
     numOfguesses = numOfguesses + 1; 
    } 

    return winOrLose; //(0 or 1) 
} 

char GetTheLetter() 
{ 
    char userguess; 
    printf("Please enter a guess \n\n"); 
    scanf("%c", &userguess); 
    return (userguess); 
} 

int IsAWinner(char letter, char userguess) 
{ 
    if (userguess == letter) 
     return (1); 
    else 
     return (0); 
} 

void CompareTheLetters(char letter, char userguess) 
{ 
    if (userguess < letter) 
    { 
     printf("The letter you are trying to guess comes after %c\n\n", userguess); 
    } 
    else if (userguess > letter) 
    { 
     printf("The letter you are trying to guess comes before %c\n\n", userguess); 
    } 
    else if (userguess == letter) 
    { 
     printf("The letter is %c!!!!\n\n", userguess); 
     printf("Congrats!!! You did it!!\n\n"); 
    } 

} 
+0

«одновременно объединяются и печатаются». Что именно вы подразумеваете под этим? Пожалуйста, обновите вопрос, чтобы показать точный ввод и вывод. – kaylum

+0

Есть ли вопрос канонической «новой строки в буфере»? Есть, как и некоторые из них в день, сейчас :( –

ответ

1

Проблема заключается в том, когда вы просите пользователя угадать письмо.

Когда вы используете спецификатор формата %c на scanf, новая строка удовлетворяет этому спецификатору формата. Поскольку во входном буфере с вашего предыдущего ввода будет указана новая строка, это поднимет эту новую строку.

Поместите пространство в начале строки формата, чтобы поглотить новую строку:

scanf(" %c", &userguess); 

Обратите внимание, что другие спецификаторы формата, такие как %d и %f пропустит новой строки, в отличие от %c. Таким образом, необходимо пространство для пропуска новых строк только для %c.

+0

да, я понял. Это была точная проблема. Я также должен был сделать это для scanf («% c», & letter); – Nikita

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