RPG游戏角色创建
一、实验内容
1.功能描述
几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。
2.游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
3.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
种族/职业 |
狂战士 |
圣骑士 |
刺客 |
猎手 |
祭司 |
巫师 |
人类 |
允许 |
允许 |
允许 |
允许 |
允许 |
允许 |
精灵 |
不允许 |
不允许 |
允许 |
允许 |
允许 |
允许 |
兽人 |
允许 |
不允许 |
不允许 |
允许 |
允许 |
不允许 |
矮人 |
允许 |
允许 |
不允许 |
不允许 |
允许 |
不允许 |
元素 |
不允许 |
不允许 |
不允许 |
不允许 |
允许 |
允许 |
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
4.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是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 |
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
5.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
- 算法构造
- 算法设计思路
该程序使用C++语言编写,构造了一个Role类,其中私有的数据成员有游戏角色的姓名、性别、种族、职业及力量、敏捷等五大属性和生命值、魔法值;共有的成员函数有Role(){}、
void set_name()、set_sex()、set_race()、void get_shuxing(int,int,int,int,int)、void to_shuxing()、void display()、void save_file()。
- 其中设置游戏角色的性别、种族及职业都运用了switch选择语句,由于角色的职业与种族有关,set_race()函数中先使用了一个switch选择语句来选择种族,再根据其种族再次使用switch语句来选择其能选择的职业。
- 其中设置游戏角色的属性,由于其与职业有关,所以在void to_shuxing()函数中,先根据职业设置了每个属性的最小值,然后在void get_shuxing(int,int,int,int,int)函数中在初始最小值属性上加上使用随机函数产生1~10范围内的数,即产生角色的各个属性值;
- void display()函数是用来显示该角色的所有信息,void save_file()函数是将所创建的角色信息保存至文件role.txt中。
2.UML类图
Role |
-name -sex -race -job -liliang -minjie -tili -zhili -zhihui -shengmingzhi -mofazhi |
+Role() +void set_name() +set_sex() +set_race() +void get_shuxing(int,int,int,int) +void to_shuxing() +void display() +void save_file() |
- 程序实现
程序源代码如下:
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace std;
class Role
{ private:
char name[50];//名字
string sex; //性别
string race; //种族
string job; //工作
int liliang; //力量
int minjie; //敏捷
int tili; //体力
int zhili; //智力
int zhihui; //智慧
int shengmingzhi;//生命值
int mofazhi; //魔法值
public:
Role(){};
void set_name();//设置游戏角色的名字
set_sex();//选择性别
set_race();//选择种族及职业
void get_shuxing(int,int,int,int,int);//设定属性值
void to_shuxing();//设定各职业初始属性
void display();//显示信息
void save_file();//文件保存信息
};
//设置名字
void Role::set_name(){
cout<<"请输入您游戏角色的名字:";
cin>>name;
}
//选择性别
int Role::set_sex(){
int i;
cout<<"请选择您游戏角色的性别(0男性,1女性):";
cin>>i;
switch(i){
case 0:sex="男性";
break;
case 1: sex="女性";
break;
}
return 0;
}
//选择角色的种族和职业
int Role::set_race()
{
int a;
cout<<"请选择您游戏角色的种族(0人类,1精灵,2兽人,3矮人,4元素):";
cin>>a;
switch(a){
case 0: race="人类";
break;
case 1: race="精灵";
break;
case 2: race="兽人";
break;
case 3: race="矮人";
break;
case 4: race="元素";
break;
}
int b;
switch(a){
case 0:
cout<<"请选择您的职业(0狂战士,1圣骑士,2刺客,3猎手,4祭司,5巫师):"<<endl;
break;
case 1:
cout<<"请选择您的职业(2刺客,3猎手,4祭司,5巫师):"<<endl;
break;
case 2:
cout<<"请选择您的职业(0狂战士,3猎手,4祭司,):"<<endl;
break;
case 3:
cout<<"请选择您的职业(0狂战士,1圣骑士,4祭司):"<<endl;
break;
case 4:
cout<<"请选择您的职业(4祭司,5巫师):"<<endl;
break;
}
cin>>b;
switch(b){
case 0:
job="狂战士";
break;
case 1:
job="圣骑士";
break;
case 2:
job="刺客";
break;
case 3:
job="猎手";
break;
case 4:
job="祭司";
break;
case 5:
job="巫师";
break;
}
}
//通过随机函数取得力量、敏捷等五个属性的值
void Role::get_shuxing(int a,int b,int c,int d,int e){
int sum=0;
do{
srand((int)time(NULL));//设置随机生成种子,来保证每次生成的值不同
liliang=a+(rand()%10+1);//rand()%10+1会生成1~10之间的值
minjie=b+(rand()%10+1);
tili=c+(rand()%10+1);
zhili=d+(rand()%10+1);
sum=liliang+minjie+tili+zhili;
}while(sum>99);//限制智慧这个属性的最小值为1
zhihui=100-sum;
shengmingzhi=tili*20;//生命值
mofazhi=(zhili+zhihui)*10;//魔法值
}
//根据各个职业不同,设定各个职业的初值属性
void Role::to_shuxing()
{ if(job=="狂战士") get_shuxing(30,10,20,0,0);
if(job=="圣骑士") get_shuxing(15,5,20,10,0);
if(job=="刺客") get_shuxing(10,25,10,10,0);
if(job=="猎手") get_shuxing(5,30,5,0,10);
if(job=="祭司") get_shuxing(5,10,5,25,5);
if(job=="巫师") get_shuxing(0,10,0,10,30);
}
//显示所创建角色的所有信息
void Role::display(){
cout<<"==============================================="<<endl;
cout<<"姓名 "<< name<<endl;
cout<<"==============================================="<<endl;
cout<<"性别 "<< sex<<endl;
cout<<"==============================================="<<endl;
cout<<"种族 "<< race<<endl;
cout<<"==============================================="<<endl;
cout<<"职业 "<< job<<endl;
cout<<"==============================================="<<endl;
cout<<"力量 "<< liliang<<endl;
cout<<"==============================================="<<endl;
cout<<"敏捷 "<< minjie<<endl;
cout<<"==============================================="<<endl;
cout<<"体力 "<< tili<<endl;
cout<<"==============================================="<<endl;
cout<<"智力 "<< zhili<<endl;
cout<<"==============================================="<<endl;
cout<<"智慧 "<< zhihui<<endl;
cout<<"==============================================="<<endl;
cout<<"生命值 "<< shengmingzhi<<endl;
cout<<"==============================================="<<endl;
cout<<"魔法值 "<< mofazhi<<endl;
}
//将角色信息写入文件保存
void Role::save_file(){
ofstream outfile("role.txt",ios::out);
if(!outfile){
cerr<<"open error!"<<endl;
exit(1);
}
outfile<<"==============================================="<<endl;
outfile<<"姓名 "<< name<<endl;
outfile<<"==============================================="<<endl;
outfile<<"性别 "<< sex<<endl;
outfile<<"==============================================="<<endl;
outfile<<"种族 "<< race<<endl;
outfile<<"==============================================="<<endl;
outfile<<"职业 "<< job<<endl;
outfile<<"==============================================="<<endl;
outfile<<"力量 "<< liliang<<endl;
outfile<<"==============================================="<<endl;
outfile<<"敏捷 "<< minjie<<endl;
outfile<<"==============================================="<<endl;
outfile<<"体力 "<< tili<<endl;
outfile<<"==============================================="<<endl;
outfile<<"智力 "<< zhili<<endl;
outfile<<"==============================================="<<endl;
outfile<<"智慧 "<< zhihui<<endl;
outfile<<"==============================================="<<endl;
outfile<<"生命值 "<< shengmingzhi<<endl;
outfile<<"==============================================="<<endl;
outfile<<"魔法值 "<< mofazhi<<endl;
outfile.close();
}
int main()
{ Role a;
int choice;
do{
a.set_name();
a.set_sex();
a.set_race();
a.to_shuxing();
a.display();
cout<<"创建角色成功!你满意不?"<<endl;
cout<<"若满意,请按“1”,若不满意,请按“0”重新创建"<<endl;
cin>>choice;
}while(choice==0);
cout<<"恭喜你,创建成功!"<<endl;
a.save_file();
return 0;
}
- 调试、测试及运行结果
1、调试
2、运行结果
- 经验归纳
通过本次实验,我学会了如何绘制UML类图,对面向对象程序设计有了更深刻的认识;自从上次上机实验学会了如何将相关信息写入文件保存后,这次自己将文件读写这一部分的代码写出来了。
本次实验遇到的最大问题就是游戏角色的选择职业,刚开始我是在成员函数set_job()中使用了if...else if...else if...语句,先判断其种族,然后根据种族来选择其能选的职业,由于自身疏忽出现了多个小错误,还有就是程序繁杂;后来就删去了set_job()成员函数,在set_race中通过3个switch选择语句来既实现种族的选择,又实现职业的选择,这样写的好处就是该部分的代码不那么繁杂。
本次实验最大的不足就是该实验的目的是掌握面向对象设计七大法则,而我只写了一个类,没有充分地利用到其七大法则,愿在今后的学习中多加改善。