RPG角色生成器(C++)

1.功能描述
几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。
示例显示界面
2.游戏角色应有的属性
本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
3.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:

种族/职业狂战士圣骑士刺客猎手祭司巫师
人类允许允许允许允许允许允许
精灵不允许不允许允许允许允许允许
兽人允许不允许不允许允许允许不允许
矮人允许允许不允许不允许允许不允许
元素不允许不允许不允许不允许允许允许

所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
4.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:

职业/属性力量敏捷体力智力智慧
狂战士40203055
圣骑士2515302010
刺客2035201510
猎手1540151020
祭司1520153515
巫师1020102040

例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。
然后利用属性值计算生命值和魔法值。
5.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
本程序采用C++编写,以下为源代码:

/*名字:不超过50个字符。
性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
*/
#include <iostream>
#include <time.h>
#include "math.h"
#include<stdlib.h>
#include<fstream>
#include<string>
using namespace std;
class Role{      //角色类基类,包括玩家的姓名,性别等
public :
	char Name[50];//姓名
	int sex;//选择性别
	string Sex;//性别
	void get_Name();//从键盘中输入姓名
	void get_sex();//获取性别
};
void Role::get_Name()
{
	cout << "请输入游戏角色姓名:" << endl;
	cin >> Name;
	cout<<"您创建的游戏角色名为:" << Name<<endl;
}
void Role::get_sex()
{
	int flag=1;//标志,如果输入性别正确,则退出循环,否则继续循环
	cout << "请选择创建角色的性别:" << endl;
	cout << "1.男性,2.女性" << endl;
	cin >> sex;
		switch (sex){
		case 1:
			Sex="男性";
			cout <<"您选择的角色性别为:"<< Sex<<endl;
			flag = 0;//赋值为0,退出循环
			break;
		case 2:
			Sex="女性";
			cout <<"您选择的角色性别为:"<< Sex << endl;
			flag = 0;
			break;
		default:
			cout << "输入错误,请重新输入" << endl;
		}
}
class Race:public Role//基类的派生类,种族类和职业类
{
public:
	int pro;//选择职业
	int race;//选择种族
	string RACE;//种族
	string PRO;//职业
	void get_Race();//获取种族的函数
	void get_Pro();//获取职业函数
};
void Race::get_Race()
{
	cout << "请为角色选择种族" << endl;
	cout << "1.人类,2.精灵,3.兽人,4.矮人,5.元素" << endl;
	cin >> race;
	switch (race)
	{
	case 1:
		RACE = "人类";		
		cout <<"您选择的种族为:"<< RACE;
		break;
	case 2:
		RACE = "精灵";
		cout << "您选择的种族为:" << RACE;
		break;
	case 3:
		RACE = "兽人";
		cout << "您选择的种族为:" << RACE;
		break;
	case 4:
		RACE = "矮人";
		cout << "您选择的种族为:" << RACE;
		break;
	case 5:
		RACE = "元素";
		cout << "您选择的种族为:" << RACE;
		break;
	default:
		cout << "选择错误,请重新选择" << endl;
		break;
	}
}
/*种族	狂战士	圣骑士	刺客	猎手	祭司	巫师
人类	允许	允许	允许	允许	允许	允许
精灵	不允许	不允许	允许	允许	允许	允许
兽人	允许	不允许	不允许	允许	允许	不允许
矮人	允许	允许	不允许	不允许	允许	不允许
元素	不允许	不允许	不允许	不允许	允许	允许
*/
void Race::get_Pro()
{
	switch (race)
	{
	case 1:
		cout<< "可选职业为" << endl;
		cout << "1.狂战士 2.圣骑士 3.刺客 4.猎手 5.祭司 6.巫师" << endl;
		break;
	case 2:
		cout << "可选职业为" << endl;
		cout << "3.刺客	4.猎手 5.祭司 6.巫师" << endl;
		break;
	case 3:
		cout << "可选职业为" << endl;
		cout << "1.狂战士 4.猎手 5.祭司"<< endl;
		break;
	case 4:
		cout << "可选职业为" << endl;
		cout << "1.狂战士 2.圣骑士 5.祭司	" << endl;
		break;
	case 5:
		cout << "可选职业为" << endl;
		cout << "5.祭司 6.巫师" << endl;
		break;
	}
	cin >> pro;
	switch (pro){
	case 1: PRO = "狂战士";break;
	case 2: PRO = "圣骑士";break;
	case 3: PRO = "刺客";break;
	case 4: PRO = "猎手"; break;
	case 5: PRO = "祭司"; break;
	case 6: PRO = "巫师"; break;
	}
	cout << "您选择的种族为" << RACE << endl;
	cout<< "您选择的职业为" << PRO << endl;
}
/*力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),
但是五项属性的总和应该是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
生命值 = 体力 * 20。
魔法值 = (智力 + 智慧) * 10。
*/
class Nature :public Race//属性
{
public:
	int STR;//力量
	int AGL;//敏捷
	int	VIT;//体力
	int INT;//智力
	int WIS;//智慧
	int HP;//生命值
	int MP;//魔法值
	int nature_Random(int num1,int num2,int num3,int num4,int num5);//随机生成属性函数及五个属性初值
	int nature(int pro);//取决于职业的属性偏差
};
/*随机数生成角色属性*/
int Nature::nature_Random(int num1, int num2, int num3, int num4, int num5)
{
	int sum;//属性值总和
	srand((unsigned)time(NULL));
	do
	{
		STR = rand() % 10 + num1;//力量
		AGL = rand() % 10 + num2;//敏捷
		VIT = rand() % 10 + num3;//体力
		INT = rand() % 10 + num4;//智力
		WIS = rand() % 10 + num5;//智慧
		sum = STR + AGL + VIT + INT + WIS;//总和
	} while (sum!=100);
	HP = VIT * 20;//生命值
	MP = (INT + WIS) * 10;//魔法值
	return 0;
}
//取决于职业的属性生成值
int Nature::nature(int pro)
{
	if (pro == 1) nature_Random(35, 15, 25, 5, 5);//狂战士的基础属性	
	if (pro == 2) nature_Random(20, 10, 25, 15, 15);//圣骑士的基础属性
	if (pro == 3) nature_Random(15, 30, 15, 10, 15);//刺客的基础属性
	if (pro == 4) nature_Random(10, 35, 10, 5, 25);//猎手的基础属性
	if (pro == 5) nature_Random(10, 25, 10, 30, 20);//祭司的基础属性
	if (pro == 6) nature_Random(5, 15, 5, 15, 45);//巫师的基础属性
	return 0;
}
/*向界面输出角色信息*/
void show(Role &l, Race &r, Nature &n)
{
	cout << endl;
	cout << "**********************************************************" << endl; 
	cout << "\t姓名\t\t\t" << n.Name << endl;
	cout << "**********************************************************" << endl;
	cout << "\t性别\t\t\t" << n.Sex << endl;
	cout << "**********************************************************" << endl;
	cout << "\t种族\t\t\t" << r.RACE << endl;
	cout << "**********************************************************" << endl;
	cout << "\t职业\t\t\t" << r.PRO << endl;
	cout << "**********************************************************" << endl;
	cout << "\t力量\t\t\t" << n.STR << endl;
	cout << "**********************************************************" << endl;
	cout << "\t敏捷\t\t\t" << n.AGL << endl;
	cout << "**********************************************************" << endl;
	cout << " \t体力\t\t\t" << n.VIT << endl;
	cout << "**********************************************************" << endl;
	cout << "\t智力\t\t\t" << n.INT << endl;
	cout << "**********************************************************" << endl;
	cout << "\t智慧\t\t\t" << n.WIS << endl;
	cout << "**********************************************************" << endl;
	cout << "\t生命值\t\t\t" << n.HP << endl;
	cout << "**********************************************************" << endl;
	cout << "\t魔法值\t\t\t" << n.MP << endl;
	cout << "**********************************************************" << endl;
}
/*写入文件函数,保存创建角色的信息*/
void File(Role &l, Race &r, Nature &n)
{
	ofstream f1("D:\\save.txt");//若文件存在,则直接更新写入;若不存在,则创建文件再写入
	f1 << "您创建的角色信息如下" << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t姓名\t\t\t" << n.Name << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t性别\t\t\t" << n.Sex << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t种族\t\t\t" << r.RACE << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t职业\t\t\t" << r.PRO<< endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t力量\t\t\t" << n.STR << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t敏捷\t\t\t" << n.AGL << endl;
	f1 << "**********************************************************" << endl;
	f1 << " \t体力\t\t\t" << n.VIT << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t智力\t\t\t" << n.INT << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t智慧\t\t\t" << n.WIS << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t生命值\t\t\t" << n.HP << endl;
	f1 << "**********************************************************" << endl;
	f1 << "\t魔法值\t\t\t" << n.MP << endl;
	f1 << "**********************************************************" << endl;

}
int main()
{
	Nature n;
	Role l;
	Race r;
	int x;
	int a;
	n.get_Name();
	n.get_sex();
	r.get_Race();
	r.get_Pro();
	do{
		n.nature(r.pro);
		show(l, r, n);
		cout << "请核对您所创建的角色属性,满意请输入 0,不满意请输入1" << endl;
		cin >> x;
	} while (x);
	cout << "是否要保存角色信息至文件" << endl;
	cout << "需要保存请输入0,不需要请输入1" << endl;
	cin >> a;
	switch (a)
	{
	case 0:
		File(l, r, n);
		cout << "保存成功" << endl;
		break;
	case 1:
		cout << "您的角色信息将无法保存" << endl;
		break;
	}
	
	return 0;
}


