C++ RPG游戏角色的创建

题目
几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。

在这里插入图片描述
1.游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
2.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:在这里插入图片描述
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
3.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
在这里插入图片描述
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
4.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。

题目分析

1.需要创建两个类第一个类存放要选择角色的性别,职业等等,第二个类存放人的选择。
2.需要第一类当作基类, 第二个类继承第一个类
3.要生成角色"力量",“敏捷”,“体力”,“智力”,“智慧”,“生命值”,"魔法值"需要按照初始属性表大概比例随机生成。
4.当玩家确认时,可以将生成的数据存入文件中。

相关算法:

double random(double start,double end) //绝对随机数生成算法
{
return start + (end - start) * rand() / (RAND_MAX + 1.0);
}

按照6种职业属性比例求机属性分配的比例
求6种职业的最大公约数,只有两种,5和10,对于这两种结果,随机生成4-6或者9-11的随机数,再用100逐个减去,最后剩下100中的就是最后一个属性。

void get_choice::randoms() //力量、敏捷、体力、智力和智慧比例分配
{
int temp=100;
int n;
if(get_profession>4) //第6个职业的属性比例最大公约数为10
{
n=10;
}
else{
n=5; //前4个职业的属性比例最大公约数为5
}
srand((unsigned)time(NULL));
for(int i=0;i<4;i++)
{
a[i]=random(n-1,n+1)*profession_attribute[get_profession][i];//随机生成与最大公约数相近的数(n-1,n+1),乘以比例。
temp-=a[i]; //100-生成的属性
}
a[4]=temp;
a[5]=a[2]*20; //生命值
a[6]=(a[3]+a[4])*10; //魔法值
}
####运行截图
在这里插入图片描述
在这里插入图片描述

代码

/*
title:RPG角色生成器 
Author:  Q 
Date:2019/4/17 
具体功能:
一个角色生成程序,可自己输入姓名,性别,种族,职业
随机生成符合角色的属性
*/
#include<iostream>
#include<ctime> 
#include<cstdlib>
#include<fstream>
using namespace std;

double random(double start,double end)       //绝对随机数生成算法 
{
    return start + (end - start) * rand() / (RAND_MAX + 1.0);
}

class person
{
	public:
		char sex[2][20]={ "男性","女性" };
		char race[5][20]={ "人类","精灵","兽人","矮人","元素" };
		char profession[6][20]={ "狂战士","圣骑士","刺客","猎手","祭司","巫师" };
		 
};
class get_choice :public person
{
	protected:
		char name[50];
		int get_sex;
		int get_race;
		int get_profession;
		int profession_attribute[6][5]={{8,4,6,1,1,},{5,3,6,4,2,},{4,7,4,3,2,},{3,8,3,2,4,},{3,4,3,7,3,},{1,2,1,2,4}};
		int a[7];
		char b[7][20]={"力量","敏捷","体力","智力","智慧","生命值","魔法值"};
	public:
	    void input_name();
	    int input_sex();
	    int input_race();
	    int input_profession();
	    void randoms();
		void display();
		friend void output_file(get_choice &get); 
};
void get_choice::input_name()
{
	cout << "请输入您游戏角色的姓名:";
	cin >>name;
}
int get_choice::input_sex()
{
	while (1)
	{
		cout << "请选择您游戏角色的性别("<<"0 "<<sex[0]<<","<<"1 "<<sex[1]<<"):";
		cin >>get_sex;
		if (get_sex == 0 ||get_sex == 1)            //判断性别输入是否正确
		{
			break;
		}                                            //正确则跳出
		else
			cout << "请输入0或1来选择性别!\n";	
	}
	return get_sex;
}
int get_choice::input_race()
{
	while (1)
	{
		cout << "请选择您游戏角色的种族(";
		for(int i=0;i<5;i++)
		{
			cout<<i<<" "<<race[i]<<" "; 
		 } 
		 cout<<")";
		cin>>get_race;
		if (get_race>=0&&get_race<5)              //判断输入是否符合要求
		{
			break;
		}                                            //正确则跳出
		else
			cout << "请输入0到5来选择种族!\n";	
	}
	return get_race;
}
int get_choice::input_profession()
{
	switch(get_race){
		case 0:
		while (1)
		{
		    cout << "请选择您游戏角色的职业(";    //人类可选职业 
		    for(int i=0;i<6;i++)
		    {
			    cout<<i<<" "<<profession[i]<<" "; 
		    } 
		    cout<<")";
		    cin>>get_profession;
		    if (get_profession>=0&&get_profession<6)             //判断输入是否符合要求
		    {
			    break;
		    }                                            //正确则跳出
		    else
			    cout << "请输入0到6来选择职业!\n";	
	    }break;
	    case 1:
		while (1)
		{
		    cout <<"请选择您的职业(2刺客,3猎手,4祭司,5巫师):"; //精灵所选职业
		    cin>>get_profession;
		    if (get_profession>=2&&get_profession<6)              //判断输入是否符合要求
		    {
			    break;
		    }                                            //正确则跳出
		    else
			    cout << "请输入2到5来选择职业!\n";	
	    }break;
	    case 2:
			while (1)
		{
		   	cout << "请选择您的职业(0狂战士,3猎手,4祭司):"; //兽人所选职业
		    cin>>get_profession;
		    if (get_profession==2||get_profession==4||get_profession==0)              //判断输入是否符合要求
		    {
			    break;
		    }                                            //正确则跳出
		    else
			    cout << "请根据括号中的数字来选择职业!\n";	
	    }break;
	    case 3:
		while (1)
		{
		   	cout << "请选择您的职业(0狂战士,1圣骑士,4祭司):";//矮人所选职业
		    cin>>get_profession;
		    if (get_profession==1||get_profession==4||get_profession==0)                //判断输入是否符合要求
		    {
			    break;
		    }                                            //正确则跳出
		    else
			    cout << "请根据括号中的数字来选择职业!\n";	
	    }break; 
	    case 4:
	    	while (1)
		{
		   		cout << "请选择您的职业(4祭司,5巫师):"; //元素所选职业
		    cin>>get_profession;
		    if (get_profession==4||get_profession==5)                //判断输入是否符合要求
		    {
			    break;
		    }                                            //正确则跳出
		    else
			    cout << "请根据括号中的数字来选择职业!\n";	
	    }break; 
	return get_profession;
    }
}

