Программа перестает работать после ввода символа, и я не знаю, как - PullRequest
4 голосов
/ 22 января 2020

Я делаю игру Палач для школьных требований. После запуска программы она вдруг перестает работать после угадывания слова. Это еще не закончено, так как это не работает, вот что я пытаюсь выполнить sh: Палач - игра в угадывание слов, в которой игроку говорят, сколько букв в слове. Игрок должен найти слово, угадывая буквы по одной за раз. Каждое правильно угаданное письмо добавляется к слову. При каждом неверном предположении часть тела добавляется к изображению повешенного. Игрок допускает 5 ошибок, соответствующих голове палача, телу, левой руке, правой руке, левой ноге. При 6-й ошибке правая нога вытянута, и игра окончена. Если буква повторяется более одного раза, повторяющиеся вхождения всегда считаются ошибкой, даже если первый раз был верным. Как только повешенный закончен, игрок проигрывает игру.

A hangman will look like this after 0 to 6 errors. There should be no whitespace at the end of lines.
    +--+    +--+    +--+    +--+    +--+    +--+    +--+
    |           |   o       |   o       |   o       |   o       |   o       |   o
    |           |           |   |       |  /|       |  /|\      |  /|\      |  /|\
    |\      |\          |\          |\      |\      |\ /        |\ / \

  Your task is to Implement the game of Hangman. For this problem, you need to have an array holding ten different words for the player to choose from. You will be required to use rand() function under <stdlib.h> to choose between those ten words. The chosen word will then be guessed by the player.


    Sample Run.

    H A N G M A N
          +---+
          |
          |
          |\
         ===
    Missed letters: 
    Mystery word: _ _ _
    Guess a letter.
    a

    H A N G M A N
          +---+
          |
          |
          |\
         ===
    Missed letters:
    Mystery word: _ a _
    Guess a letter.
    o






   H A N G M A N
          +---+
          |    o
          |
          |\
         ===
    Missed letters: o
    Mystery word: _ a _
    Guess a letter.
    r

    H A N G M A N
          +---+
          |    o
          |    |
          |\
         ===
    Missed letters: o r
    Mystery word: _ a _
    Guess a letter.
    t

    H A N G M A N
          +---+
          |    o
          |    |
          |\
         ===
    Missed letters: o r
    Mystery word: _ a t
    Guess a letter.
    a

    H A N G M A N
          +---+
          |    o
          |   /|
          |\
         ===
    You have already guessed that letter. Choose again.
    Guess a letter.
    c



    Yes! The secret word is "cat"! You have won!
    Do you want to play again? (yes or no)
    no

вот мой код:

        #include <stdio.h>
            #include <stdlib.h>
            #include <time.h>
            #include <ctype.h>
            #include <string.h>


            char word[3][10] = {"gabb", "mnl", "josh"};
            char parts[6] = {" "};
            char mwords[6] = {" "};
            char blanks[10];
            int life = 0;
            int len;
            char guess;

            void body(int);
            void generate(int);
            int compare(int);

            int main(){
                int res;
                char ans[3];

                int gen;

                srand(time(0));
                gen = rand() % 3;

                for(int i = 0; i < strlen(word[gen]); i++){
                    blanks[i] = '_';
                }

                do{
                    while(life < 6){
                        body(life);
                        generate(gen);
                        res = compare(gen);
                        if(res == 1){
                            printf("Yes! The secret word is \"%s\"! You have won!");
                            break;
                        }
                    }
                    printf("Do you want to play again? (yes or no): ");
                    scanf(" %s", ans);
                }while(strcmp (ans, "yes") == 0);
            }

это печатает тело палача в зависимости от количества жизней

            void body(int n){

                char guess;

                switch(n){
                case 6:
                    parts[5] = '\\';
                case 5:
                    parts[4] = '/';
                case 4:
                    parts[3] = '\\';
                case 3:
                    parts[2] = '/';
                case 2:
                    parts[1] = '|';
                case 1:
                    parts[0] = 'O';
                }

                printf("H A N G M A N\n");
                printf("\t+---+\n");
                printf("\t|   %c\n", parts[0]);
                printf("\t|  %c%c%c\n",parts[2], parts[1], parts[3]);
                printf("\t|\\ %c %c\n", parts[4], parts[5]);
                printf("\t===\n");

            }

это генерирует "область угадывания"

            void generate(int a){

                len = strlen(word[a]);


                printf("Missed words: ");
                    for(int i = 0; i < 6; i++){
                        if(mwords == '\0')
                            break;
                        else
                            printf("%c",mwords[i]);
                    }
                printf("\n");

                printf("Mystery word: ");
                    for(int i = 0;i < len; i++){
                        printf("%c ", blanks[i]);
                    }
                    printf("\n");

Не знаю, в чем здесь проблема

                printf("Guess a letter: ");
                scanf("%c", guess);

                for (int i = 0; i < len; i++){
                    if(word[a][i] == guess)
                        blanks[i] = guess;
            }
                for(int i = 0; i < len;i++){
                    if(word[a][i] == guess)
                        break;
                    else
                        life++;
                }

            }

эта функция сравнивает две строки

            int compare(int comp){
                if(strcmp (word[comp], blanks) == 0)
                    return 0;
                else
                    return 1;
            }