类图:
程序类图

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用DDraw实现射击游戏说明文档 要点一:画图自动切割 IDirectDrawSurface7::BltFast()方法中没有自动切割功能,即当画图元素超出窗口以外时不会自动切割,DDraw选择自动忽略不画,造成一旦超出窗口,画图元素会突然消失。 解决这一问题的方法是手动切割,代码如下: //自动切割 RECT scRect; //存放当前窗口大小区域 ZeroMemory( &scRect, sizeof( scRect ) ); GetWindowRect( GetActiveWindow(), &scRect ); //防止图片左上角超过窗口左上角 if ( x < 0 ) { m_rect.left -= x; x = 0; } if ( y scRect.right ? scRect.right : x; y = y > scRect.bottom ? scRect.bottom : y; m_rect.right = x + m_rect.right - m_rect.left > scRect.right ? scRect.right - x + m_rect.left : m_rect.right; m_rect.bottom = y + m_rect.bottom - m_rect.top > scRect.bottom ? scRect.bottom - y + m_rect.top : m_rect.bottom; 只需将上述代码加在CGraphic::BltBBuffer() 中的m_bRect = m_rect; 前即可。 要点二:背景的滚轴实现 画背景可以分为以下三种情况: 情况一:背景图片与窗口等高 情况二:背景图片高度小于窗口高度 情况三:背景图片高度大于窗口高度 上述讲解图与代码相对应地看,有助于容易理解。 另外,要点一实现之后,由于已经可以自动切割,画背景可以用其它方法。 要点三:精灵图的实现 在游戏中,如RPG游戏中的人物图、射击类游戏的飞机、爆炸等,叫做精灵图。 精灵图实际上是将所有帧的图片放在一个文件中,游戏时靠一个RECT来控制画图像文件中的哪一部分,进而控制游戏显示哪一帧图,只需控制好RECT的位置即可。如下图: 控制RECT的四个角的坐标的移动,有以下代码: if (m_timeEnd – m_timeStart > 100) //只有到了100ms之后才绘图 { m_ImageID++; if(m_ImageID - m_beginID >= num) { m_ImageID = m_beginID; //最后一帧的下一帧是第一帧 } m_timeStart = timeGetTime(); } int id = m_ImageID++; SetRect(&m_rect, 41 * id, 0, 41 * (id + 1), 41); //飞机精灵图大小是41×41 m_pGraph->BltBBuffer(m_pImageBuffer, true, m_Pos.x, m_Pos.y, m_rect); 这样就实现了精灵动画的效果。 要点四:拿STL进行子弹的实现 子弹的实现可以使用STL中的vector,当按下开火键时发出一颗子弹,就往vector中添加一个结点;当子弹飞出窗口或击中敌机时,再将结点从vector中删除。每帧游戏画面中子弹飞行时只需将vector中的所有子弹进行处理、绘画即可。 参考代码如下: 1.添加子弹 if (g_ctrlDown) //当ctrl键按下时开炮! { m_BulletEnd = m_Gtime->GetTime(); if ((m_BulletEnd - m_BulletStart) * 1000 > 120) //如果连续按着开火键不放,这里控制不会发出太多子弹 { m_BulletStart = m_BulletEnd; MBULLET tmpBullet; tmpBullet.pos.x = m_SPos.x - 1; //记录开火时的子弹位置 tmpBullet.pos.y = m_SPos.y - 26; tmpBullet.speed = 5; //该子弹的飞行速度 m_BulletList.push_back(tmpBullet); //将子弹添加到vector中
c RPG角色扮演)文字游戏,是一种通过文字表达和操作进行游戏剧情展开的角色扮演游戏。在这种游戏中,玩家扮演一个虚拟角色,通过与NPC(非玩家角色)的交互、探索地图、解谜、进行战斗等方式推动游戏剧情的发展。 c RPG文字游戏通常以文字为主要形式,通过文本描述场景、人物对话和角色行动等,玩家需要阅读和理解游戏中的文字信息,并根据游戏情节作出选择和决策,影响游戏剧情的发展。这种游戏形式往往讲究玩家的想象力和思考能力,让玩家能够自由地创造和参与游戏世界。 c RPG文字游戏通常也会包含战斗系统,玩家需要控制自己的角色与敌人进行战斗。在战斗中,玩家可以选择使用不同的技能或道具来攻击敌人,并根据敌人的状态和特点选择合适的战术。玩家可以通过不断提升角色的等级和经验值来提升角色的属性和能力,以应对更强大的敌人挑战。 c RPG文字游戏还通常拥有庞大的游戏世界和复杂的剧情。玩家可以在游戏中探索各种不同的地点,与各种各样的NPC交流,并根据游戏设定和任务完成各种挑战。玩家的决策和行动会对游戏的结局和故事发展产生影响,增加了游戏的可玩性和沉浸感。 总之,c RPG文字游戏是一种以文字为主要形式展开的角色扮演游戏,通过玩家的选择和决策推动游戏剧情的发展。它注重玩家的思考和创造力,并提供充满挑战和无限可能的游戏体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值