Вопрос или проблема
Я пытаюсь сделать так, чтобы, когда пользователь вводит что-то вроде “картошка”, программа сообщала, что это неправильно, и снова спрашивала его о выборе, но когда он говорит “камень”, а камень должен быть одним из правильных выборов, программа все равно снова спрашивает его о выборе. Я хочу четкий ответ на то, что не так с моим кодом, чтобы мой код наконец заработал.
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
int main(){
char choice[25];
printf("***********************\n");
printf("Добро пожаловать в камень, ножницы, бумага!!\n");
printf("***********************\n");
while(strcmp(choice, "ROCK") != 0 ||strcmp(choice, "SCISSORS") != 0||strcmp(choice, "PAPER") != 0){
printf("Выберите : [камень/бумага/ножницы]\n");
scanf("%s", &choice);
strupr(choice);
if(strcmp(choice, "ROCK") == 0 ||strcmp(choice, "SCISSORS") == 0||strcmp(choice, "PAPER") == 0){
printf("Вы выбрали %s\n", choice);
}
else{
printf("Недопустимый выбор!!\n");
}
}
Это не совсем игра, я не смог продвинуться в этом проекте из-за этой проблемы, и пожалуйста, не переводите это не в ту тему, потому что это явно не не в тему. Спасибо 🙂
Условие теста цикла while неверно:
while(strcmp(choice, "ROCK") != 0 ||strcmp(choice, "SCISSORS") != 0||strcmp(choice, "PAPER") != 0){
Это будет продолжаться в цикле, если оно не совпадает хотя бы с одной из трех строк, т.е. цикл продолжится независимо от того, какое значение он имеет. Было бы более разумно использовать:
while(strcmp(choice, "ROCK") != 0 && strcmp(choice, "SCISSORS") != 0 && strcmp(choice, "PAPER") != 0){
Это будет продолжать цикл до тех пор, пока оно не совпадает с любой из трех строк.
Но это все еще не совсем правильно, так как изначально choice
не инициализировано, когда цикл впервые начинается. Оно не должно проверяться, пока пользователь не введет значение. Более того, цикл уже проверяет допустимый ввод, поэтому вам действительно не нужен предварительно проверенный цикл. Просто сделайте:
for (;;) {
printf("Выберите : [камень/бумага/ножницы]\n");
scanf("%s", &choice);
strupr(choice);
if (strcmp(choice, "ROCK") == 0 || strcmp(choice, "SCISSORS") == 0 || strcmp(choice, "PAPER") == 0) {
printf("Вы выбрали %s\n", choice);
break;
}
else {
printf("Недопустимый выбор!!\n");
}
}
for (;;)
— это просто бесконечный цикл. Когда выбирается допустимый вариант, он явно прерывает цикл, выполняя оператор break
. Вот все, что вам нужно.
Ответ или решение
Ваша проблема заключается в неправильной логике проверки пользовательского ввода в цикле. Рассмотрим ваш код и основные недостатки, которые мешают корректной работе игры «Камень, ножницы, бумага».
Основные ошибки в вашем коде:
-
Неправильные условные операторы в while-цикл:
Исходная проверка в вашемwhile
условии:while(strcmp(choice, "ROCK") != 0 || strcmp(choice, "SCISSORS") != 0 || strcmp(choice, "PAPER") != 0)
будет продолжать цикл, если хотя бы одно из условий истинно. То есть, если
choice
не равен "ROCK", цикл не завершится, даже еслиchoice
равно "SCISSORS". Правильная логика для проверки всех вариантов ввода должна использовать оператор логического И (&&
), а не ИЛИ (||
):while(strcmp(choice, "ROCK") != 0 && strcmp(choice, "SCISSORS") != 0 && strcmp(choice, "PAPER") != 0)
-
Начальное состояние переменной choice:
Переменнаяchoice
не инициализирована при первом запуске цикла. Невозможно сравнивать неинициализированные строки, это может привести к неопределенному поведению программы. -
Неэффективная структура программы:
Вместо использования цикла с проверкой ввода до его обработки лучше всего воспользоваться бесконечным циклом с условием выхода. В таком случае, когда пользователь введет корректный вариант, можно использовать операторbreak
для завершения цикла.
Пример исправленного кода:
Вот обновленный и исправленный вариант вашей программы:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main() {
char choice[25];
printf("***********************\n");
printf("Добро пожаловать в игру Камень, Ножницы, Бумага!\n");
printf("***********************\n");
while (1) { // Бесконечный цикл
printf("Выберите : [камень/бумага/ножницы]\n");
scanf("%s", choice);
strupr(choice); // Убедитесь, что у вас есть stprl() на вашей системе
if (strcmp(choice, "ROCK") == 0 || strcmp(choice, "SCISSORS") == 0 || strcmp(choice, "PAPER") == 0) {
printf("Вы выбрали %s\n", choice);
break; // Завершение цикла при корректном вводе
} else {
printf("Некорректный выбор!! Попробуйте еще раз.\n");
}
}
return 0;
}
Заключение:
После внесения этих изменений, программа будет корректно запрашивать пользователя, пока он не введет допустимое значение, а также будет правильно обрабатывать ввода. Убедитесь, что функция strupr()
поддерживается вашей средой, так как она не является стандартной в некоторых компиляторах C. Возможно, вам придется реализовать свою собственную функцию для преобразования строки в верхний регистр, если это необходимо.
Если у вас возникнут дополнительные вопросы по коду или вы захотите интегрировать дополнительные функции, не стесняйтесь обращаться за помощью. Успехов в разработке вашей игры «Камень, ножницы, бумага»!