1 Ответ

1 голос
/ 05 февраля 2020

В вашем коде и в логах c вашей программы много ошибок:

char ans[3]; //should be ans[4] to be able to read the word yes for example

функция void body(int n) в теле switch(n), в другом случае вы никогда не используете break для каждого отдельного случая. Решение:

switch(n){
    case 6: parts[5] = '\\'; break;
    case 5: parts[4] = '/';  break;
    case 4: parts[3] = '\\'; break;
    case 3: parts[2] = '/';  break;
    case 2: parts[1] = '|';  break;
    case 1: parts[0] = 'O';  break;
}

другая сложная в вашем коде логика c это:

if(res == 1){
    printf("Yes! The secret word is \"%s\"! You have won!\n");
    break
}

Когда res == 1 слова не совпадают, также в

printf ("Да! Секретное слово \"% s \ "! Вы выиграли! \ N");

сгенерировать предупреждение, поскольку вы не добавляете вейл для %s. Решение:

if(res == 0){
   printf("Yes! The secret word is \"%s\"! You have won!\n", word[gen]);
   break;
}

Но главная проблема в вашем логе кода состоит в том, что вы никогда не ловите письмо от пользователя и не обновляете состояние игры. Решением может быть добавление функции для этого после функции generate(gen) для этой функции, например:

void readLetterUpdateLife(int gen){
    bool find = false;
    char letter;
    scanf(" %s", &letter);
    for(int i=0; i<strlen(word[gen]); ++i){
        if(word[gen][i] == letter){
            blanks[i] = letter;
            find = true;
        }
    }
    if(!find) mwords[life++] = letter;
}

и, наконец, если вы хотите снова заплатить за игру, вам следует сбросить все переменные, которые вы используете для игры, например:

printf("Do you want to play again? (yes or no): ");
scanf(" %s", ans);
if(strcmp (ans, "yes") == 0){
    life = 0;             //Reset the life
    srand(time(0));       //Select a new seed for rand
    gen = rand() % 3;     //Reset the word
    for(int i = 0; i < strlen(word[gen]); i++){
        blanks[i] = '_';  //Clear blanks
    }
    strcpy(mwords,"     "); //Reset wrong letters
    strcpy(parts,"     ");  //Reset parts
}

на основе всех изменений, которые я предлагаю, окончательная программа:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>

char word[3][10] = {"gabb", "mnl", "josh"};
char parts[6] = {"    "};
char mwords[6] = {"    "};
char blanks[10];
int life = 0;
int len;
char guess;

void body(int);
void generate(int);
int compare(int);
void readLetterUpdateLife(int);

int main(){
    int res;
    char ans[4];
    int gen;
    srand(time(0));
    gen = rand() % 3;
    for(int i = 0; i < strlen(word[gen]); i++){
        blanks[i] = '_';
    }
    do{
        while(life < 6){
            body(life);
            generate(gen);
            readLetterUpdateLife(gen);
            res = compare(gen);
            if(res == 0){
                printf("Yes! The secret word is \"%s\"! You have won!\n", word[gen]);
                break;
            }
        }
        printf("Do you want to play again? (yes or no): ");
        scanf(" %s", ans);
        if(strcmp (ans, "yes") == 0){
            life = 0;             //Reset the life
            srand(time(0));       //Select a new seed for rand
            gen = rand() % 3;     //Reset the word
            for(int i = 0; i < strlen(word[gen]); i++){
                blanks[i] = '_';  //Clear blanks
            }
            strcpy(mwords,"     "); //Reset wrong letters
            strcpy(parts,"     ");  //Reset parts
        }
    }while(strcmp (ans, "yes") == 0);
}

void body(int n){
    char guess;
    switch(n){
        case 6: parts[5] = '\\'; break;
        case 5: parts[4] = '/';  break;
        case 4: parts[3] = '\\'; break;
        case 3: parts[2] = '/';  break;
        case 2: parts[1] = '|';  break;
        case 1: parts[0] = 'O';  break;
    }
    printf("H A N G M A N\n");
    printf("\t+---+\n");
    printf("\t|   %c\n", parts[0]);
    printf("\t|  %c%c%c\n",parts[2], parts[1], parts[3]);
    printf("\t|\\ %c %c\n", parts[4], parts[5]);
    printf("\t===\n");
}

void generate(int a){
    len = strlen(word[a]);
    printf("Missed words: ");
    for(int i = 0; i < 6; i++){
        if(mwords[i] == '\0')
            break;
        else
            printf("%c",mwords[i]);
    }
    printf("\n");
    printf("Mystery word: ");
    for(int i = 0;i < len; i++){
        printf("%c ", blanks[i]);
    }
    printf("\n");
}

int compare(int comp){
    if(strcmp (word[comp], blanks) == 0)
        return 0;
    else
        return 1;
}

void readLetterUpdateLife(int gen){
    bool find=false;
    char letter;
    scanf(" %c", &letter);
    for(int i=0; i<strlen(word[gen]); ++i){
        if(word[gen][i] == letter){
            blanks[i] = letter;
            find = true;
        }
    }
    if(!find) mwords[life++] = letter;
}
...