Я знаю, что это клише, но это действительно так.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int chances = 5; //You can change your chances in there
char sentence[20]; //You can change your sentence's lenght. BUT İF U CHANGE THAT u have change indicator'S lenght
char indicator[20]; //İndicator
char character; //Variable for your guess
int woncheck = 0;
void status(); //function
void check(); //function
void main() {
printf("Wellcome to my hangman game");
printf("Player 1 please enter your sentence [Max 20 character] ==> ");
gets(sentence); //Get sentence
while (strlen(sentence)>=20) //Checking for less than 20 char
{
printf("Please enter max 20 character ==> ");
gets(sentence);
}
for (int i = 0; i < strlen(sentence); i++) { // The indicator takes _ as long as the sentence
if (sentence[i] != ' ') {
indicator[i] = '_';
} else {
indicator[i] = ' ';
}
}
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); //Screen was skipped
status(); //Shows sentence's lenght before all of all
for (int j = 0; j < chances ; j++) //We gave [changes] rights, so we create loops for a [changes] times
{
woncheck = 1; //We need to check the game
for (int k = 0; k < strlen(sentence); k++) {
if (indicator[k] == '_') { // if any indicator letter's is not equal to '_' , it is mean, we not won the game yet
woncheck = 0;
break;
}
}
if (woncheck == 1) {
printf("Player 1 won the game\n");
break;
}
printf("Player 2 please enter 1 character ==> "); //Let's gets letter
scanf(" %c",&character);
printf("\n");
chances--; // -1 Chance
check(); //Checking
status(); //Now where we are in status
if (chances == 0) {
printf("Player 1 lost the game\n");
break;
}
}
}
void status() {
for (int i = 0; i < strlen(sentence); i++) //As long as the sentence...
{
/* if (sentence[i]==' ') //İf yours sentences have space, we give space
{
printf(" ");
}
*/ printf("%c ",indicator[i]); //We print the indicator equal to the length of the sentence
}
printf("You have %d chances left. \n \n",chances);
}
void check() {
for (int i = 0; i < strlen(sentence); i++)
{
if (toupper(sentence[i]) == toupper(character)) //if any sentece's letter equal to yours letter indicator gets your letter
{
indicator[i] = character;
}
}
}
Это обычная игра с палачом.
Но если я попытаюсь ввести 3. букву, программа закроется
Я пробовал этот код в 2 IDE + онлайн-компиляторе, но все время думаю, что получаю логическую ошибку.
Я прошу вас попробовать это на своем компьютере и посмотреть, работает ли оно.
Если он не работает или вы нашли ошибку, буду признателен, если вы добавите ее в комментарий.
Заранее спасибо...
strlen(sentence)>=20
никогда не может быть правдой. sentence
— это char[20]
, поэтому длина может быть не более 19.
Не используйте глобальные переменные. Если эта переменная нужна другой функции, передайте ее в качестве аргумента.
Также старайтесь использовать одинаковые отступы и форматирование в целом. Это значительно облегчит чтение и выполнение кода.
Учитывая char sentence[20]
, если while (strlen(sentence)>=20)
когда-либо истинно, ваш код уже ужасно сломан.
но если я использую scanf()
, я не могу использовать пробел или 2 предложения
Используйте fgets()
вместо gets()
.
И у вас получится пять for
петель. Кто из них доставляет вам проблемы? Пожалуйста, попробуйте создать минимальный воспроизводимый пример , чтобы показать нам. Также попробуйте использовать отладчик для пошагового выполнения кода, отслеживая переменные и их значения, чтобы увидеть, что происходит на самом деле.
Моя проблема в том, что когда я пытаюсь угадать букву в третий раз, программа закрывается.
вы можете попробовать этот код в онлайн-компиляторе
Среди других предостережений по стилю: void main() { ... }
неправильно. Учитывая это, gets
и все глобальные переменные, было бы неплохо почитать хорошую современную книгу.
``` for (int j = 0; j < chances ; j++)``` там, если я изменю ``` шансов ```, частичные циклы сработают хорошо.
@Крис, мне всегда нужно использовать int main?.
Избегайте использования магических чисел, таких как 20, которые вам придется повторять на протяжении всего кода. Это чревато ошибками, особенно если вы решите изменить ограничение длины строки. Вместо этого используйте именованную константу. Обратите внимание, что ограничение на количество символов составляет не 20, а 19, поскольку вам нужен один байт памяти для нулевого признака конца строки.
@BeratZengin int main() { ... }
или int main(void) { ... }
, если вам не нужен доступ к аргументам командной строки. Последний из этих двух, если вы хотите иметь возможность без проблем компилировать -Wpedantic
или его эквивалент.
Помимо проблем, на которые указывают другие, ваш цикл догадок for (int j = 0; j < chances ; j++)
срабатывает раньше, потому что вы уменьшаете chances
И увеличиваете j
.
@Chris, я не жду возврата в main, поэтому я не хотел использовать ´´´ int main ´´´, также спасибо, мистер Крис.
@PaulLynch LOL, вы правы, мистер Пол. Как я этого не увидел?
@Berat Попробуйте while (chances)
вместо цикла for (int j = 0; j < chances ; j++)
.
Я обнаружил, что проблема была между «5» и «шансами», но я не до конца ее понимал. я благодарен за твой ответ
Игнорируя другие проблемы с вашим кодом и обращаясь только к заявленной проблеме преждевременного завершения игрового цикла, я вижу, что вы подсчитываете «шансы» двумя противоречивыми способами.
for (int j = 0; j < chances ; j++)
{
// (omitted)
chances--; // -1 Chance
check(); //Checking
status(); //Now where we are in status
if (chances == 0) {
printf("Player 1 lost the game\n");
break;
}
}
Вы начинаете с переменной chances
, которая инициализируется значением 5
, и создаете цикл for, используя j
для повторения chances
раз.
Однако в этом цикле вы также уменьшаете chances
на 1 каждый раз, прежде чем продолжить цикл. Это означает, что ваши переменные состояния при тестировании
chances
равно 4chances
равно 3chances
равно 2, и теперь это условие продолжения не выполняется.Вам следует выбрать только один подход. Либо отслеживайте ход игры только с помощью j
и не изменяйте chances
, либо используйте только chances
следующим образом:
while (chances > 0)
{
// (omitted)
chances--; // -1 Chance
check(); //Checking
status(); //Now where we are in status
}
if (woncheck) {
printf("Player 1 won the game\n");
} else {
printf("Player 1 lost the game\n");
}
Вы правы, мистер @paddy, я видел это 2 минуты назад, спасибо за ответ, ценю это
Несмотря на то, что вам ответили, и ответ выбран. Я не могу удержаться от ответа на комментарий, который вы вставили в свой код:
int chances = 5; //You can change your chances in there
char sentence[20]; //You can change your sentence's lenght. BUT İF U CHANGE THAT u have change indicator'S lenght
char indicator[20]; //İndicator
char character; //Variable for your guess
ты говоришь
НО ЕСЛИ ВЫ ЭТО ИЗМЕНИТЕ, вам придется изменить и длину индикатора. (извините за разное написание)
Для этого вам не нужно добавлять комментарий как таковой.... просто
#define MAX_INDICATOR_LENGTH 20 /* you can change it as you wish, no compromises */
int chances = 5; //You can change your chances in there
char sentence[MAX_INDICATOR_LENGTH];
char indicator[MAX_INDICATOR_LENGTH]; //İndicator
char character; //Variable for your guess
:)
Немедленно прекратите использовать
gets()
. Это опасная функция, и она была удалена из языка.