老九C语言41课项目实战-皇帝的后宫

Tips:
1、二维数组里面高维可以不要,低维需要保留。

2、if(strcmp(tempName,names[i]) == 0) 需要引入头文件 #include <string.h> //支持字符串操作
0表示两个字符串相等,1,前一个大于后一个,-1,前一个小于后一个
abc和bca字符串谁大呢?
其实判断的是ascll码,比较第一个字符,一样的话再比较第二个字符
97/98
结果:-1

3、条件运算符 ?:

是C语言中的唯一一个三目运算符,
<表达式1>?<表达式2>:<表达式3>
表达式1为真则执行表达式2
表达式1为假则执行表达式3

4、C语言中不支持数组的直接赋值,我们需要使用strcpy函数实现数组的赋值
5、音乐文件放在 bin\Debug\sounds 下

- 程序功能(待完善): 1、选妃 2、宠妃 3、打冷宫 4、小树林 5、按级别排序输出(冒泡排序)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h> //支持字符串操作
    
    #include <windows.h>
    #include <mmsystem.h>
    #pragma comment(lib, "Winmm.lib")
    
    #define MAX 6  //常量max表示系统要求的最大妃子数量
    int main()
    {
        int i,j,temp;             //循环变量和临时整型变量
        int count = 5;          //当前未打入冷宫的嫔妃个数(因为数组长度会变,所以定义一个count)
        int choice;            //皇帝的选择1-4之间
        int searchIndex = -1;  //用来存放查找到元素的下标
        //使用字符数组表示字符串
        char emperorName[50];   //皇帝的名号
        char tempName[20];     //用于存放临时字符串的字符数组
        char names[MAX][20] = {"貂蝉","杨玉环","不知火舞","西施","郭德纲"};
        //嫔妃的级别数组
        char levelNames[5][10] = {"贵人","嫔妃","贵妃","皇贵妃","皇后"};
        //用来存放每位妃子的级别,每个数组元素对应每个妃子的当前级别
        int levels[MAX] = {1,2,0,4,0,-1};//不固定长度的数组定义
        int loves[MAX] = {100,100,100,100,100,-1};//初始i情况,每个人的好感度都是100
    
        PlaySound(TEXT("sounds\\背景音乐.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
        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");
        scanf("%s",emperorName);//实际上是输入了一个字符串(字符数组),因为后面是字符数组,所以不用取地址符&
        printf("当前皇帝是%s,万岁万岁万万岁!\n",emperorName);
    
     while(1) //循环游戏
     {
        printf("1、皇帝选妃:\t\t (增加功能)\n");
        printf("2、翻牌宠幸:\t\t(修改状态功能)\n");
        printf("3、打入冷宫!\t\t(删除功能)\n");
        printf("4、单独召见爱妃。\n");
        printf("陛下请选择:\n");
        scanf("%d",&choice);
        switch(choice)
        {
    case 1://皇帝下旨选妃:\t\t(增加功能)\n");
        PlaySound(TEXT("sounds\\选妃.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
        //1、增加前需要判断数组有没有空间
        //2、增加数组元素(names、loves、levels)
        if(count < MAX)//如果当前的妃子数量小于系统规定的妃子总数
        {
            //执行添加操作
            printf("请输入娘娘的名讳:\n");
            scanf("%s",names[count]); //不能有取地址符
            //将第count个元素的状态初始化
            levels[count] = 0; //初始级别为0
            loves[count] = 100; //初始好感度为100
            count++;          //总人数加一
    
        }
        else
        {
            printf("陛下要注意龙体啊!后宫已人满为患!\n");
        }
    
    
        break; //switch 必须有break ,否则会接着执行下一个case
    case 2:
        printf("2、翻牌宠幸: \t\t(修改状态功能)\n");
        PlaySound(TEXT("sounds\\翻牌.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
        //1、找到要宠幸妃子的下标
        //2、修改这个妃子的状态,好感度+10,级别升1级,如果最高级就不再升级
        //3、修改其他妃子的状态,由于羡慕嫉妒恨,其他妃子好感度-10
        printf("陛下,请输入今天翻牌娘年的名讳:\n");
        scanf("%s",tempName);
        //字符串的查找strcmp,需要引入<string.h>
        for(i=0; i<count; i++)
        {
                if(strcmp(tempName,names[i]) == 0)//如果输入的姓名刚好等于数组中的某个姓名
                {
                    loves[i] += 10;
                    //级别不能超过五级(0-4之间)
                    levels[i] = levels[i] >=4 ? 4: levels[i] +1;
    
                }
                else
                {
                    loves[i] -= 10;
                }
        }
        break;
    case 3:
        printf("3、打入冷宫!\t\t(删除功能)\n");
        PlaySound(TEXT("sounds\\冷宫.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
        //1、查找
        //2、后面一个赋给前面一个元素
        //3、总数--
        //4、修改其他妃子的状态,好感度+20
        printf("陛下,请输入打入冷宫的姓名:\n");
        scanf("%s",tempName);
        //循环查找
        for(i = 0; i < count; i++)
        {
            if(strcmp(tempName, names[i]) == 0)
            {
               //记录下要查找的下标
               searchIndex = i;
               break;
            }
        }
        if(-1 == searchIndex)//如果earchIndex的值为处置-1,表示没有找到
        {
            printf("虚惊一场,无人打入冷宫,该吃吃该喝喝!\n");
        }
        else
        {
            for(i = searchIndex; i< count -1; i++)//后面一个赋给前面一个
            {
                strcpy(names[i], names[i +1]);//C语言中不支持数组的直接赋值(把某个数组给某个数组是不支持的),我们需要使用strcpy函数实现数组的赋值
                loves[i] = loves[i +1];
                levels[i] = levels[i +1];
            }
            count--;
        }
        break;
    case 4://单独召见爱妃
        PlaySound(TEXT("sounds\\一笑倾城.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
        //1、查找
        //2、增加好赶赴即可
        //3、可以使用数组设计诗歌,使用随机数字的方式,表现皇帝的文采
        break;
    default:
        printf("君无戏言,陛下请再次确认!\n");
        }
        //最后打印所有妃子前,按照级别进行排序,使用冒泡排序
        for(i = 0; i< count-1; i++)
        {
            for(j = 0; j< count -i -1; j++)
            {
                if(levels[j] < levels[j +1])
                {
                    //需要交换姓名、级别、好感度
                    temp = levels[j];
                    levels[j] = levels[j + 1];
                    levels[j + 1] =temp;
                    temp = loves[j];
                    loves[j] = loves[j +1];
                    loves[j + 1] =temp;
                    //注意字符串的交换
                    strcpy(tempName, names[j]);
                    strcpy(names[j], names[j + 1]);
                    strcpy(names[j + 1], tempName);
                }
            }
        }
    
        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");
    
     } //while(1)循环游戏
        return 0;
    }

运行结果

猜你喜欢

转载自blog.csdn.net/cxd15194119481/article/details/84893600