#c
#c
Вопрос:
В настоящее время я студент, изучающий программирование. В нашем задании нас попросили сделать игру в угадывание чисел. Инструктор дал схему для заполнения, чтобы помочь нам с проектом.
При запуске этой программы она принимает только одно предположение, печатает, что ответ «@» четыре раза, и делает это для количества выбранных игр.
Я, честно говоря, не могу понять, что я сделал не так. Я поместил исходный код ниже. Любая помощь приветствуется.
Для открытия с файлом letterList.txt , У меня есть текстовый документ в том же каталоге со списком букв, каждая из которых находится в другой строке.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>
#define MAXGUESSES 5
//this function provides instructions to the user on how to play the game
void LetterGuessRules();
//this function runs one game.
//input: character from the file, void return type
//all other functions to Play one round of a game
//are called from within the GuessTheLetter function
void GuessTheLetter(char);
//this function prompts the player to make a guess and returns that guess
//this function is called from inside the GuessTheLetter( ) function described above
char GetTheGuess();
//this function takes two arguments, the guess from the player
//and the solution letter from the file.
//The function returns 1 if the guess matches the solution and returns a 0 if they do not match
//This function also lets the user know if the guess comes alphabetically before or after the answer
int CompareLetters(char, char);
int main()
{
//declare additional variables
//declare FILE pointer
FILE *inPtr;
int numGames = 0, i = 0;
char letter;//letter from file
//display game rules
LetterGuessRules();
//Ask and get number of games to play
printf("nHow many games would you like to play?n");
scanf("%d", amp; numGames);
//connect to the file HINT: use fopen
inPtr = fopen("letterList.txt", "r");
//this for loop will allow the player to play more than one game
//without recompiling
for (i = 0; i < numGames; i )
{
//get a solution letter from file - use fscanf
fscanf(inPtr, " %c", amp;letter);
//change the solution to lowercase
letter = tolower(letter);
//call the GuessTheLetter function and pass it the solution
GuessTheLetter(inPtr);
}
//close file pointer
return 0;
}
//this function runs one game.
//input: character from the file, void return type
//all other functions to Play one round of a game
//are called from within the GuessTheLetter function
//this function lets the user know if they have won or lost the game
void GuessTheLetter(char solution)
{
int win = 0;
int numGuesses = 0;
char playerguess = 0;
//declare additional variables
while (numGuesses < MAXGUESSES amp;amp; win == 0)
{
//get a guess from the user by calling the GetTheGuess function
GetTheGuess("playerguess");
//change the guess to lowercase
playerguess = tolower;
printf(" %c", playerguess);
//win = call the function to compare the guess with the solution
win = CompareLetters(solution, playerguess);
numGuesses ;//count the number of guesses so far
}
//use conditions to let the user know if they won or lost the round of the game
if (win == 0)
{
printf("nSorry, you lost that round.");
}
else
{
printf("Congratulations, you won that round");
}
}
//this function provides instructions to the user on how to play the game
void LetterGuessRules()
{
printf("Guess a letter by typing it in then pressing enter.nThe Game will tell you where your guessed letter is in the alphabetncompared to the location of the correct letter.");
}
//this function prompts the player to make a guess and returns that guess
//this function is called from inside the GuessTheLetter( ) function described above
char GetTheGuess(char guess)
{
printf("nWhat is your guess?n");
scanf(" %lf", amp;guess);
return guess;
}
//this function takes two arguments, the guess from the player
//and the solution letter from the file.
//The function returns 1 if the guess matches the solution and returns a 0 if they do not match
//This function also lets the user know if the guess comes alphabetically before or after the answer
int CompareLetters(char solution, char guess)
{
if (solution == guess)
{
return 1;
}
else
{
return 0;
}
}
Комментарии:
1. Сколько символов в файле
letterList.txt
? Всегда ли это будут хотя быnumGames
символы?2. Кроме того, пожалуйста, не начинайте вывод с новой строки, заканчивайте на ней. Это потому, что выходные данные, записываемые
stdout
(то есть то, на чтоprintf
записывается), по умолчанию буферизуются по строкам. Это означает, что новая строка очистит буфер и фактически выполнит запись на консоль. Если у вас есть начальная новая строка, она будет печатать предыдущую строку, а не текущую строку.3.
GetTheGuess()
возвращает значение.playerguess
похоже, это означало сохранение значения. Ваш вызовtolower
inGuessTheLetter
сильно отличается от всех остальных…4. В этом коде большое количество ошибок. Первое, что нужно сделать, это начать использовать прототипы функций — если функция не принимает аргументов, то помещается
void
в список параметров. Если вы сделаете это в своем коде, то вы начнете видеть некоторые сообщения, выдаваемые вашим компилятором, которые укажут вам, где находятся некоторые проблемы. Повысьте уровень предупреждения компилятора и устраните все проблемы, о которых он упоминает, перед запуском вашей программы.
Ответ №1:
Проблема, с которой вы столкнулись, заключается в следующем:
//get a guess from the user by calling the GetTheGuess function
GetTheGuess("playerguess");
//change the guess to lowercase
playerguess = tolower;
Прежде всего GetTheGuess
, вызов функции не соответствует имеющемуся у вас объявлению прототипа. Это также не соответствует фактической реализации функции. И вы на самом деле не догадываетесь. Вы также не вызываете tolower
, вы присваиваете указатель на функцию переменной playerguess
.
Чтобы исправить это, оно должно выглядеть так
//get a guess from the user by calling the GetTheGuess function
playerguess = GetTheGuess(playerguess); // Note: Not passing a string, and use the returned value
//change the guess to lowercase
playerguess = tolower(playerguess); // Note: actually call the tolower function
Вам, конечно, нужно изменить объявление прототипа, чтобы оно соответствовало фактическому определению:
char GetTheGuess(char guess);
Комментарии:
1. В точке вызова даже нет объявления прототипа
2. @M.M
char GetTheGuess();
Надmain
функцией есть функция.3. Это объявление, не являющееся прототипом, поскольку оно имеет пустой список параметров. Отсюда отсутствие ошибки компиляции для вызова
GetTheGuess("playerguess");
4. Я все понимаю и внес изменения, но я сталкиваюсь с этим при попытке запустить его. Я запрашиваю первое предположение, затем запрашивает предположение еще 4 раза, но не запрашивает никаких входных данных. Затем сообщается, что игрок проиграл раунд. Это делает это количество раз, введенное при запросе, сколько игр игрок хочет сыграть. Чтобы ответить на ваш предыдущий вопрос, в letterList.txt досье. Инструктор сказал использовать только десять букв.