龙与地下城

代码参考https://blog.csdn.net/u010056396/article/details/23821789

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

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

例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。然后利用属性值计算生命值和魔法值。

5.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
二、类图设计
在这里插入图片描述

三、程序实现
Life类为生命类,可以设置姓名、性别;
class life//保存角色的姓名,性别
{
protected:
char name[10];
string sex;
public:
void setname();
void setsex();
void display();
};
Race类为种族类,通过setRace选择角色种族;
class Race//种族类
{
protected:
string RaceName ;
public:
void setRace();
};
Occupation类为职业类,通过setocp选择职业;
class occupation //职业类
{
protected:
string OcpName;
public:
void setocp();
occupation()
{
OcpName="";
}
};
Nature类为属性类,有power,speed,physical,intelligence,wisdom5个属性,然后计算出生命值HP和魔法值MP。result函数实现随机分配的五个属性值比设定的值可大可小。Output函数输出5个属性和生命值、魔法值。Setnature函数实现各个职业的各个属性值在与设定值相差4之内随机生成,且属性值和为100.display函数输出姓名name,性别sex,种族RaceName和职业OcpName。File函数将生成的结果存在.txt文件中。
class nature : public Race, public life, public occupation
{
private:
int power , speed , physical , intelligence,wisdom ; //力量 敏捷 体力 智力 智慧
int HP ,MP ; //生命值和魔法值
public:
int result(int x , int y);
int output(int i ,int power1 ,int speed1 , int physical1 ,int intelligence1, int wisdom1);
void setnature();
void display();
void file();
};
四、调试、测试及运行结果
调试结果如下:
在这里插入图片描述

测试结果如下:
① 狂战士力量值最大
在这里插入图片描述

② 圣骑士体力值最大
在这里插入图片描述

③ 刺客敏捷值最大
在这里插入图片描述

④ 猎手敏捷值最大
在这里插入图片描述

⑤ 祭司智力值最大
在这里插入图片描述

⑥ 巫师智慧值最大
在这里插入图片描述

文件如下:
在这里插入图片描述

五、经验归纳

