У меня возникла проблема при выполнении моей игры по угадыванию чисел на C. При запуске программы она показывает функцию возврата, когда я помещаю туда элемент char. Может кто-то помочь мне с этим? Также как я могу улучшить свой код, чтобы сделать его работоспособным? Я действительно застрял в этой проблеме.
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
int main()
{
char s, n, q;
int b;
bool (1=true), (0=false);
int secret;
secret = rand();
int guess;
int seed;
srand(seed);
printf("Welcome to the guessing game!\n");
do{
printf("Menu: (s) to start a new game, (n) to set a new range, or (q) to quit:\n");
scanf("%s, %s, %s", s, n, q);
if ((s==1))
{
printf("The secret number is Between 0 AND rand(). Guess\n");
scanf("%s", b);
}
else if ((n ==1))
{
printf("Enter a new MAXIMUM\n");
scanf("%s", rand());
if (( s ==1))
{
printf("The secret number is Between 0 AND rand(). Guess\n");
scanf("%s", b);
printf("The secret number is between 0 and rand() Guess:");
scanf("%s", b);
if (guess = rand()){
printf("Congratulations you won, You took %d guesses!", b);
break;
}
else if (guess > rand())
{
printf("Too High, Guess again:");
}
else if (guess < rand()){
printf("Too Low, Guess Again:");
}
else{
printf("This number out of the number set!");
}
}
}
else{
printf("Unrecognized command");
}
}while(q == 1);
printf("You quited the game");
return 0;
}
И это приведет к scanf("%s", rand());
в UB.
Какой компилятор вы используете?
Что вы ожидаете от пользователя в качестве выбора в вашем меню? Один единственный символ или строка да / нет для каждой опции? scanf("%s, %s, %s", s, n, q);
Вам следует прочитать man-страницу для scanf
и еще раз подумать о строке формата. И о параметрах тоже.
Важный совет: обо всем по порядку! Вам необходимо освоить использование scanf
, прежде чем использовать его в более широком контексте. Только после того, как вы сможете получить пользовательский ввод, вы можете попробовать обрабатывать различные параметры меню. Чтобы проверить правильность ввода, вы можете прочитать Как отлаживать небольшие программы
printf("Menu: (s) to start a new game, (n) to set a new range, or (q) to quit:\n");
scanf("%s, %s, %s", s, n, q);
вам не нужно использовать три переменные s, n, q. вы должны попросить пользователя ввести единственный вариант. либо начать новую игру, либо выйти, либо что-то еще.
во-вторых, rand () каждый раз возвращает случайное число. вы должны где-то хранить случайное число. нравится
rand_num=rand()
также
if (guess = rand())
это неправильный способ сравнения. это должно быть
if (guess==rand_num)
наконец, двоичный поиск - это решение вашей проблемы. пожалуйста, ссылайтесь на это в Интернете
Этот код требует решения множества проблем. Я бы посоветовал приблизиться к процессу написания кода маленькими шагами. Похоже, что вы написали всю программу за один пакет, запустили ее и обнаружили, что она не работает, вместо того, чтобы постепенно добавлять небольшие функции и запускать каждую из них, чтобы убедиться, что она работает, прежде чем переходить к следующему шагу. Невыполнение этого приводит к затруднению отладки программы и непониманию того, как она работает.
Чтобы быть конкретным, попробуйте написать трех- или четырехстрочную программу, которая собирает и распечатывает вводимые пользователем данные. Выход работает так, как вы ожидаете? Вы проверяли его надежность на различных входных данных? Можете ли вы написать его для использования различных типов данных? Если что-то не работает, вы исследовали проблему и решили ее, прежде чем двигаться вперед?
Некоторые области вашей программы для исследования:
bool (1=true), (0=false);
не компилируется и не нужен программе. Если у вас #include <stdbool.h>
, вам не нужно этого делать (вы можете просто написать if (something == true)
).srand()
неправильно вызван или посеян. Запустите его один раз для каждой программы, используя вызов time()
из заголовка, который вы включили, и вызовите rand()
один раз для каждой игры. Используйте оператор %
, чтобы установить выход функции между 0
и max
.guess
со значением, в котором вы ранее сохранили rand()
, вместо того, чтобы вызывать rand()
во время каждого сравнения, что делает логику игры произвольной.%s
не подходит; читать char
s %c
и int
s %d
, передавая соответствующие ссылки на переменные в scanf
. scanf("%s, %s, %s", s, n, q);
собирает для ввода 3 строки, разделенные пробелами, вместо 1 char
, как подсказывает подсказка.s
, и переместите туда свою логику предположения / ответа.Собирая все вместе, вот одна из возможных рабочих версий. Он мог бы лучше использовать функции и реализовать безопасный пользовательский ввод (упражнения для читателя):
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
char menu_choice;
int guess;
int guesses;
int secret;
int max = 100;
srand(time(NULL));
printf("Welcome to the guessing game!\n");
for (;;) {
printf("\nMenu: (s) to start a new game, (n) to set a new range, or (q) to quit: ");
scanf(" %c", &menu_choice);
if (menu_choice == 's') {
guesses = 0;
secret = rand() % max;
for (;;) {
printf("\nThe secret number is between 0 and %d. Enter a guess: ", max);
scanf("%d", &guess);
guesses++;
if (guess == secret) {
printf("\nCongratulations, you won! You guessed %d in %d guesses!\n", secret, guesses);
break;
}
else if (guess > secret) {
printf("Too high! Guess again.");
}
else if (guess < secret) {
printf("Too low! Guess again.");
}
else if (guess >= max) {
puts("Out of range");
}
}
}
else if (menu_choice == 'n') {
printf("\nEnter a new maximum: ");
scanf("%d", &max);
}
else if (menu_choice == 'q') {
puts("\nGoodbye!");
break;
}
else {
puts("\nUnrecognized command.");
}
}
return 0;
}
Пробный прогон:
Welcome to the guessing game!
Menu: (s) to start a new game, (n) to set a new range, or (q) to quit: n
Enter a new maximum: 50
Menu: (s) to start a new game, (n) to set a new range, or (q) to quit: s
The secret number is between 0 and 50. Enter a guess: 25
Too low! Guess again.
The secret number is between 0 and 50. Enter a guess: 37
Too low! Guess again.
The secret number is between 0 and 50. Enter a guess: 43
Too low! Guess again.
The secret number is between 0 and 50. Enter a guess: 47
Congratulations, you won! You guessed 47 in 4 guesses!
Menu: (s) to start a new game, (n) to set a new range, or (q) to quit: q
Goodbye!
Вау, спасибо! Я знаю, что мой код выглядит совершенно мусорной (если это имеет смысл) программой, извините за это, потому что я новичок в этой области, и я пытаюсь понять это, как работает программа и другие вещи, я пытаюсь сделать мой лучший)))
Нет проблем, мы все с чего-то начали. Просто делайте это медленно и постепенно наращивайте.
С вашим
scanf
много чего плохого. Например,scanf("%s", b);
должен бытьscanf("%d", &b);
. Я предлагаю вам сначала прочитать о scanf documementaion.