苏雨辙 2021-11-26 16:54 采纳率: 66.7%
浏览 27
已结题

编辑了一个刽子手小游戏的c程序,但是好像运行有点问题,游戏没有办法胜利

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


int main() {

    char WORDS[10][20] = { "Apple","Banana","Cucumber","Dumpling","Eggplant","Fish","Garlic","Ham","Icecream","Jellies" };
    //这里运用到了二维数组的知识,对题库进行一个存储。

    int num;
    printf("Enter the number of words to guess (<=10):");
    scanf("%d", &num);
    int count[20];
    int i;

    srand(time(NULL));
    //srand函数是一个时间函数,这里相当于设置了一个随机时间的种子,目的是为了后面的随机选词,不会的话可以搜一下这个关键词

    for (i = 0; i < num; i++)
    {
        count[i] = strlen(WORDS[i]);
        printf("%s\n", WORDS[i]);
    }
    printf("\n");
    //这里的count计算了每个单词的长度,而这一块是把前面的二维数组题库输出作为题目提示。


    char again = 'y';
    //设置一个循环条件,可以让玩家不断的玩
    while (again == 'y') {

        int x = rand() % (num);
        int life = 5;
        char guess[20];

        printf("  +------------------+\n");
        printf("  |                  |\n");
        printf("  |                  |\n");
        for (i = 0; i < 10; i++)
        {
            printf("  |\n");
        }
        printf("================================\n");
        //画了一个绞刑架,个人感觉,简单的图形可以直接printf输出,for循环反而会使问题复杂化


        printf("Word:");

        char xiao[20];
        for (i = 0; i < count[x]; i++)
        {
            xiao[i] = '_';
        }


        for (i = 0; i < count[x]; i++)
        {
            printf(" %c", xiao[i]);
        }
        printf("\n\n");
        //根据单词长度画小杠杠


        while (life > 0)
        {
            printf("Guess (%d lives): ", life);
            scanf("%s", guess);
            printf("\n");

            if (strlen(guess) != 1)
                //当玩家已经猜出单词的时候
            {
                if (strlen(guess) == strlen(WORDS[x]))
                {
                    int judge = 0;
                    for (i = 0; i < count[x]; i++)
                    {
                        if (guess[i] != WORDS[x][i])
                        {
                            break;
                        }
                        judge++;
                    }
                    if (judge == count[x])
                    {
                        printf("Correct!\n");
                        printf("Do you want to play again (y/n)? ");
                        scanf(" %c", &again);
                        break;
                    }
                }
                printf("Word:");
                for (i = 0; i < count[x]; i++)
                {
                    printf(" %c", xiao[i]);
                }
                printf("\n\n");
                life--;
            }
            else
                //当玩家要一个一个猜的时候
            {

                printf("Word:");
                if (strstr(WORDS[x], guess) != NULL)
                    //strstr函数会判断,后的字符串有没有与,前的字符串相同的部分,如果没有就会返回null
                {
                    for (i = 0; i < count[x]; i++)
                    {
                        if (guess[0] == (char)WORDS[x][i])
                        {
                            xiao[i] = guess[0];
                        }
                    }
                    int correct = 0;
                    for (i = 0; i < count[x]; i++)
                    {
                        if (xiao[i] != '_')
                        {
                            correct++;
                            continue;
                        }
                        break;
                    }
                    for (i = 0; i < count[x]; i++)
                    {
                        printf(" %c", xiao[i]);
                    }
                    printf("\n\n");
                    if (correct == count[x]) {
                        printf("Correct!\n");
                        printf("Do you want to play again? ");
                        scanf("%c", &again);
                        break;
                    }
                }
                else
                {
                    for (i = 0; i < count[x]; i++)
                    {
                        printf(" %c", xiao[i]);
                    }
                    printf("\n\n");
                }
                life--;

                //下面是一步一步的画小人
                if (life == 4)
                {
                    printf("  +------------------+\n");
                    printf("  |                  |\n");
                    printf("  |                  |\n");
                    printf("  |                  O\n");
                    for (i = 0; i < 9; i++)
                    {
                        printf("  |\n");
                    }
                    printf("================================\n");
                }

                if (life == 3)
                {
                    printf("  +------------------+\n");
                    printf("  |                  |\n");
                    printf("  |                  |\n");
                    printf("  |                  O\n");
                    printf("  |                  |\n");
                    for (i = 0; i < 8; i++)
                    {
                        printf("  |\n");
                    }
                    printf("================================\n");
                }

                if (life == 2)
                {
                    printf("  +------------------+\n");
                    printf("  |                  |\n");
                    printf("  |                  |\n");
                    printf("  |                  O\n");
                    printf("  |                 /|\n");
                    for (i = 0; i < 8; i++)
                    {
                        printf("  |\n");
                    }
                    printf("================================\n");
                }

                if (life == 1)
                {
                    printf("  +------------------+\n");
                    printf("  |                  |\n");
                    printf("  |                  |\n");
                    printf("  |                  O\n");
                    printf("  |                 /|\\ \n");
                    for (i = 0; i < 8; i++)
                    {
                        printf("  |\n");
                    }
                    printf("================================\n");
                }
            }
        }
        if (life == 0) {
            printf("  +------------------+\n");
            printf("  |                  |\n");
            printf("  |                  |\n");
            printf("  |                  O\n");
            printf("  |                 /|\\ \n");
            printf("  |                 / \\ \n");
            for (i = 0; i < 7; i++)
            {
                printf("  |\n");
            }
            printf("================================\n");
        }
        printf("You have no more lives!\n");
        printf("Do you want to play again (y/n)? ");
        scanf(" %c", &again);

    }

    exit(1);
}


  • 写回答

1条回答 默认 最新

  • zhenmu 2021-11-26 17:48
    关注

    想知道 哪儿出问题
    方法一、断点调试, linux gdb (编译时 -g 确保生成有调试信息)或者 windows vs
    比如 gdb a.out
    之后 先设断点位置 (比如90行 和 135行):
    b 90
    b 135
    运行:
    r
    断点停下来后,可以用p 打印查看变量值
    p life
    n 是单步执行下一行, c是继续执行程序。

    方法二、就是每处 分支 或者关键点 输出调试文字,把变量什么打印出来 看 是什么流向。

    你的问题 估计就是 if else 括号范围有点问题, 自己从逻辑上分段,2种玩法分支各自放一起, 失败的操作都放一起, 打印的放一起。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月5日
  • 已采纳回答 11月27日
  • 创建了问题 11月26日

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名