前言
学习C语言两个星期,用这个小小的文字游戏练手。
这个程序的知识点是:
二维数组、循环、各种基础的函数。
内容和创意
都来源于网易云课堂→老九零基础学编程 的教学课程(https://study.163.com/course/courseLearn.htm?courseId=1003425004&from=study#/learn/video?lessonId=1003931092&courseId=1003425004 )
转侵删,谢谢。
内容
程序中注释得很详细。
缺点:
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;
}