- 题目分析
- 这是一个面向对象的程序,题目中的角色要求有姓名、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值、魔法值这11个属性。
- 可以将这11个属性作为类的成员变量,姓名由用户输入,而性别选择,种族选择,职业选择及其限制,初始属性的随机值,以用四个成员函数来操作。
- 在职业选择及其限制的函数里,可以在每一个case用一个if,当碰到不与之匹配的种族,则f=1,否则为0,在主函数中用这个标志来判断是否需要重新选择职业。
- 在设置初始属性的函数里,可以用随机函数rand()来取每个职业的属性值,通过rand()%n+m,来限制每个职业属性值要求的范围,最后再用100-前四个属性值,来确定智慧值,保证了五个属性值的和为100,最后再计算生命值和魔法值。
- 在显示所有信息后,询问用户是否满意,若满意,将信息写入文件myrole里,若不满意,则重新创建角色。
2、类图设计
3、程序实现
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
#include<time.h>
#include<stdlib.h>
int f=1;//职业限制标志
class Role
{
public:
char name[50];//名字、性别、种族、职业
char *sex;
char *race;
char *profe;
int power;//力量、敏捷、体力、智力、智慧
int flexible;
int strength;
int intell;
int intelh;
int life;//生命值和魔法值
int magic;
public:
//性别
void dosex(int n)
{
if(n==1)
sex="男";
else
sex="女";
}
//种族
void dorace(int a)//种族:人类、精灵、兽人、矮人和元素
{
switch(a)
{
case 1:{race="人类";break;}
case 2:{race="精灵";break;}
case 3:{race="兽人";break;}
case 4:{race="矮人";break;}
case 5:{race="元素";break;}
}
}
//职业及其限制
void dopro(Role& r,int b)//职业:狂战士、圣骑士、刺客、猎手、祭司和巫师
{
switch(b)
{
case 1:{
if(r.race=="精灵"||r.race=="元素")
cout<<"无法匹配"<<endl;
else
{profe="狂战士";f=0;}//若匹配,更改f值,使调用职业时不循环
break;}
case 2:{
if(r.race=="精灵"||r.race=="兽人"||r.race=="元素")
cout<<"无法匹配"<<endl;
else
{profe="圣骑士";f=0;}
break;}
case 3:{
if(r.race=="兽人"||r.race=="矮人"||r.race=="元素")
cout<<"无法匹配"<<endl;
else
{profe="刺客";f=0;}
break;}
case 4:{
if(r.race=="矮人"||r.race=="元素")
cout<<"无法匹配"<<endl;
else
{profe="猎手";f=0;}
break;}
case 5:{profe="祭司";f=0;break;}
case 6:{
if(r.race=="兽人"||r.race=="矮人")
cout<<"无法匹配"<<endl;
else
{profe="巫师";f=0;}
break;}
}
}
//初始属性
void shuxing(Role& r)//力量、敏捷、体力、智力、智慧
{ //power,flexible,strength,intell,intelh
srand((unsigned)time(0));//随机取值
if(r.profe=="狂战士")
{
r.power=rand()%4+37;
r.flexible=rand()%4+18;
r.strength=rand()%4+27;
r.intell=rand()%3+3;
}
else if(r.profe=="圣骑士")
{
r.power=rand()%4+21;
r.flexible=rand()%4+12;
r.strength=rand()%4+28;
r.intell=rand()%3+18;
}
else if(r.profe=="刺客")
{
r.power=rand()%4+17;
r.flexible=rand()%4+33;
r.strength=rand()%3+19;
r.intell=rand()%3+13;
}
else if(r.profe=="猎手")
{
r.power=rand()%4+13;
r.flexible=rand()%4+37;
r.strength=rand()%4+14;
r.intell=rand()%3+8;
}
else if(r.profe=="祭司")
{
r.power=rand()%3+14;
r.flexible=rand()%4+17;
r.strength=rand()%3+13;
r.intell=rand()%4+33;
}
else if(r.profe=="巫师")
{
r.power=rand()%4+8;
r.flexible=rand()%4+17;
r.strength=rand()%4+8;
r.intell=rand()%3+18;
}
r.intelh=100-r.power-r.flexible-r.strength-r.intell;//智慧
r.life=r.strength*20;//计算生命值
r.magic=(r.intell+r.intelh)*10;//计算魔法值
}
};
int main()
{
Role r1;
int n;
cout<<"请输入您游戏角色的姓名:"<<endl;
cin>>r1.name;
cout<<"请选择您游戏角色的性别(1、男 2、女):"<<endl;
cin>>n;
r1.dosex(n);
cout<<"请选择您游戏角色的种族(1、人类 2、精灵 3、兽人 4、矮人 5、元素):"<<endl;
cin>>n;
r1.dorace(n);
while(f){ //若f=1,则种族与职业不匹配,重新输入,若f=0,匹配,不循环
cout<<"请选择您的职业(1、狂战士 2、圣骑士 3、刺客 4、猎手 5、祭司 6、巫师):"<<endl;
cin>>n;
r1.dopro(r1,n);}
r1.shuxing(r1);//调用设置初始属性函数
cout<<"================================"<<endl;
cout<<"姓名 "<<r1.name<<endl;
cout<<"================================"<<endl;
cout<<"性别 "<<r1.sex<<endl;
cout<<"================================"<<endl;
cout<<"种族 "<<r1.race<<endl;
cout<<"================================"<<endl;
cout<<"职业 "<<r1.profe<<endl;
cout<<"================================"<<endl;
cout<<"力量 "<<r1.power<<endl;
cout<<"================================"<<endl;
cout<<"敏捷 "<<r1.flexible<<endl;
cout<<"================================"<<endl;
cout<<"体力 "<<r1.strength<<endl;
cout<<"================================"<<endl;
cout<<"智力 "<<r1.intell<<endl;
cout<<"================================"<<endl;
cout<<"智慧 "<<r1.intelh<<endl;
cout<<"================================"<<endl;
cout<<"生命值 "<<r1.life<<endl;
cout<<"================================"<<endl;
cout<<"魔法值 "<<r1.magic<<endl;
cout<<"================================"<<endl;
//询问用户是否满意
cout<<"你对你的角色是否满意?(1、满意 2、不满意)"<<endl;
cin>>n;
if(n==1) //满意,则程序结束,并将角色信息写入文件保存
{
ofstream file;
file.open("myrole.txt");
file<<r1.name<<" "<<r1.sex<<" "<<r1.race<<" "<<r1.profe<<" "<<r1.power<<" "<<r1.flexible<<" "<<r1.strength<<" "<<r1.intell<<" "<<r1.intelh<<" "<<r1.life<<" "<<r1.magic<<endl;
cout<<"创建角色完成,已存入文件"<<endl;
}
else if(n==2)//不满意,则重新创建角色
{
cout<<"重新创建角色"<<endl;
}
}
4、运行结果
5、
经验归纳
在这次编程中,我学习到了游戏角色的创建,如何使职业限制,使用随机函数设置初始属性,并让其在一定范围内,还有用c++将信息写入文件,在编程过程中,也遇到了些小问题,比如在遇到种族与职业不匹配时,如何让用户重新选择职业,经过思考后,使用了while和一个标志,只需在满足条件时更改标志值,使输入语句跳出while。