代码实战-皇帝后宫小游戏

#include <stdio.h>
#include <stdlib.h>
#include <string.h>     //支持字符串操作
#define MAX 6           //常量MAX表示贵妃最大的数量
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib, "Winmm.Lib")
int main()
{
    //使用字符数组表示字符串
    char emperorName[50];   //皇帝的名号
    int choice;             //皇帝的选择1-4
    int i,j,k = 0;                  //循环变量
    int count = 5;          //当前未打入冷宫的嫔妃数
    char temp[20];          //用来存放临时字符串的数组
    int searchIndex = -1;   //用来存放超找到元素的下标
    int replace;            //临时整型变量
    //嫔妃的姓名数组
    char names[MAX][20] = {"貂蝉", "杨玉环", "不知火舞", "西施", "白晶晶"};
    //嫔妃的级别数组
    char levelNames[5][10] = {"贵人", "嫔妃", "贵妃", "皇贵妃", "皇后"};
    //用来存放每个妃子的级别,每个数组元素对应每个妃子的级别
    int levels[MAX] = {1, 2, 0, 0, 0, -1};
    //loves数组中的每个元素对应每个人的好感度
    int loves[MAX] = {100, 100, 100, 100, 100, -1};
    PlaySound(TEXT("sounds\\背景音乐.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
    printf("这是一个模拟皇帝管理后宫的游戏。\n");
    printf("游戏开始后你将变成一位拥有五位妃子的皇帝,\n");
    printf("你可以按照提示增添、宠幸、删除、召见妃子,\n");
    printf("每当你做出不同的动作时妃子们的地位和好感度也会有所变化,\n");
    printf("而当你的妃子中任意一位或以上妃子好感度降低到60以下时,\n");
    printf("你的皇帝生涯也就会随之结束,\n");
    printf("如果你能坚持十天,那么恭喜你你将会获得胜利!\n");
    printf("下面开始你的皇帝之行吧。\n");
    printf("请输入当前登记皇帝的名号:");
    scanf("%s", emperorName);   //录入字符串时不需要&
    printf("\n**************************************************\n");
    printf("**                                              **\n");
    printf("**     皇帝【%s】登基,吾皇万岁万岁万万岁       **\n", emperorName);
    printf("**                                              **\n");
    printf("**************************************************\n");
    printf("\n");
        while(k < 10)
        {
            printf("吾皇【%s】登基第%d天!\n", emperorName, k + 1);
            printf("当前您的后宫情况\n");
            printf("**************************************************\n");
            printf("%-12s级别\t好感度\n", "姓名");
            for(i = 0; i < count; i++)
            {
                printf("%-12s%s\t%d\n", names[i], levelNames[levels[i]], loves[i]);
            }
            printf("**************************************************\n");
            printf("\n");
            printf("请问吾皇您要做些什么?\n");
            printf("1、下旨选妃!\t\t(增加功能)\n");
            printf("2、翻牌宠幸!\t\t(修改状态功能)\n");
            printf("3、打入冷宫!\t\t(删除功能)\n");
            printf("4、召见爱妃!\t\t(平衡功能)\n");
            printf("陛下请选择:");
            scanf("%d", &choice);
            switch(choice)
            {
            case 1:
                //选妃
                //1、增加数组元素(names\loves\levels)
                //2、增加前判断有没有足够的空间
                PlaySound(TEXT("sounds\\选妃.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
                if(count < MAX)//如果现存妃子数小于系统允许最大值
                {
                    printf("请输入娘娘的名讳:");
                    scanf("%s", names[count]);
                    //将第count个元素的状态初始化
                    levels[count] = 0;       //等级初始化
                    loves[count] = 100;     //好感度初始化
                    for(i = 0; i < count; i++)
                    {
                        loves[i] -= 10;
                    }
                    count++;                 //添加完元素后增加计数器
                }
                else
                {
                        printf("陛下要保重龙体呀,后宫已经人满为患了!\n添加失败!\n");
                }
                break;
            case 2:
                //宠幸
                //1、找到要宠幸的妃子
                //2、修改这个妃子的状态(好感度+10、级别升一级若最高级则不升级)
                //3、修改其他妃子的状态(好感度-10)
                PlaySound(TEXT("sounds\\翻牌.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
                printf("陛下,请输入要宠幸娘娘的名讳:");
                scanf("%s", temp);
                while(1)
                {
                    for(i = 0; i < count; i++)
                    {
                        if(strcmp(temp, names[i]) == 0)
                        {
                            //字符串的查找strcmp,需要引入<string.h>头文件
                            //strcmp(char1, char2) 0-两个字符串相等 1-前一个大于后一个 -1-前一个小于后一个
                            for(i = 0; i < count; i++)
                            {
                                if(strcmp(temp, names[i]) == 0)  //筛选出这个妃子
                                {
                                loves[i] += 10;
                                //注意级别不要超过最大级
                                levels[i] = levels[i] >= 4 ? 4 : levels[i] + 1;     //三元运算符
                                }
                                else
                                {
                                loves[i] -= 10;
                                }
                            }
                        }
                    }
                    if(i == count)
                    {
                        printf("陛下,这个娘娘不存在,请再输入一次:");
                        scanf("%s", temp);
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                break;
            case 3:
                //删除
                //1、查找
                //2、从要删除的那个开始后面的值付给前面的值
                //3、总数减一
                //4、修改其他妃子的状态
                PlaySound(TEXT("sounds\\冷宫.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
                printf("陛下,请输入要打入冷宫的妃子的名讳:");
                scanf("%s", temp);
                for(i = 0; i < count; i++)
                {
                    if(strcmp(temp, names[i]) == 0) //验证输入的妃子姓名是否存在
                    {
                        //记录下标
                        searchIndex = i;
                        break;
                    }
                }
                if(-1 == searchIndex)   //如果searchIndex仍然为初值,表示没找到
                {
                    printf("\n**************************************************\n");
                    printf("虚惊一场,无人打入冷宫,该吃吃该喝喝。\n");
                    printf("**************************************************\n");
                }
                else
                {
                    for(i = searchIndex; i < count -1; i++)
                    {
                        // names[i] = names[i + 1];因为是字符串,C语言不支持数组直接赋值
                        //需要使用strcpy函数实现数组的复制
                        strcpy(names[i], names[i + 1]);
                        loves[i] = loves[i + 1];
                        levels[i] = levels[i + 1];
                    }
                    count--;
                    for(i = 0; i < count; i++)
                    {
                        loves[i] += 10;
                    }
                }
                break;
            case 4:
                //召见
                //1、查找要召见的妃子
                //2、找到后增加好感度
                PlaySound(TEXT("sounds\\一笑倾城.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
                printf("陛下,请输入您要召见的娘娘的名讳:");
                scanf("%s", temp);
                while(1)
                {
                    for(i = 0; i < count; i++)              //判断输入的娘娘是不是存在
                    {
                        if(strcmp(temp, names[i]) == 0)     //如果存在
                        {
                            for(i = 0; i < count; i++)      //找到那个娘娘增加好感度和等级
                            {
                                if(strcmp(temp, names[i]) == 0)
                                {
                                    loves[i] += 10;
                                    levels[i] += 1;
                                }
                            }
                        }
                    }
                    if(i == count)                          //如果不存在,重新输入
                    {
                        printf("陛下,这个娘娘不存在,请再输入一次:");
                        scanf("%s", temp);
                        continue;
                    }
                    else
                    {
                        break;
                    }
                }
                break;
            default:
                printf("君无戏言,陛下请再次确认!\n");
            }
        for(i = 0; i < count; i++)  //判断是否存在妃子好感度小于60
        {
            if(loves[i] < 60)
            {
                printf("后宫暴动,皇帝%s昏庸无能被迫下台!\n", emperorName);
                    //最后打印所有妃子状态前,以级别进行排序,使用冒泡排序
                for(i = 0; i < count - 1; i++)          //外层控制轮数
                {
                    for(j = 0; j < count - i - 1; j++)  //内存循环控制
                    {
                        //从大到小,
                        if(levels[j] < levels[j + 1])
                        {
                        //需要交换姓名、级别和好感度
                        replace = levels[j];
                        levels[j] = levels[j +1];
                        levels[j + 1] = replace;
                        replace = loves[j];
                        loves[j] = loves[j + 1];
                        loves[j +1] = replace;
                        //注意字符串的交换
                        strcpy(temp, names[j]);
                        strcpy(names[j], names[j + 1]);
                        strcpy(names[j + 1], temp);
                        }
                    }
                }
                printf("\n**************************************************\n");
                printf("游戏结束,皇帝%s共执政%d天\n", emperorName, k+1);
                printf("%-12s级别\t好感度\n", "姓名");
                for(i = 0; i < count; i++)
                {
                    printf("%-12s%s\t%d\n", names[i], levelNames[levels[i]], loves[i]);
                }
                printf("**************************************************\n");
                exit(0);
            }
        }
        k++;
    }
    //游戏结束
    for(i = 0; i < count - 1; i++)          //外层控制轮数
    {
        for(j = 0; j < count - i - 1; j++)  //内存循环控制
        {
            //从大到小,
            if(levels[j] < levels[j + 1])
            {
                //需要交换姓名、级别和好感度
                replace = levels[j];
                levels[j] = levels[j +1];
                levels[j + 1] = replace;
                replace = loves[j];
                loves[j] = loves[j + 1];
                loves[j +1] = replace;
                //注意字符串的交换
                strcpy(temp, names[j]);
                strcpy(names[j], names[j + 1]);
                strcpy(names[j + 1], temp);
            }
        }
    }
    printf("\n**************************************************\n");
    printf("恭喜您获得胜利,皇帝%s共执政%d天\n", emperorName, k+1);
    printf("%-12s级别\t好感度\n", "姓名");
    for(i = 0; i < count; i++)
    {
        printf("%-12s%s\t%d\n", names[i], levelNames[levels[i]], loves[i]);
    }
    printf("**************************************************\n");
return 0;
}

用时两小时,跟随教学视频完成,已经简单的修复了基础bug,但代码仍然不完整,有待改善。