ddo
代码参考https://blog.csdn.net/u010056396/article/details/23821789
一、题目分析
1.功能描述:几乎所有的RPG游戏(一种源自《龙与地下城》的游戏类型)在进入游戏时都会让用户自己来创建自己喜欢的角色。本次上机要求编写一个简化的创建游戏角色的程序。
2.游戏角色应有的属性本题目要求的游戏角色应有以下属性:名字、性别、种族、职业、力量、敏捷、体力、智力、智慧、生命值和魔法值。
名字:不超过50个字符。性别:可以选择男性和女性。
种族:一共可选五个种族,人类、精灵、兽人、矮人和元素。
职业:可选六种职业,狂战士、圣骑士、刺客、猎手、祭司和巫师。
其余属性均为整数。
本题目要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
生命值=体力*20。
魔法值=(智力+智慧)*10。
3.职业限制
很多职业会限制某些种族选择,例如兽人不能就职圣骑士等等,种族和职业的限制表如下:
所以在要求用户选择职业时,输出信息里面只能有用户所选择种族可以就职的职业。
4.初始属性
本题目要求力量、敏捷、体力、智力和智慧要求是随机值(利用随机数函数来取得随机数),但是五项属性的总和应该是100,并且应该和职业相关。例如狂战士的体力和力量就要比较高,而巫师需要较高的智力,而祭司则需要较高的智慧。各职业初始属性的大致比例应遵从下表:
例如,前面示意图中的祭司的初始属性,大致满足该比例,但是应该是随机的。然后利用属性值计算生命值和魔法值。
5.显示信息
最后向用户显示该角色的所有信息,然后询问用户是否满意,如用户不满意则重新创建,若用户满意则程序结束,并将用户创建角色的相关信息写入文件保存。
三、程序实现
Life类为生命类,可以设置姓名、性别;
class life//保存角色的姓名,性别
{
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 ;
}
相关阅读
在之前的文章里,我介绍了任务相关功能的设计思路。无论是Worktile6.0,还是Teambition,Trello,基本上都是由任务组成了项目。然而,Workt
互联网金融行业的发展已至新阶段:行业的自我净化在充分进行,合规化建设正如火如荼。在此背景下,互联网金融平台间也在进行激烈的
天龙八部单机修改之解决地图上限报错有时候会碰到版本架设好以后点击任何副本都提示副本上限进不去的情况,这种情形是sence.lua被
2019年7月1日,越南下龙湾,碧空如洗,人气鼎沸,DA-DAPPS全球生态应用发布会在此拉开帷幕。此次会议邀约了众多区块链大咖共同深入探
高通骁龙626和骁龙660哪个好?本月,魅族一口气发布了三款新机。分别是魅族M5、魅族15和魅族15 Plus,对于这三款新机由于定价不同,自然