学会了画基本的类图,掌握了面向对象程序设计的方法和面向对象设计七大原则。
了解了#include 头文件的作用。
iomanip的作用:
主要是对cin,cout之类的一些操纵运算子,如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样.以下是一些常见的控制函数的:
dec 置基数为10 相当于"%d"
hex 置基数为16 相当于"%X"
oct 置基数为8 相当于"%o"
setfill© 设填充字符为c
setprecision(n) 设显示小数精度为n位
setw(n) 设域宽为n个字符
这个控制符的意思是保证输出宽度为n。如:
cout<<setw(3)<<1<<setw(3)<<10<<setw(3)<<100;输出结果为
1 10100(默认是右对齐)当输出长度大于3时(<<1000),setw(3)不起作用。
setioflags(ios::fixed) 固定的浮点显示
setioflags(ios::scientific) 指数表示
setiosflags(ios::left) 左对齐
setiosflags(ios::right) 右对齐
setiosflags(ios::skipws 忽略前导空白
setiosflags(ios::uppercase) 16进制数大写输出
setiosflags(ios::lowercase) 16进制小写输出
setiosflags(ios::showpoint) 强制显示小数点
setiosflags(ios::showpos) 强制显示符号
源代码如下:

/**
题目:面向对象程序设计方法
实验目的:1.掌握面向对象程序设计方法。明确类与对象的概念,掌握面向对象设计七大原则;
		  2.掌握常见的设计模式以及类图的描述。
实验要求:
          1.题目分析  2.类图设计:使用UML的类图结构设计,要求遵循面向对象设计的7大原则,使用适合的设计模式
		  3.程序实现:程序源代码,优化功能请在注释中进行说明 4.调试、测试及运行结果
		  5.经验归纳
         
实现方法:C++实现

创建人:软件工程1704班 赵茹平

创建时间:2019年4月16日

最后一次修改时间:2019年4月20日
**/
 
#include<iostream>
#include<string>
#include<time.h>
#include<stdlib.h>
#include<iomanip>//I/O流控制头文件
#include<fstream>
#include<math.h>
#include<conio.h>
using namespace std;
class life//保存角色的姓名,性别
{
	protected:
		char name[10];
		string sex;
	public:
		void setname();
		void setsex();
	//	void display();
};
 void life::setname()
{
	cout<<"请输入姓名:"; 
	gets(name) ; 
}
void  life::setsex( )
{
	int i ;
	cout<<"请选择性别:0男 1女:";
	cin>>i ;
	if(i == 0)
	{
		sex = "男"; 
	} 
	if(i == 1)
	{
		sex = "女"; 
	}
}
int i ;
int j ;
string stropc[5][6] = {
                       {"狂战士","圣骑士","刺客","猎手","祭司","巫师"},//人类
					   {"刺客","猎手","祭司" ,"巫师"},//精灵
					   {"狂战士","猎手","祭司"},//瘦人
					   {"狂战士","圣骑士","祭司"},//矮人
					   {"祭司","巫师"}//元素
					  } ;
class Race//种族类
{
	protected:
	string RaceName ;
	public:
	void setRace();
};
void  Race::setRace()
{
		
	cout<<"选择您游戏角色的种族: 0人类 1精灵 2兽人 3矮人 4元素 5自定义:";
	cin>>i ;
	switch(i)
	{
		case 0: RaceName = "人类" ; break;
		case 1: RaceName = "精灵" ; break;
		case 2: RaceName = "兽人" ; break;
		case 3: RaceName = "矮人" ; break; 
        case 4: RaceName = "元素" ; break; 
        case 5: cout<<"输入种族名:";cin>>RaceName ; break; 

	}

}




class occupation //职业类
{
	protected:
		string OcpName;
	public:
		void setocp();
		occupation()
		{
			OcpName="";
		}
};
void occupation::setocp()
{
	switch(i)
	{
		case 0:cout<<"请选择您的职业0狂战士 1圣骑士 2刺客 3猎手 4祭司 5巫师:";
		   	   cin>>j ;break; 
		case 1:cout<<"请选择您的职业0刺客 1猎手 2祭司 3巫师:";
		   	   cin>>j ;break; 
		case 2:cout<<"请选择您的职业0狂战士 1猎手 2祭司:";
		   	   cin>>j ;break; 
		case 3:cout<<"请选择您的职业0狂战士 1圣骑士 2祭司: ";
		   	   cin>>j ;break; 
		case 4:cout<<"请选择您的职业0祭司 1巫师:";
		   	   cin>>j ;break; 
		case 5:cout<<"自定义: ";
		   	   cin>>j ;break;
		   	   if(j == 7)
		   	   {
		   		  cout<<"输入职业" ;
		   		  cin>>OcpName;
		   	   } break; 
	}
	   if(i != 6 && j != 7)
		{
     		OcpName = stropc[i][j];
		}
}
class nature :  public Race, public life, public occupation
{
	private:
		int power , speed , physical , intelligence,wisdom ; //力量 敏捷 体力 智力 智慧
		int HP ,MP ;             //生命值和魔法值 
	public:
		int result(int x , int y);
		int output(int i ,int power1 ,int speed1 , int physical1 ,int intelligence1, int wisdom1);
		void setnature();
		void display();
		void file();
};
		int nature::result(int x , int y)
		{ 
		    srand(time(NULL));
			int z ; 
			z = rand()%2; //Z为0或1  
			if(z == 0)
			{
		       return x+y ;//使数值随机变大		
			}
			else
			{
				return y-x ;//使数值随机变小
			}
		}
		int nature::output(int i ,int power1 ,int speed1 , int physical1 ,int intelligence1, int wisdom1  )
		{
			int sum = 0; 
			int a[5] ,w ;
			a[0] = result(i, power1);
			a[1] = result(i, speed1) ;
			a[2] = result(i, physical1) ;
			a[3] = result(i, intelligence1);
			a[4] = result(i, wisdom1) ;
			sum = a[0] + a[1] + a[2] + a[3] + a[4] ;
			sum-=100 ;  
            if(sum >0)
            {
               for(w = 0;sum != 0 ; sum-- )
               {
               	   a[w]-- ;
               	   w++ ;
               	   if(w == 5)
               	   {
               	   	w = 0 ;
               	   }
               }
            }
            if(sum < 0)
            {
               for(w = 0;sum!= 0 ; sum++ )

{

	 a[w]++ ;

	 i++ ;

	 if(w == 5)

	 {

	 	w = 0 ;

	 }

}

}

		 power=a[0]; speed = a[1] ; physical = a[2] ; intelligence = a[3] ; wisdom = a[4] ; 

		 HP = physical * 20 ;//生命值

		 MP = (intelligence + wisdom) * 10 ;//魔法值

		 	cout<<"=====================================\n";

			cout<<"力量\t\t\t\t";

			cout<<power <<endl;

			cout<<"=====================================\n";

			cout<<"敏捷\t\t\t\t";

			cout<<speed <<endl;

			cout<<"=====================================\n";

			cout<<"体力\t\t\t\t";

			cout<<physical<<endl;

			cout<<"=====================================\n";

			cout<<"智力\t\t\t\t";

			cout<<intelligence<<endl; 

			cout<<"=====================================\n";

			cout<<"智慧\t\t\t\t";

			cout<<wisdom<<endl; 

			cout<<"=====================================\n";

			cout<<"生命值\t\t\t\t";

			cout<<HP<<endl;

			cout<<"=====================================\n";

			cout<<"魔法值\t\t\t\t";

			cout<<MP<<endl;
			cout<<"=====================================\n";

		    return 0;
		}


 

void nature::setnature()

		{

			if(OcpName =="狂战士")

			 output(rand()%5,40,20,30,5,5) ;

			if(OcpName =="圣骑士")

			 output(rand()%5,25,15,30,20,10) ;

			if(OcpName =="刺客")

			 output(rand()%5,20,35,20,15,10) ;

			if(OcpName =="猎手")

			 output(rand()%5,15,40,15,10,20) ;	

			if(OcpName =="祭司")

			 output(rand()%5,15,20,15,35,15) ;

			if(OcpName =="巫师")

			 output(rand()%5,10,20,10,20,40) ;

		}

			

void nature::display()

{

	cout<<"name:"<<name<<endl;

	cout<<"sex:"<<sex<<endl;

	cout<<"RaceName:"<<RaceName<<endl;

	cout<<"OcpName:"<<OcpName<<endl;

}

void nature::file()

{

	ofstream f1("角色.txt",ios::app);

if(!f1) 

return ;

    f1<<setw(20)<<"姓名:"<<name<<endl;

	f1<<setw(20)<<"性别:"<<sex<<endl;

	f1<<setw(20)<<"种族:"<<RaceName<<endl;

	f1<<setw(20)<<"职业:"<<OcpName<<endl;

	f1<<"=====================================\n";

	f1<<"力量\t\t\t\t"<<power<<endl;// power  	 

	f1<<"=====================================\n"; 

	f1<<"敏捷\t\t\t\t"<<speed<<endl;//speed

	f1<<"=====================================\n";

	f1<<"体力\t\t\t\t"<<physical<<endl;//physical

    f1<<"=====================================\n";

	f1<<"智力\t\t\t\t"<<intelligence<<endl;//intelligence

	f1<<"=====================================\n";

	f1<<"智慧\t\t\t\t"<<wisdom<<endl;//wisdom
	
	f1<<"=====================================\n";
	
	f1<<"生命值\t\t\t\t"<<HP<<endl;
	
	f1<<"=====================================\n";
	
	f1<<"魔法值\t\t\t\t"<<MP<<endl;
	
	f1<<"=====================================\n";

	f1.close(); 

}

int main()

{

nature N ;

char choice = 'Y';

while(1)

{

	N.setname();

	N.setsex();

	N.setRace();

	N.setocp();

	N.display();

	N.setnature() ;

	cout<<"是否创建角色(Y or N)"<<endl; 

	cin >>choice ; 

	if(choice == 'Y')

	break;

	else

	if(choice == 'N')

	system("cls");

	getch();

}

N.file();

cout<<"创建成功"<<endl; 

	return 0 ;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿哈哈~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值