用easyx图形库做一个简单的c++小游戏—障碍跑酷
开发环境:visual c++6.0
库:easyx图形库 下载地址
EasyX(c++图形库) v20200806 官方安装免费版
当时我原本是想模仿做一个Flappy Bird的小游戏,在想如何写的时候突然有了新的想法,就有了这个障碍跑酷的小游戏。(这是我之前写的代码,没有很注重规范,看上去有点乱,但我很尽力的都标上了注释。)
游戏介绍:
1.操控小球,小球一开始只具有左a,右d与跳跃w的功能
2.可根据按1,2,3,4调节小球的跳跃高度
3.在一定时间段内会持续出现障碍,障碍高度不一,需要调节跳跃高度来跳跃通过
4.在1000,2500,4000分数位加大难度(实际就是缩短障碍间的距离),并获取技能点数,可用于增加小球能力
5.触发商店,消耗节能点数可增加血量,减少半径,加快速度,开启下降s功能(四选一)
6.每次死亡后比较现在分数与最高分数,高则替换
游戏界面:
第一难度:分数小于1000
第二难度:分数1300-2500
第三难度:分数2800-4000
第四难度:分数大于4300(有点考验手速)
商店触发界面:(图片是我从百度随便下载的,也不知道出自哪里的)
附上代码: (设置的变量有点多,当时也没规范命名,但我逐个标上了注释)
图片随便用4个就行,记得要修改图片地址
复制代码
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283//操作介绍:a左,d右,w上。1,2,3,4调节跳跃高度 #include <iostream> #include <graphics.h> #include <conio.h> #include <time.h> #include <fstream> using namespace std; int nowscore(0),highscore(0),hp(3),radius(10),speed(3),skill(0); bool under=false; /* nowscore代表现在分数 highscore代表最高分数 hp=代表玩家的血量 speed=玩家的速度 skill代表玩家的技能点数 under为玩家是否拥有的下落能力 */ IMAGE img1,img2,img3,img4; void death(){//死亡记录分数 if(nowscore>highscore){//如果现在分数高于最高分数则替换文件中的分数记录 ofstream out; out.open(".\最高得分.txt");//打开文件 out<<nowscore; out.close(); }//if } void shopshop(){//商店界面 while(1){ settextcolor(DARKGRAY); settextstyle(15,0,"宋体"); setfillcolor(BLACK); //图片加载(图片地址写上自己的图片地址) loadimage(&img1,".\血量增加.jpg",30,30); loadimage(&img2,".\半径变小.jpg",30,30); loadimage(&img3,".\速度加快.jpg",30,30); loadimage(&img4,".\下降技能.jpg",30,30); putimage(50,50,&img1); putimage(50,100,&img2); putimage(50,150,&img3); putimage(50,200,&img4); outtextxy(90,55,"血量加一(1)"); outtextxy(90,105,"半径变小(2)"); outtextxy(90,155,"速度加快(3)"); outtextxy(90,205,"获得下降(按s)加快能力(4)"); FlushBatchDraw(); if(GetKeyState(49)<0&&skill>0){ hp++;//血量加一 skill--;//技能点数减一 break; } if(GetKeyState(50)<0&&skill>0){ radius-=2;//半径减二 skill--;//技能点数减一 break; } if(GetKeyState(51)<0&&skill>0){ speed++;//速度加二 skill--;//技能点数减一 break; } if(GetKeyState(52)<0&&skill>0){ under=true;//开启下降能力 skill--;//技能点数减一 break; } } } int main(){//主函数 int x=250,y=400,jumpspeed=0,id(0),tim(0),way(0),v=10,hphs(-1),shhs(-1),space(0),shopx(510),shopy(390); /* x,y为小球初始坐标 jumpspeed为加速度 id为障碍的记号 tim控制障碍出现间隔时间 way为障碍出现的种类 v为小球初始设置弹跳力高度 hphs为控制小球扣血的间隔时间(刷新间隔快,避免持续扣血) shhs为控制小球触碰商店的间隔时间(刷新间隔快,避免持续触发商店) space为障碍与障碍的间隔距离 shopx,shopy为商店的初始坐标 */ int obstacle[50],obstaclex[50]={-999},obstacley[50]={-999};//设置障碍的变量数组 bool jump=true,hph=true,ob=true,shh=true; /* jump判断小球是否可以跳跃 hph判断小球是否可以扣血,与hphs联系 ob判断是否出现障碍 shh判断商店是否可以触发 */ char c[10]; ifstream in;//读取历史最高分数 in.open(".\最高得分.txt"); in>>highscore; in.close; initgraph(500,500);//作图 BeginBatchDraw();//开始绘图 while(1){ Sleep(50);//每次刷新时间间隔 if(ob==true)tim++; nowscore++; setfillcolor(WHITE); solidrectangle(0,0,500,500); setbkmode(TRANSPARENT); if(hphs==nowscore)hph=true;//间隔时间达到,则开始可触发扣血 if(shhs==nowscore)shh=true;//间隔时间达到,则开始可触发商店 if(nowscore<1000)space=60; if(nowscore==1000){//若分数大于1000,则停止障碍出现,开始出现商店并调整难度,技能点数加一 ob=false; skill+=1; } if(nowscore==1300)ob=true;//难度增加 if(nowscore>=1000&&nowscore<2500){ space=50; if(nowscore<=1050){ settextcolor(RED); settextstyle(50,0,"宋体"); outtextxy(150,175,"加大难度"); }//if if(nowscore>=1150){//第一次商店出现 setfillcolor(CYAN); settextcolor(BLUE); settextstyle(20,0,"宋体"); outtextxy(shopx-10,shopy-20,"商店"); solidrectangle(shopx,shopy,shopx+20,shopy+20); shopx-=2;//商店移动 } }//if if(nowscore==2500){//若分数大于2500,则停止障碍出现,开始出现商店并调整难度,技能点数加一 ob=false; skill+=1; } if(nowscore==2650){//重新设置商店坐标 shopx=490; shopy=390; } if(nowscore==2800)ob=true;//难度增加 if(nowscore>=2500&&nowscore<4000){//难度增加 space=42; if(nowscore<=2550){ settextcolor(RED); settextstyle(50,0,"宋体"); outtextxy(150,175,"加大难度"); }//if if(nowscore>=2650){//第二次商店出现 setfillcolor(CYAN); settextcolor(BLUE); settextstyle(20,0,"宋体"); outtextxy(shopx-10,shopy-20,"商店"); solidrectangle(shopx,shopy,shopx+20,shopy+20); shopx-=2;//商店移动 }//if } if(nowscore==4000){//若分数大于4000,则停止障碍出现,开始出现商店并调整难度,技能点数加一 ob=false; skill+=1; } if(nowscore==4150){//重新设置商店坐标 shopx=490; shopy=390; } if(nowscore==4300)ob=true; if(nowscore>=4000){ space=35; if(nowscore<=4050){ settextcolor(RED); settextstyle(50,0,"宋体"); outtextxy(150,175,"加大难度"); }//if if(nowscore>=4150&&nowscore<=4400){//第三次商店出现 setfillcolor(CYAN); settextcolor(BLUE); settextstyle(20,0,"宋体"); outtextxy(shopx-10,shopy-20,"商店"); solidrectangle(shopx,shopy,shopx+20,shopy+20); shopx-=2;//商店移动 }//if } settextcolor(BLUE); settextstyle(15,0,"宋体"); outtextxy(10,10,"当前分数:"); //分数显示 itoa(nowscore,c,10); outtextxy(80,10,c); outtextxy(10,30,"最高分数:"); itoa(highscore,c,10); outtextxy(80,30,c); if(GetKeyState(49)<0)v=10;//一档弹跳力高度 if(GetKeyState(50)<0)v=15;//二挡弹跳力高度 if(GetKeyState(51)<0)v=20;//三挡弹跳力高度 if(GetKeyState(52)<0)v=25;//四档弹跳力高度 if(y>=410-radius){//跳 jump=true; jumpspeed=0; } if(y<410-radius){ jump=false; jumpspeed+=1; } if(GetKeyState(87)<0&&jump==true){ jump=false; jumpspeed=-v; } if(GetKeyState(65)<0&&x>0/*&&left==true*/)x-=speed;//左 if(GetKeyState(68)<0&&x<500)x+=speed;//右 if(GetKeyState(83)<0&&under==true&&y<=360)y+=4; if(y>410-radius)y=410-radius;//位置归位 y+=jumpspeed; setfillcolor(CYAN);//小球描绘 solidcircle(x,y+10-radius,radius); setfillcolor(RED);//血量描绘 solidrectangle(x-7,y-10-radius,(x-7)+(hp*5),y-5-radius); setfillcolor(BLACK);//地面描绘 solidrectangle(0,410,500,420); if(tim>space){//出现障碍(我根据id是奇数的障碍为上面的障碍,id是偶数的为下面的障碍) if(id>=49)id=0;//障碍记号循环 srand((int)time(0)); way=rand()%4; tim=0;//重置 if(way==0){ obstaclex[id]=490;//偶 obstacley[id]=380; id++; obstaclex[id]=490;//奇 obstacley[id]=320; id++; }//if if(way==1){ obstaclex[id]=490;//偶 obstacley[id]=315; id++; obstaclex[id]=490;//奇 obstacley[id]=255; id++; }//if if(way==2){ obstaclex[id]=490;//偶 obstacley[id]=220; id++; obstaclex[id]=490;//奇 obstacley[id]=160; id++; }//if if(way==3){ obstaclex[id]=490;//偶 obstacley[id]=110; id++; obstaclex[id]=490;//奇 obstacley[id]=50; id++; }//if }//if for(int i(0);i<50;i++){ obstaclex[i]-=2;//障碍移动 if(i%2==0){//偶下 solidrectangle(obstaclex[i],obstacley[i],obstaclex[i]+10,410);//障碍描绘 if((x+radius)>obstaclex[i]&&(x-radius)<obstaclex[i]+10&&(y+radius)>obstacley[i]&&hph==true){//扣血机制 hp--; hph=false; hphs=nowscore+20; }//if }//if if(i%2==1){//奇上 solidrectangle(obstaclex[i],0,obstaclex[i]+10,obstacley[i]);//障碍描绘 if((x+radius)>obstaclex[i]&&(x-radius)<obstaclex[i]+10&&(y-radius)<obstacley[i]&&hph==true){//扣血机制 hp--; hph=false; hphs=nowscore+20; }//if }//if }//for if(hp<=0){//死亡判定 death(); return 0; }//if if((x+radius)>shopx&&(x-radius)<shopx+20&&(y+radius)>shopy&&shh==true&&skill>0){//商店触发机制 shh=false; shhs=nowscore+20; shopshop(); } FlushBatchDraw();//结束绘图 }//while }
感谢你的观看!!!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持靠谱客。
最后
以上就是糟糕百合最近收集整理的关于C++用easyx图形库实现障碍跑酷小游戏的全部内容,更多相关C++用easyx图形库实现障碍跑酷小游戏内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复