一.题目要求
1.游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
2.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
3.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
4.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
二.题目分析
运用多个switch语句,对输入的游戏角色的信息进行判断,并将信息赋给相对应字符串。
在不同种族的职业选择方面,首先还是用switch语句,对种族的进行判断,对不同的case的操作是:不同的种族显示相对应的职业。
在力量,敏捷,体力,智力,智慧的赋值,先生成合适的随机数,然后用switch语句,对职业进行判断,对不同的case的操作是:不同的职业赋值不同范围的随机数。
三.流程图
代码:
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<stdio.h>
using namespace std;
class Initial
{public:
void display(); //显示角色信息
void file(); //保存信息到文件中
void getname(); //获取角色的名字和性别
void getrace(); //获取角色的种族,职业,并对角色各项基础属性赋值
char name[10];
char *race2,*profession2,*sex2;
int race,profession,sex,power,agility,physical,zhili,zhihui,life,magic;
};
void Initial::getname(){
cout<<"请输入您游戏角色的姓名"<<endl;
cin>>name;
cout<<"请输入您游戏角色的性别(0:男性 1:女性)"<<endl;
cin>>sex;
switch(sex){
case 0:sex2="男性";break;
case 1:sex2="女性";break;
}
};
void Initial::getrace(){
cout<<"请输入您游戏角色的种族(0:人类 1:精灵 2:兽人 3:矮人 4:元素 )"<<endl;
cin>>race;
switch(race){
case 0:race2="人类"; cout << "请输入您的职业1.狂战士 2.圣骑士 3.刺客 4.猎手 5.祭司 6.巫师" << endl;cin>>profession; break;
case 1:race2="精灵"; cout << "3.刺客 4.猎手 5.祭司 6.巫师" << endl;cin>>profession;break;
case 2:race2="兽人"; cout << "1.狂战士 4.猎手 5.祭司 " << endl;cin>>profession;break;
case 3:race2="矮人"; cout << "1.狂战士 2.圣骑士 5.祭司 " << endl;cin>>profession;break;
case 4:race2="元素"; cout << "5.祭司 6.巫师" << endl;cin>>profession;break;
}
switch(profession){
case 1:profession2="狂战士";break;
case 2:profession2="圣骑士";break;
case 3:profession2="刺客";break;
case 4:profession2="猎手";break;
case 5:profession2="祭司";break;
case 6:profession2="巫师";break;
}
srand((unsigned)time(NULL));
int a,b,c,d,e;
a=rand()%11+35; //35--45
b=rand()%11+25; //25--35
c=rand()%11+15; //15--25
d=rand()%11+5; //5 --15
e=rand()%11+10; //10--20
switch(profession){
case 1:power=a;agility=c;physical=b;zhili=d;zhihui=d;break; //狂战士
case 2:power=b;agility=e;physical=b;zhili=c;zhihui=d;break; //圣骑士
case 3:power=b;agility=a;physical=c;zhili=e;zhihui=d;break; //刺客
case 4:power=c;agility=a;physical=b;zhili=e;zhihui=b;break; //猎手
case 5:power=e;agility=c;physical=e;zhili=a;zhihui=e;break; //祭司
case 6:power=d;agility=c;physical=d;zhili=c;zhihui=a;break; //巫师
}
life=physical*20;
magic=(zhili+zhihui)*10;
};
void Initial::display(){
cout<<"============================="<<endl;
cout<<"姓名 "<<name<<endl;
cout<<"============================="<<endl;
cout<<"性别 "<<sex2<<endl;
cout<<"============================="<<endl;
cout<<"种族 "<<race2<<endl;
cout<<"============================="<<endl;
cout<<"职业 "<<profession2<<endl;
cout<<"============================="<<endl;
cout<<"力量 "<<power<<endl;
cout<<"============================="<<endl;
cout<<"敏捷 "<<agility<<endl;
cout<<"============================="<<endl;
cout<<"体力 "<<physical<<endl;
cout<<"============================="<<endl;
cout<<"智力 "<<zhili<<endl;
cout<<"============================="<<endl;
cout<<"智慧 "<<zhihui<<endl;
cout<<"============================="<<endl;
cout<<"生命值 "<<life<<endl;
cout<<"============================="<<endl;
cout<<"魔法值 "<<magic<<endl;
}
void Initial::file(){
FILE *fp = fopen("人物初始化.txt", "w");
{
//写入数据
fprintf(fp, "姓名 %s\n",name );
fprintf(fp, "性别 %s\n",sex2 );
fprintf(fp, "种族 %s\n",race2);
fprintf(fp, "职业 %s\n",profession2 );
fprintf(fp, "力量 %d\n",power);
fprintf(fp, "敏捷 %d\n",agility );
fprintf(fp, "体力 %d\n",physical);
fprintf(fp, "智力 %d\n",zhili);
fprintf(fp, "智慧 %d\n",zhihui );
fprintf(fp, "生命值 %d\n",life );
fprintf(fp, "魔力值 %d\n",magic );
}
fclose(fp); //关闭文件
cout<<"保存角色成功"<<endl;
}
void main()
{ int n;
Initial t0;
loop:
t0.getname();
t0.getrace();
t0.display();
cout<<"对生成的角色是否满意(0.满意 1.不满意)"<<endl;
cin>>n;
switch(n){
case 0:t0.file();break; //调用file()函数,保存信息
case 1:goto loop; //返回标记处,对角色重新定义
}
}
代码测试:
不满意角色设定,进行重新的设定并保存新设定的属性信息到文件中。
选择兽人,在职业只显示狂战士,猎手,祭祀。
问题 :角色的力量,敏捷,体力,智力,智慧五项属性之和不为题目要求的100.