一.实验目的
- 掌握面向对象程序设计的方法。明确类与对象的概念,掌握面向对象设计七大原则;
- 掌握常见的设计模式以及类图的描述。
二、实验内容
- 功能描述
几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。
- 游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
- 职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
种族/职业 | 狂战士 | 圣骑士 | 刺客 | 猎手 | 祭司 | 巫师 |
人类 | 允许 | 允许 | 允许 | 允许 | 允许 | 允许 |
精灵 | 不允许 | 不允许 | 允许 | 允许 | 允许 | 允许 |
兽人 | 允许 | 不允许 | 不允许 | 允许 | 允许 | 不允许 |
矮人 | 允许 | 允许 | 不允许 | 不允许 | 允许 | 不允许 |
元素 | 不允许 | 不允许 | 不允许 | 不允许 | 允许 | 允许 |
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
- 初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
职业/属性 | 力量 | 敏捷 | 体力 | 智力 | 智慧 |
狂战士 | 40 | 20 | 30 | 5 | 5 |
圣骑士 | 25 | 15 | 30 | 20 | 10 |
刺客 | 20 | 35 | 20 | 15 | 10 |
猎手 | 15 | 40 | 15 | 10 | 20 |
祭司 | 15 | 20 | 15 | 35 | 15 |
巫师 | 10 | 20 | 10 | 20 | 40 |
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
- 显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
二、源代码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int occuption(int race) //职业类 通过种族来选取职业 (很多职业会限制某些种族选择)
{
int work;
switch(race)
{
case 0:
{
printf("请选择您的职业(0狂战士,1圣骑士,2刺客,3猎手,4祭司,5巫师);");
scanf("%d",&work);
break;
}
case 1:
{
printf("请选择您的职业(2刺客,3猎手,4祭司,5巫师);");
scanf("%d",&work);
break;
}
case 2:
{
printf("请选择您的职业(0狂战士,3猎手,4祭司,5巫师);");
scanf("%d",&work);
break;
}
case 3:
{
printf("请选择您的职业(0狂战士,3猎手,4祭司);");
scanf("%d",&work);
break;
}
case 4:
{
printf("请选择您的职业(0狂战士,1圣骑士,3猎手,4祭司);");
scanf("%d",&work);
break;
}
case 5:
{
printf("请选择您的职业(4祭司,5巫师);");
scanf("%d",&work);
break;
}
}
return work;
}
void property(char *uname,int sex,int race,int work,int power,int agility,int phypower,int intelligence,int wisdom,int life,int magic)//游戏角色的各项属性
{
printf("姓名 %s\n",uname);
printf("====================\n");
if(sex==0)
{
printf("性别 男性\n");
}
else
{
printf("性别 女性\n");
}
printf("\n");
printf("====================\n");
switch(race)
{
case 0:
{
printf("种族 人类\n");
break;
}
case 1:
{
printf("种族 精灵\n");
break;
}
case 2:
{
printf("种族 兽人\n");
break;
}
case 3:
{
printf("种族 矮人\n");
break;
}
case 4:
{
printf("种族 元素\n");
break;
}
}
printf("\n");
printf("====================\n");
switch(work)
{
case 0:
{
printf("职业 狂战士\n");
break;
}
case 1:
{
printf("职业 圣骑士\n");
break;
}
case 2:
{
printf("职业 刺客\n");
break;
}
case 3:
{
printf("职业 猎手\n");
break;
}
case 4:
{
printf("职业 祭司\n");
break;
}
case 5:
{
printf("职业 巫师\n");
break;
}
}
printf("====================\n");
printf("\n");
printf("力量 %d\n",power);
printf("====================\n");
printf("\n");
printf("敏捷 %d\n",agility);
printf("====================\n");
printf("\n");
printf("体力 %d\n",phypower);
printf("====================\n");
printf("\n");
printf("智力 %d\n",intelligence);
printf("====================\n");
printf("\n");
printf("智慧 %d\n",wisdom);
printf("====================\n");
printf("\n");
printf("生命值 %d\n",life);
printf("====================\n");
printf("\n");
printf("魔法值 %d\n",magic);
printf("====================\n");
printf("\n");
}
int getproperty(char *uname,int sex,int race,int work) //得到角色的各项属性值
{
int power,agility,phypower,intelligence,wisdom,life,magic;
switch(work)
{
case 0:
{ //力量,敏捷,体力,智力,智慧均是随机值,且和为100
power=rand()%3+37; //通过rand函数得到力量随机值
agility=rand()%3+18; //通过rand函数得到敏捷随机值
phypower=rand()%3+28; //通过rand函数得到体力随机值
intelligence=rand()%3+3; //通过rand函数得到智力随机值
wisdom=100-power-agility-phypower-intelligence;//通过rand函数得到智慧随机值
break;
}
case 1:
{
power=rand()%3+23;
agility=rand()%3+14;
phypower=rand()%3+28;
intelligence=rand()%3+19;
wisdom=100-power-agility-phypower-intelligence;
break;
}
case 2:
{
power=rand()%3+17;
agility=rand()%3+34;
phypower=rand()%3+18;
intelligence=rand()%3+13;
wisdom=100-power-agility-phypower-intelligence;
break;
}
case 3:
{
power=rand()%3+14;
agility=rand()%3+37;
phypower=rand()%3+14;
intelligence=rand()%3+8;
wisdom=100-power-agility-phypower-intelligence;
break;
}
case 4:
{
power=rand()%3+14;
agility=rand()%3+17;
phypower=rand()%3+14;
intelligence=rand()%3+34;
wisdom=100-power-agility-phypower-intelligence;
break;
}
case 5:
{
power=rand()%3+8;
agility=rand()%3+18;
phypower=rand()%3+7;
intelligence=rand()%3+18;
wisdom=100-power-agility-phypower-intelligence;
break;
}
}
life=phypower*20; //求生命值
magic=(intelligence+wisdom)*10; //求魔法值
property(uname,sex,race,work,power,agility,phypower,intelligence,wisdom,life,magic);
return 0;
}
int main()
{
char uname[20];
int t=1;
int sex,race,work;
while(t)
{
printf("请输入您游戏角色的姓名:");
scanf("%s",&uname);
printf("请输入您游戏角色的性别(0男性,1女性):");
scanf("%d",&sex);
printf("请选择您游戏角色的种族(0人类,1精灵,2兽人,3矮人,4元素):");
scanf("%d",&race);
work=occuption(race);
getproperty(uname,sex,race,work);
printf("是否满意该角色的所有信息(0满意,1不满意)");
scanf("%d",&t);
}
return 0;
}
三、运行结果