RPG游戏角色的建立
1. 题目分析:
题目要求:本次题目是做一个RPG游戏角色的建立。游戏角色包含以下属性:姓名,性别,种族,职业,以及角色的力量、敏捷、体力、智力、智慧、生命值和魔法值。要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
具体分析:创建的角色包含多个不同属性,需要用面对对象编程思想。建立包含角色属性的类,并且可以对这些属性变量进行具体的操作,角色的性别和种族均是由用户进行选择的,应注明选择标识,题目中每个种族选择职业时,有一定的约束条件,(譬如精灵的职业不允许时圣骑士和狂战士,那么当用户选择角色是精灵,选择职业时若选到的是圣骑士或者是狂战士,将会让其重新选择角色职业。)随机分配角色力量、敏捷、体力、智力和智慧属性的值。但是总和必须等于100.最后再计算角色的生命值和智慧值。(生命值=体力20。
魔法值=(智力+智慧)10。)。
2 .算法分析
① C++建立类(包含角色的各个属性变量)。建立类role包含角色的姓名,性别,设置成员函数getrole()(输入角色姓名,对角色性别进行选择,选择标志schoice,值为1是女性,为2是男性,若用户输入了其他值,将重新进行性别选择;建立类type继承类role,包含角色的种族和职业属性。并设置了成员函数gettype()(对成员变量种族和职业进行赋值,对角色种族进行选择选择标志rchioce值为1~5之间的整数,当玩家输入其他值时将重新进行种族选择。当玩家选择某一种族时,接着会输出该种族可以选择的职业,随后玩家选择职业时,若选择了该种族不允许的职业,将重新进行职业选择。建立类attract继承类type包含角色的力量、敏捷、体力、智力和智慧属性,生命值和魔法值。运用随机函数rand()对各个属性进行赋值(为避免各个职业的技能各项值比例发生较大改变,所以随机生成的是最小值得变化量),当各项数值综合为100时,就得到当前创建角色属性的各项值。
② 将建立角色的各个信息存入到文件。C++在进行文件操作时,需要包含文件读写头文件,在c++中文件打开方式有ios::app(以追加方式打开文件)、ios::ate(文件打开后定位到文件尾)、ios::binary(以二进制方式打开文件)、ios::in(文件以输入方式打开(文件数据存到内存))、ios::out(文件以输出方打开(内存数据输入到文件))、ios::trunc(如果文件存在则将文件的长度设为0)。将数据读入到文件后关闭文件。
3. 程序实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171#include<iostream> #include<fstream> #include <time.h> #include"string"//涵盖字符串函数 using namespace std;//声明命名空间 class role//定义包含姓名和性别基类 {public: char name[50]; string sex; int schoice; void getrole()//输入当前对象的姓名和性别 {cout<<"请输入角色名"<<endl; cin>>name; cout<<"请选择角色性别(1-----女t2----男)"<<endl; cin>>schoice; switch(schoice)//进行性别选择 { case 1:sex="女";break; case 2:sex="男";break; default:cout<<"输入错误,请重新选择"<<endl;break; } }; }; class type:public role//种族类包含职业和种族 {public: string racal;//种族 string job;//职业 int rchoice; int jchoice; void gettype()//给角色的种族和职业赋值 {getrole(); int tag=1,sign=1; while(tag) { cout<<"请选择角色种族"<<"1.人类 2.精灵 3.兽人 4.矮人 5.元素"<<endl; cin>>rchoice; if(rchoice)//进行职业选择 { switch(rchoice)//进行种族选择 { case 1:{racal="人类"; cout<<"可以选择职业:1.狂战士 2.圣骑士 3.刺客 4.猎手 5.祭司 6.巫师"<<endl; }break; case 2:{racal="精灵"; cout<<"可以选择职业:3.刺客 4.猎手 5.祭司 6.巫师"<<endl; }break; case 3:{racal="兽人"; cout<<"可以选择职业:1.狂战士 4.猎手 5.祭司"<<endl; }break; case 4:{racal="矮人"; cout<<"可以选择职业:1.狂战士 2.圣骑士 5.祭司"<<endl; }break; case 5:{racal="元素"; cout<<"可以选择职业:5.祭司 6.巫师"<<endl; }break; } tag=0; } else tag=1; } while(1) { cout<<"请进行职业选择1.狂战士 2.圣骑士 3.刺客 4.猎手 5.祭司 6.巫师"<<endl; cin>>jchoice; if(rchoice=1&&jchoice>0)//人类可以选择职业:1.狂战士 2.圣骑士 3.刺客 4.猎手 5.祭司 6.巫师 break; else if(rchoice==2&&jchoice>2)//精灵可以选择职业:3.刺客 4.猎手 5.祭司 6.巫师 break; else if((rchoice==3&&jchoice==1)||(rchoice==3&&jchoice==4)||rchoice==3&&jchoice==5) break;//兽人可以选择职业1.狂战士 4.猎手 5.祭司 else if((rchoice==4&&jchoice==1)||(rchoice==4&&jchoice==2)||(rchoice==4&&jchoice==5)) break;//矮人可以选择职业1.狂战士 2.圣骑士 5.祭司 else if((rchoice==5&&jchoice==5)||(rchoice==5&&jchoice==6)) break;//元素可以选择职业5.祭司 6.巫师 else cout<<"选择职业错误,请重新选择"<<endl; } while(sign) { switch(jchoice)//进行职业选择 {case 1:job="狂战士";sign=0;break; case 2:job="圣骑士";sign=0;break; case 3:job="刺客";sign=0;break; case 4:job="猎手";sign=0;break; case 5:job="祭司";sign=0;break; case 6:job="巫师";sign=0;break; default:cout<<"输入错误,请重新选择"<<endl;break; } } }; }; class attract:public type//角色特性类 {public: int strength;//力量 int quick;//敏捷 int body;//体力 int intell;//智力 int wisdom;//智慧 int life;//生命值 int magic;//魔法值 void getattract(int s,int q,int b,int i,int w)//给角色各个特性赋任意值 { int sum=0; srand((unsigned)time(NULL)); while(sum!=100)//各个特性综合为100 {strength=s+rand()%10;//调用随机函数 quick=q+rand()%10; body=b+rand()%10; intell=i+rand()%10; wisdom=w+rand()%10; sum=strength+quick+body+intell+wisdom; } life=body*20;//计算生命值 magic=(intell+wisdom)*10;//计算魔法值 cout<<"姓名 "<<name<<endl;; cout<<"人物性别 "<<sex<<endl; cout<<"种族 "<<racal<<endl; cout<<"职业 "<<job<<endl; cout<<"力量 "<<strength<<endl; cout<<"敏捷 "<<quick<<endl; cout<<"体力 "<<body<<endl; cout<<"智力 "<<intell<<endl; cout<<"智慧 "<<wisdom<<endl; cout<<"生命值 "<<life<<endl; cout<<"魔法值 "<<magic<<endl; }; void getchoice()//给各项特性赋最小值 {gettype(); switch(jchoice) { case 1:getattract(40,20,30,5,5);break;//狂战士 case 2:getattract(25,15,30,20,10);break;//圣骑士 case 3:getattract(20,35,20,15,10);break;//刺客 case 4:getattract(15,40,15,10,20);break;//猎手 case 5:getattract(15,20,15,35,15);break;//祭司 case 6:getattract(10,20,10,20,40);break;//巫师 } }; }; void main() {attract a;//生成一个角色对象 ofstream p("message.txt",ios::app||ios::ate||ios::out);/*ios::app表示文件在打开后,在写入文件不会覆盖源文件中的内容*/ int singla=1; int con; while(singla)//定义循环用户满意则将建立角色信息存到文件中 {a.getchoice(); cout<<"是否满意你建立的对象1.满意,将建立角色信息存到文档中2.不满意,重新建立一个角色"<<endl; cin>>con; switch(con) {case 1:{p<<" 姓名:"<<a.name<<" 性别:"<<a.sex<<" 种族:"<<a.racal<<" 职业:"<<a.job<<" 力量:"<<a.strength<<" 敏捷:"<<a.quick<<" 体力:"<<a.body<<" 智力:"<<a.intell<<" 智慧:"<<a.wisdom<<" 生命值:"<<a.life<<" 魔法值:"<<a.magic<<endl; singla=0;//写入文件结束循环 p.close();//关闭文件 } break; case 2:break;} } }
4 .测试调试和运行结果
运行结果
测试结果
① 测试类role的成员函数getrole()
② 测试类type的成员函数gettype()
③ 测试类attract的成员函数getattract()和getchoice()
调试结果
5.实验总结
本次题目是做一个RPG游戏角色的建立。游戏角色包含以下属性:姓名,性别,种族,职业,以及角色的力量、敏捷、体力、智力、智慧、生命值和魔法值。要求首先用户输入角色姓名,然后由用户选择角色性别,然后由用户选择种族,然后选择职业,然后自动分配力量、敏捷、体力、智力和智慧属性,并计算生命值和魔法值。
此次实验用到了面向对象程序设计的方法,要求掌握面向对象设计七大原则,用的是c++面向对象编程,开始的想法是:由于创建的角色包含多个不同属性,需要用面向对象编程思想。建立包含角色属性的类,并且可以对这些属性变量进行具体的操作,角色的性别和种族均是由用户进行选择的,应注明选择标识,题目中每个种族选择职业时,有一定的约束条件,随机分配角色力量、敏捷、体力、智力和智慧属性的值。但是总和必须等于100.最后再计算角色的生命值和智慧值。
我在编程过程中遇到的困难有:c++很长时间没用了,对其头文件声明方法不太清楚,以至于头文件声明出现错误。经过翻阅c++书(谭浩强著《c++基础编程教程》)了解到:由系统提供的头文件不带后缀.h由用户自己编制的头文件可以后缀.h。在c++中可以用c语言中的头文件.h。c++读写文件方式与c不同:c++中有三个对文件进行操作的类①ifstream类,从istream中派生而来,用来支持从磁盘文件的输入。②ofstream类,从ostream中派生而来,用来支持向磁盘文件的输出。③fstream类,从iosream派生而来,支持磁盘文件的输入与输出。此外对磁盘文件的操作是通过文件流对象实现的不是cin或者cout.文件流对象是用文件流类来定义的。Ofstream p;调用文件流的成员函数open打开文件open(磁盘文件名,输入输出方式);在c++中文件打开方式有ios::app(以追加方式打开文件)、ios::ate(文件打开后定位到文件尾)、ios::binary(以二进制方式打开文件)、ios::in(文件以输入方式打开(文件数据存到内存))、ios::out(文件以输出方打开(内存数据输入到文件))、ios::trunc(如果文件存在则将文件的长度设为0)。将数据读入到文件后关闭文件。
通过这次实验我得到的感悟是:遇到困难时的心态要平和,冷静地去查找问题并解决问题。注意知识的总结和积累。最近,其实不止是本次程序实验带给我的收获,就是作为一个合格的程序员,要注意对知识的积累和知识体系的梳理,每隔一段时间就应该对自己近期的工作有个小结和反思,只有这样,才能不断进步。
最后
以上就是留胡子蛋挞最近收集整理的关于RPG游戏角色的建立的全部内容,更多相关RPG游戏角色内容请搜索靠谱客的其他文章。
发表评论 取消回复