RPG角色创建

1、 题目分析

本次上机要求编写一个简单的游戏角色创建程序本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字不超过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

最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。

2、 源代码

#include<iostream>
#include<time.h>
#include"math.h"
#include<stdlib.h>
#include<fstream>
#include<string>
using namespace std;
class Role{  //角色类 
	public:
		string name;
		string sex;
		int choise_sex;  //选择性别 
		void getName();
		void getSex();
};
void Role::getName(){
	cout<<"请输入您游戏角色的姓名;\t";
	cin>>name;
}
void Role::getSex(){
	cout<<"请选择您游戏角色的性别( 0、男性  1、女性 )\t";
	cin>>choise_sex;
	if(choise_sex==0)
    	sex="男性";
	else if(choise_sex==1)
		sex="女性"; 
}

class RaceCareer:public Role{  //种族类和职业类,继承自角色类 
	public:
		string race;
		string career;
		int choise_race;   //选择种族 
		int choise_career; //选择职业 
		void getRace();
		void getCareer();
};
void RaceCareer::getRace(){
	cout<<"请选择您游戏角色的种族:(0、人类 1、精灵 2、兽人 3、矮人 4、元素)\t";
	cin>>choise_race;
	switch(choise_race)
	{
		case 0:
			race="人类"; 
			break;
		case 1:
			race="精灵"; 
			break; 
		case 2:
			race="兽人"; 
			break; 
		case 3:
			race="矮人"; 
			break; 
		case 4:
			race="元素"; 
			break;
		default:
			cout<<"输入错误,请重新输入"<<endl;
			break; 
		 
	 } 
}
void RaceCareer::getCareer(){
	switch(choise_race)
	{
		case 0:
			cout<<"请选择您游戏角色的职业 (0、狂战士 1、圣骑士 2、刺客 3、猎手 4、祭祀 5、巫师)\t";
			break;
		case 1:
			cout<<"请选择您游戏角色的职业 (2、刺客 3、猎手 4、祭祀 5、巫师)\t";
			break; 
		case 2:
			cout<<"请选择您游戏角色的职业 (0、狂战士 3、猎手 4、祭祀)\t";
			break; 
		case 3:
			cout<<"请选择您游戏角色的职业 (0、狂战士 1、圣骑士 4、祭祀)\t";
			break; 
		case 4:
			cout<<"请选择您游戏角色的职业 (4、祭祀 5、巫师)\t";
			break;
		default:
			cout<<"输入错误,请重新输入"<<endl;
			break;  
	 }
	 cin>>choise_career;
	 switch(choise_career){
	 	case 0:
	 		career="狂战士"; 
	 		break;
	 	case 1:
	 		career="圣骑士"; 
	 		break;
	 	case 2:
	 	    career="刺客"; 
	 		break;
	 	case 3:
	 		career="猎手"; 
	 		break;
	 	case 4:
	 		career="祭祀"; 
	 		break;
	 	case 5:
	 		career="巫师"; 
	 		break;
	 	default:
			cout<<"输入错误,请重新输入"<<endl;
			break; 
	 } 
}
class Value :public RaceCareer{  //属性类,继承自种族职业类 
	public:
		int strength; //力量
	    int agility;  //敏捷
	    int	power;   //体力
	    int intelligence;//智力
	    int wisdom;  //智慧
	    int HP;     //生命值
 	    int MP;      //魔法值
	    int value_Random(int num1,int num2,int num3,int num4,int num5); //随机生成属性函数及五个属性初值
 	    int value(int career); //取决于职业的属性偏差
}; 
int Value::value_Random(int num1,int num2,int num3,int num4,int num5){
	int sum;  //属性值总和 
	srand((unsigned)time(NULL));
	do
	{
		strength = rand() % 10 + num1 ;//力量
		agility = rand() % 10 + num2;  //敏捷
		power = rand() % 10 + num3;    //体力
		intelligence = rand() % 10 + num4;//智力
		wisdom = rand() % 10 + num5;   //智慧
		sum = strength + agility + power + intelligence +wisdom ;//总和
	} while(sum!=100);
	HP = power * 20;  //生命值
	MP = (intelligence + wisdom) * 10; //魔法值
	return 0;
}
int Value::value(int choise_career){
	if (choise_career == 0) value_Random(35, 15, 25, 5, 5);   //狂战士的基础属性	
	if (choise_career == 1) value_Random(20, 10, 25, 15, 15); //圣骑士的基础属性
	if (choise_career == 2) value_Random(15, 30, 15, 10, 15); //刺客的基础属性
	if (choise_career == 3) value_Random(10, 35, 10, 5, 25);  //猎手的基础属性
	if (choise_career == 4) value_Random(10, 25, 10, 30, 20); //祭司的基础属性
	if (choise_career == 5) value_Random(5, 15, 5, 15, 45);   //巫师的基础属性
	return 0;
} 
//显示角色属性 
void show(Role &r1, RaceCareer &r2, Value &v)
{
	cout << endl;
	cout << "==========================================================" << endl; 
	cout << "\t姓名\t\t\t" << v.name<< endl;
	cout << "==========================================================" << endl;
	cout << "\t性别\t\t\t" << v.sex << endl;
	cout << "==========================================================" << endl;
	cout << "\t种族\t\t\t" << r2.race << endl;
	cout << "==========================================================" << endl;
	cout << "\t职业\t\t\t" << r2.career << endl;
	cout << "==========================================================" << endl;
	cout << "\t力量\t\t\t" << v.strength << endl;
	cout << "==========================================================" << endl;
	cout << "\t敏捷\t\t\t" << v.agility << endl;
	cout << "==========================================================" << endl;
	cout << " \t体力\t\t\t" << v.power << endl;
	cout << "==========================================================" << endl;
	cout << "\t智力\t\t\t" << v.intelligence << endl;
	cout << "==========================================================" << endl;
	cout << "\t智慧\t\t\t" << v.wisdom << endl;
	cout << "==========================================================" << endl;
	cout << "\t生命值\t\t\t" << v.HP << endl;
	cout << "==========================================================" << endl;
	cout << "\t魔法值\t\t\t" << v.MP << endl;
	cout << "==========================================================" << endl;
}
/*写入文件函数,保存创建角色的信息*/
void File(Role &r1, RaceCareer &r2, Value &v)
{
	ofstream f1("D:\\save.txt"); //若文件存在,则直接更新写入;若不存在,则创建文件再写入
	f1 << "您创建的角色信息如下" << endl;
	f1 << "==========================================================" << endl; 
	f1 << "\t姓名\t\t\t" << v.name<< endl;
	f1 << "==========================================================" << endl;
    f1 << "\t性别\t\t\t" << v.sex << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t种族\t\t\t" << r2.race << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t职业\t\t\t" << r2.career << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t力量\t\t\t" << v.strength << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t敏捷\t\t\t" << v.agility << endl;
	f1 << "==========================================================" << endl;
	f1 << " \t体力\t\t\t" << v.power << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t智力\t\t\t" << v.intelligence << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t智慧\t\t\t" << v.wisdom << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t生命值\t\t\t" << v.HP << endl;
	f1 << "==========================================================" << endl;
	f1 << "\t魔法值\t\t\t" << v.MP << endl;
	f1 << "==========================================================" << endl;
}

