【问题标题】:Program stops working after typing a character and I don't know how输入字符后程序停止工作,我不知道如何
【发布时间】:2020-05-08 20:54:37
【问题描述】:

我正在为学校的要求制作一个刽子手游戏。运行程序后,猜到一个单词后突然停止工作。它还没有完成,因为它不工作 这就是我想要完成的事情: 刽子手是一个猜词游戏,玩家被告知单词中有多少个字母。玩家必须通过一次猜一个字母来发现这个词。每个正确猜测的字母都会添加到单词中。在每一个错误的猜测中,一个身体部位被添加到一个被绞死的人的照片上。玩家允许犯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;
            }

【问题讨论】:

  • char ans[3]; 应该是 char ans[4]; 如果你要写 "yes" 给它。
  • 阅读this article 了解调试代码的技巧。这些是您在学习编码时需要培养的关键技能。
  • @FiddlingBits 谢谢。程序仍然存在同样的问题
  • 希望您通过@Code-Apprentice 和其他建议解决了您的问题

标签: c windows runtime-error dev-c++


【解决方案1】:

您的代码和程序逻辑中存在许多错误:

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

switch(n) 主体中的函数void body(int 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;
}

您的代码逻辑中的其他困难是:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多