void get_choice::display() 
{
	cout<<"======================="<<endl;
	cout<<name<<endl;
	cout<<"======================="<<endl;
	cout<<sex[get_sex]<<endl;
	cout<<"======================="<<endl;
	cout<<race[get_race]<<endl;
	cout<<"======================="<<endl;
	cout<<profession[get_profession]<<endl;




} 
void get_choice::randoms()         //力量、敏捷、体力、智力和智慧比例分配 
{
	int temp=100;
	int n;
	if(get_profession>4)
	{
		n=10;
	}
	else{
		n=5;
	}
	srand((unsigned)time(NULL));
	for(int i=0;i<4;i++)
	{
		a[i]=random(n-1,n+1)*profession_attribute[get_profession][i];
		temp-=a[i];
	}
	a[4]=temp;
	a[5]=a[2]*20;
	a[6]=(a[3]+a[4])*10;
	cout<<"======================="<<endl;
	for(int j=0;j<7;j++)
	{
		cout<<b[j]<<":"<<a[j]<<endl;
		cout<<"======================="<<endl;
	 } 
	
}
void output_file(get_choice &get)
{

	ofstream out("人物创建结果.txt");
	out<< "======================="<<endl;
	out<< "姓名 : " << get.name << endl;
	out<< "======================="<<endl;
	out<< "性别 : " << get.sex[get.get_sex]<<endl;
	out<< "======================="<<endl;
	out<< "种族 : " << get.race[get.get_race]<<endl;
	out<< "======================="<<endl;
	out<< "职业 : " <<get.profession[get.get_profession]<<endl;
	out<< "======================="<<endl;
	out<< "力量 : " << get.a[0] << endl;
	out<< "======================="<<endl;
	out<< "敏捷 : " << get.a[1] << endl;
	out<< "======================="<<endl;
	out<< "体力 :  " << get.a[2] << endl;
	out<< "======================="<<endl;
	out<< "智力 : " << get.a[3] << endl;
	out<< "======================="<<endl;
	out<< "智慧 : " << get.a[4] << endl;
	out<< "======================="<<endl;
	out<< "生命值 : " << get.a[5] << endl;
	out<< "======================="<<endl;
	out<< "法力值 : " << get.a[6]<< endl;
	out<< "======================="<<endl;
}
int main()
{
	int n,k=1;
	get_choice get;
	do{
		get.input_name();
	    get.input_sex();
	    get.input_race();
	    get.input_profession();
	    get.display();
	    get.randoms();
	    
	    
	    
	    while(1)
	    {
	    	cout<<"请问对创建的人物属性还满意吗?按 0 确认,按 1 重新创建!"<<endl;
		    cin>>n;
		    if(n!=0&&n!=1)
		    {
			    cout<<"输入错误!"<<endl;
			    continue;
		    }
		    else{
		    	break;
			}
		}
	}while(n!=0);
	
	output_file(get);
	
	return 0;
}
发布了12 篇原创文章 · 获赞 13 · 访问量 5341

猜你喜欢

转载自blog.csdn.net/qq_41522951/article/details/89420721