int main(){
	Role r1;
	RaceCareer r2;
	Value v;
	int x;
	int a; 
	v.getName();
	v.getSex();
	r2.getRace();
	r2.getCareer();
	do{
		v.value(r2.choise_career);
		show(r1, r2, v);
		cout << "请核对您所创建的角色属性,满意请输入 0,不满意请输入1" << endl;
		cin >> x;
	} while (x);
	cout << "是否要保存角色信息至文件" << endl;
	cout << "需要保存请输入0,不需要请输入1" << endl;
	cin >> a;
	switch (a)
	{
	case 0:
		File(r1, r2, v);
		cout << "保存成功" << endl;
		break;
	case 1:
		cout << "您的角色信息将无法保存" << endl;
		break;
	}
	return 0;
}

源代码附于文件夹中

3、 程序调试及测试结果

程序测试结果:
图(1)
图(2)
图(3)
程序测试结果如下图所示,图(1)结果显示了角色姓名、性别、种族、职业,以及显示角色属性;图(2)显示了程序的用户是否满意,以及是否需要保存的功能;图(3)是保存成功后,记事本中保存的信息。

调试结果如图:
在这里插入图片描述
在这里插入图片描述
在程序编写时,人物力量、智慧等五个属性本该总值为100,但是我运行之后发现我的人物属性出现的值不符合预期,人物属性结果如下:

可以看出属性值出现乱码,通过程序的调试,可以发现sum=4的时候,strength=11,显然是错误的,通过调试我发现出现错误的原因是没有先调用基础属性函数,因为没有基础属性,所以随机函数产生的数值才会不符合预期,改正调用顺序之后,问题解决。

4、 心得体会

本次上机作业是面向对象程序设计,编写一个简单的游戏角色创建游戏,通过本次上机,我对面向对象程序设计方法有了具体的应用,从中学习到了很多,之前也使用过C++编写程序,但是并没有使用类方法,这次的上机作业让我学习了如何编写真正的面向对象程序,也体会到了这一方法的便利优势之处,减少了编程量。这次上机作业我觉得难点在于随机生成属性并且属性之和为100,根据不同职业,属性也需要有所偏重。在编程过程中,出现了属性值是乱码的情况,通过程序调试我发现问题所在,改正之后程序可以正常运行。这个难点的解决方法是随机生成五个属性的值,再写一个函数保存各个职业的基本属性值,先调用基本属性值函数,再调用随机函数,在基本属性值基础上进行加减。以上就是我这次上机的体会。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值