皇帝选妃

使用语法

1.数组嵌套
2.switch
3.for
4.函数
5.冒泡排序
6.string.h的函数功能

代码如下

/*****************************************
*1.代码主体学习来自B站老九课堂
*2.加入了个人思路进行了修改
*3.存在Bug待完善,读者可自行修改
******************************************/
#include <stdio.h>
#define max 6        //常量max表示
#include<string.h>   //支持字符串操作 

    //char str;
	//使用字符数组表示姓名
	int  i,j,temp;               //循环变量和临时整型变量 
	int  count=5; 				 //当前未打入冷宫的嫔妃个数 
	int  choice;                 //选择在1-4之间
	int  searchIndex=-1;         //用来存放查找到元素的下标 
	char emperorName[50]; 	     //皇帝的名号 
	char tempName[20];  		 //用来存放临时字符串的字符数组
	 
	
	//嫔妃的名字
	char names[max][20]={"貂蝉","杨玉环","不知火舞","西施","蔡文姬"};     
	//嫔妃的级别数据 
	char levelName[5][10]={"贵人","嫔妃","贵妃","皇贵妃","皇后"};  
	//用来存放每位妃子的级别,每个数组元素对应每个妃子当前级别      
	int levels[max]={1,2,0,0,4,-1}; 
	//对应每个妃子的好感度                  
	int loves[max] ={100,100,100,100,100,-1};    
	
	

void show()  //菜单 
{
	printf("%-12s级别\t好感度\n","姓名");	
	printf("------------------------------\n");
	for(i=0;i<count;i++)
	{
		printf("%-12s%s\t%d\n",names[i],levelName[levels[i]],loves[i]);
	}
	printf("------------------------------\n");
}

void bubble_sort() //排序 
{
	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);			 
			}
		}
 } 

void select(int )
{
	switch(choice)
	{
	    //选妃
		case 1:
			//1.增加前需要判断数组有没有空间
			//2.增加数组元素(names.loves.levels) 
			if(count<max)   //如果当前的妃子数量小于系统最大值
			{
				//执行添加操作
				printf("请输入娘娘名讳:");
				scanf("%s",names[count]);
				//将第count个元素的状态初始化
				levels[count]=0;
				loves [count]=100;
				count++;
			} 
			else
			{
				printf("人满为患了!\n 添加失败");
			}
			 
			break;
		//翻牌宠幸
		case 2:
			//1.找到宠幸妃子的下标
			//2.修改这个妃子的状态 ---好感度+10,级别+1,如果最高等级就不再升级 
			//3.修改其他妃子的状态 ---由于羡慕嫉妒恨,其他妃子好感度-10 
			//解决的bug,不支持姓名不存在的情况,通过添加一个if即可 
			printf("陛下,请输入今天翻牌的娘娘:");
			scanf("%s",tempName);
			//字符串的查找strcmp,需要引入<string.h>
			for(i=0;i<count;i++)
			{
				//*********每次从头循环,每次都做判断,看符不符合***********************// 
				if( strcmp(tempName,names[i])==0 ) //如果输入的名字刚好等于数组中的某个姓名 
				{
					loves[i] +=10;
					//级别注意,不能超过5级(0-4) 
					levels[i]=(levels[i]>=4 ? 4: levels[i]+1 ); 
				}  
			    else
				{
					loves[i] -=10;
				}
				if( (i==count-1) && strcmp(tempName,names[i]) != 0 ) 
				{
					printf("后宫没有这位%s娘娘!\n",tempName);
					//恢复好感度 
					for(i=0;i<count;i++)
						loves[i] +=10;
					break;
				} 
			 } 
			break;
		//打入冷宫
		case 3:
			//1.查找
			//2.后面一个赋给前边
			//3.总数--
			//4.其他妃子的好感度+20 
			printf("请输入要打入冷宫的娘娘:");
			scanf("%s",tempName);
			//循环查找
			for(i=0;i<count;i++)
			{
				if(strcmp(tempName,names[i])==0)//比较字符串是否相等
				{
					//记录下要查找的下标
					searchIndex = i;
					break; 
				} 
			 } 
			 if(-1==searchIndex)//如果searchIdex的值为-1,表示没找到
			 {
			 	printf("查无此人!"); 
			 } 
			 else
			 {
			 	for(i=searchIndex;i<count;i++)
			 	{
			 		//names[i]=names[i+1];   因为是字符串,C语言中,不支持数组的直接赋值 
			 		//我们需要使用strcapy()实现数组的赋值
					strcpy( names[i],names[i+1] ); 
			 		loves[i]=loves[i+1];
			 		levels[i]=levels[i+1];
				 }
				 count--;
			 }
			  
			break;
		//单独召见 
		case 4:
			//1.查找
			//2.增加好感度+20
			//3.可以使用数组设计诗歌,使用随机数字的方式,来随机出现 
			printf("陛下,请输入单独召见的娘娘:");
			scanf("%s",tempName);
			for(i=0;i<count;i++)
			{
				if(strcmp(tempName,names[i])==0)
				{
					loves[i] += 20; 
					levels[i]=(levels[i]>=4 ? 4: levels[i]+1 );
				}
				
				if( (i==count-1) && strcmp(tempName,names[i]) != 0 ) 
				{
					printf("后宫没有这位%s娘娘!\n",tempName);
					break;
				} 
				
			}
			break; 
		default:
			printf("君无戏言,陛下请重新选\n");	
	 } 
} 

int main ()
{
    //显示选项 
	show();
	                                     
	printf("请输入皇帝名号:");
    scanf("%s",emperorName);                      //录入字符串,不需要'&'符号 
    printf("%s皇帝陛下,万岁万岁!\n",emperorName);
    
    
	printf("1.皇帝下旨选妃:\t\t(增加功能)\n");
	printf("2.翻牌宠幸:\t\t(修改状态功能)\n");
	printf("3.打入冷宫!\t\t(删除功能)\n");
	printf("4.单独照见爱妃\n");
	printf("陛下请选择:");
	scanf("%d",&choice);                      //&,一定不能忘 
	
	//选妃功能 
	select(choice); 
	//最后打印所有妃子状态前,用级别排序,冒泡排序 
	bubble_sort(); 	
	//显示菜单 
	show();
	
	
	return 0; 
 } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值