二维数组练手小程序--后宫管理

前言

这个程序的知识点是二维数组、循环、各种基础的函数,内容和创意都来源于网易云课堂→老九零基础学编程 的教学课程(https://study.163.com/course/courseLearn.htm?courseId=1003425004&from=study#/learn/video?lessonId=1003931092&courseId=1003425004 ),转载创意若有冒犯了,请告知我,我会删除。

内容

入门C语言一个月,用VS2017做的,程序中注释得很详细。

缺点:
1、没有加入对输入的检查判断。
2、没有结构化编程,都弄到一个switch里了。

另外,如果有人知道如何在VS2017中对程序添加背景音乐的,可不可以跟我说一下如何操作,谢谢了。

#include <stdio.h>
#include<stdlib.h>
#include<string.h>		//strcmp函数(对比函数)  strcpy函数(字符串赋值函数)
#define MAX 6		//系统所能容纳的最大的嫔妃数量

int main()
{	
	char emperorName[20];		//皇帝的名字
	int choice;			//皇帝的选择,1-4之间
	int count = 5;		//当未被打入冷宫的嫔妃数量
	int temporalNumber=0;		//临时的变量
	int searchIndex = -1;		//用来存放寻找到的下标
	char temporalName[20];		//用来存放临时名字的变量
	int kill=0;			//想要弑君的妃子数

	//(用数组表示)嫔妃的信息1.姓名	2.级别	3.好感度
	//姓名数组
	char names[MAX][20] = {"周立波","貂蝉","西施","杨玉环","葛优"};		//names[6][10],表示至多可以有6个嫔妃,每个嫔妃的姓名最多占20个字符
	//用数组定义嫔妃级别的类型
	char levelsName[5][10] = {"贵人","嫔妃","贵妃","皇贵妃","皇后"};		//存放5个级别,每个级别的大小最多占10个字符
	//存放实际中每位嫔妃对应的级别,每个数组元素对应每个妃子的当前级别
	int levels[MAX] = {0,2,1,1,1,-1};
	//好感度数组
	int loves[MAX] = {100,100,100,100,100,-1};

	printf("新帝登基,请输入您的名号:");
	scanf_s("%s",emperorName,20);			//录入字符串时不需要使用&符号
	printf("群臣:\"%s皇帝登基,皇上万岁万岁万万岁!\"\n\n",emperorName);		
	printf("请陛下处理今天的事务:\n");

	//测试代码:查看当前嫔妃的状态
	printf("\n**********当前嫔妃的状态**********\n");
	printf("姓名		级别	好感度\n");
	for (size_t i = 0; i < count; i++)
		printf("%s		%s	%d	\n", names[i], levelsName[levels[i]], loves[i]);
	printf("**********************************\n\n");
	
for (size_t days = 0; days < 10; days++)			//大循环,一共十天
{

	printf("**********第%d天**********\n",days+1);
	printf("*****************************\n");
	printf("	皇帝的事务菜单\n");
	printf("	1.下旨选妃		\n");	//增加的功能
	printf("	2.翻牌宠幸		\n");	//修改状态的功能
	printf("	3.打入冷宫		\n");	//删除的功能
	printf("	4.召见爱妃		\n");
	printf("*****************************\n\n");
	printf("陛下请选择:");
	scanf_s("%d",&choice);
	
	switch (choice)
	{
	case 1:
		//下旨选妃应具备功能:1.判断是否还有放置嫔妃的空间	2.增加嫔妃后要增加姓名、级别、好感度数组的元素个数	3.人数达到最大值时增加失败
		if (count<MAX)
		{	//重点部分 ↓
			printf("请为新娘娘赐名:");	
			scanf_s("%s",names[count],20);
			levels[count]=0;
			loves[count]=100;
			count++;
			//重点部分 ↑}
		else
			printf("陛下保重龙体啊,后宫已经人满为患了!\n"
				"!选妃失败!");
		break;

	case 2:
		//翻牌宠幸应具备功能:1.找到翻牌娘娘的下标(该例用到for循环使i的值即为下标,未使用到searchIndex变量,用for循环保证了每个妃子会被检测一遍)   
							//2.修改这位妃子的状态:好感度+10 级别+1 ,如果达到最高级就不再加  3.修改其他妃子的状态:好感度-10
							//知识点:strcmp(str+compare的缩写)用于比较两个字符串。为零的时候相等,为1时前一个大于后一个,为-1时前一个小于后一个。字母的大小用ASCII码进行比较
		printf("请输入要翻牌的娘娘名字:");
		scanf_s("%s",temporalName,20);
		for (size_t i = 0; i <count; i++)
		{
			if (strcmp(temporalName,names[i]) == 0)
			{
				loves[i] += 20;
				levels[i] = levels [i]>= 4 ? 4: levels[i] + 1;
				for (size_t i = 0; i < count; i++)
					loves[i] -= 10;
			}
			if (strcmp(temporalName, names[i]) != 0)
				temporalNumber++;
			if (temporalNumber==count)
				printf("您翻了个假牌子,跟空气睡了一觉。");
		}
		break;

	case 3:
		//打入冷宫应具备功能:1.查找到要删除的娘娘的下标 2.用冒泡法把后一个元素赋给前一个元素 3.总数减1即count--
		printf("请输入要打入冷宫的妃子的名字:");
		scanf_s("%s",temporalName,20);
		for (size_t i = 0; i < count; i++)
			if (strcmp(temporalName, names[i]) == 0)
				searchIndex = i;
		if (searchIndex == -1)
			printf("虚惊一场,无人打入冷宫,该吃吃该喝喝");
		else
			for (size_t i = searchIndex; i < count - 1; i++)
			{
				//	names[i] = names[i + 1];		
				//此处会报错,因为是字符串(字符数组),C语言中不支持数组的直接赋值
				//需要使用strcpy函数实现数组的赋值
				strcpy_s(names[i], names[i + 1]);
				loves[i] = loves[i + 1];
				levels[i] = levels[i + 1];
			}
			count--;
			for (size_t i = 0; i < count; i++)
				loves[i] += 10;
		}
		break;

	case 4:
		//召见爱妃应具备功能:1.查找到要召见的妃子	2.增加该妃子的好感度	
		printf("请输入要召见的爱妃:");
		scanf_s("%s",temporalName,20);
		for (size_t i = 0; i < count; i++)
		{
			if (strcmp(temporalName,names[i])==0)
			{
				searchIndex = i;
				loves[i] += 10;
			}
		}
		break;

	default:
		printf("君无戏言,明天再问你了,陛下今天跟空气玩去吧\n");	
	}

	//打印所有妃子状态前,以级别从上到下进行排序,使用冒泡排序,冒泡排序外层循环控制轮数,内层循环控制每一轮的比较次数
	for (size_t i = 0; i < count-1; i++)
		for (size_t j = 0; j < count-1-i; j++)
			if (levels[j]<levels[j+1])
			{
				temporalNumber = levels[j];
				levels[j] = levels[j + 1];
				levels[j + 1] = temporalNumber;

				temporalNumber = loves[j];
				loves[j] = loves[j + 1];
				loves[j+ 1] = temporalNumber;

				strcpy_s(temporalName, names[j]);
				strcpy_s(names[j], names[j + 1]);
				strcpy_s(names[j + 1], temporalName);
			}

	//执行今天要做的事务后,打印一次嫔妃们的状态
	printf("\n**********当前嫔妃的状态**********\n");
	printf("姓名		级别	好感度\n");
	for (size_t i = 0; i < count; i++)
		printf("%s		%s	%d	\n", names[i], levelsName[levels[i]], loves[i]);
	printf("**********************************\n\n");

	for (size_t i = 0; i < count; i++)
		if (loves[i]<70)
			kill++;
	if (kill>=3)
	{
		printf("大量嫔妃不满,发生暴乱,后宫妃子起义弑君,游戏结束!");
		break;
	}
	getchar();
	getchar();
    return 0;
    }

猜你喜欢

转载自blog.csdn.net/WHY995987477/article/details/82955487