当前位置:   article > 正文

基于easyX制作的C语言小游戏_easyx游戏

easyx游戏

目录

游戏内容

 开始界面

加载界面 

 游戏界面

游戏胜利界面 

 选择难度界面

游戏介绍界面 

 上代码!

头文件

定义数据

自定义函数

全局变量

窗口类函数

开始界面

加载窗口

游戏界面

难度选择窗口 

游戏介绍窗口 

游戏胜利界面 

 判断角色是否位于云上,使其不下落

显示游戏时间

血条

小怪NPC

游戏胜利道具

扣血判定

判定游戏胜利——抓住皮卡丘

游戏暂停键

模块类

正常状态按钮

选中状态按钮

游戏开始界面点击选项事件

难度选择按钮设置

开始界面菜单中转站

进度条

选择进度条进度 

退出游戏模块

背景音乐

主程序

完整代码

下载链接加上游戏素材

 此游戏基于easyX,采取贪吃蛇和飞机大战的思想进行制作,游戏存在几个莫名扣血BUG,以下下为游戏内容(代码含详细注释):(底部含游戏及素材下载链接,制作不易,求赞)

游戏内容

 开始界面

 游戏界面

游戏胜利界面 

 选择难度界面

游戏介绍界面 

 上代码!

头文件

  1. //头文件
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<graphics.h>
  5. #include<conio.h>
  6. #include<time.h>
  7. #include <iostream>
  8. #include<mmsystem.h>//包含多媒体设备接口头文件,一定放在graphics.h下面
  9. #pragma comment(lib,"winmm.lib")//加载静态库

定义数据

定义窗口和角色,方便记忆,直接调用数据

  1. //定义数据
  2. #define window_length 820//窗口长度
  3. #define window_width 600//窗口宽度
  4. #define juese_height 80//角色高度
  5. #define juese_width 70//角色宽度

自定义函数

制作游戏前将游戏分成不同类型进行编译会更清晰容易,本人在这里将游戏分为窗口、游戏、模块三类进行定义函数

  1. //自定义函数总览
  2. //窗口类
  3. void start_window();//开始窗口
  4. void running_window();//加载窗口
  5. int game_window();//游戏窗口
  6. void change_window();//难度窗口
  7. void introduce_window();//介绍窗口
  8. void victory_window();//胜利界面
  9. //游戏类
  10. void yun1();//支撑物1
  11. void yun2();//支撑物2
  12. void yun3();//支撑物3
  13. int check_top(int x, int y);//判定——上方
  14. void game_time(int now);//计时
  15. int gettime(clock_t start);
  16. void xuetiao(int blood);//血条
  17. void top_npc1(int fly1, int space1, int npc_x1);//天空龙 1
  18. void top_npc2(int fly2, int space2, int npc_x2);//天空龙 2
  19. void right_npc(int fly3, int space3, int npc_y3);//天空龙 3
  20. void ground_npc(int fly4, int space4, int npc_y4);//喷火龙
  21. void end_pkq(int fly5, int space5, int npc_y5);//结束道具
  22. int check_lose_blood(int x, int y, int npc_x, int npc_y);//判定扣血
  23. int check_lose_blood_cm(int x, int y, int npc_x, int npc_y);//判定扣血
  24. int check_lose_blood_g(int x, int y, int npc_x, int npc_y);//判定扣血
  25. int check_victory(int x, int y, int npc_x, int npc_y);//判定游戏胜利
  26. int zanting(HWND gamewindow);//游戏暂停
  27. //模块类
  28. void nomal_botton(int left, int top, int right, int bottom, const char* text);//正常状态按钮
  29. void abnomal_botton(int left, int top, int right, int bottom);//选中状态按钮
  30. int select();//点击选项
  31. int return_back();//返回选项
  32. int select_differ();//难度选择
  33. void menu(int choice, HWND start_window);//菜单中转
  34. void running(int i, int lunhuan);//进度条
  35. void music();//BGM
  36. void end_mode(HWND startwindow);//结束模块
  37. int check_jdt(int zhongzhuan);//进度条动画皮卡丘

全局变量

定义全局变量,用于对游戏内参数进行调整,实现对难度的更改

  1. //全局变量
  2. int i = 0;//需要临时变量使使用
  3. int fly_down = 0;//飞行功能
  4. int gravity = 5;//重力
  5. int sudu = 20;//移速
  6. int differ = 0;//难度
  7. int now = 0;//当前时间

窗口类函数

开始界面

  1. void start_window()//开始窗口
  2. {
  3. music();
  4. initgraph(window_length, window_width);//启动窗口
  5. HWND startwindow = GetHWnd();//获取窗口句柄
  6. SetWindowText(startwindow, "小命要紧");//设置窗口标题
  7. while (1)
  8. {
  9. BeginBatchDraw();
  10. IMAGE start_bk;
  11. loadimage(&start_bk, _T("start_bk.png"));//设置背景
  12. putimage(0, 0, &start_bk);
  13. //设置按钮
  14. nomal_botton(25, 100, 200, 150, "开始游戏");//第一个按钮
  15. nomal_botton(25, 200, 200, 250, "选择难度");//第二个按钮
  16. nomal_botton(25, 300, 200, 350, "游戏介绍");//第三个按钮
  17. nomal_botton(25, 400, 200, 450, "退出游戏");//第四个按钮
  18. FlushBatchDraw();
  19. //选项循环模式
  20. int choice;//选项参数
  21. choice = select();//选择选项
  22. menu(choice, startwindow);//加载选项
  23. }
  24. }

加载窗口

  1. void running_window()//加载窗口
  2. {
  3. i = 1;
  4. int zhongzhuan = 0;
  5. int lunhuan = 0;
  6. while (1)
  7. {
  8. BeginBatchDraw();//开始绘图
  9. IMAGE running_bk;
  10. loadimage(&running_bk, _T("running_bk.png"));//设置背景
  11. putimage(0, 0, &running_bk);
  12. running(i, lunhuan);
  13. lunhuan++;
  14. FlushBatchDraw();//结束绘图
  15. if (i == 8 && lunhuan == 4)//判断皮卡丘动作
  16. {
  17. Sleep(1000);
  18. break;
  19. }
  20. if (lunhuan >= 4)
  21. {
  22. lunhuan = 0;
  23. }
  24. zhongzhuan++;
  25. i = check_jdt(zhongzhuan);//选择进度条进度
  26. Sleep(50);
  27. }
  28. }

游戏界面

  1. int game_window()//游戏窗口
  2. {
  3. srand((unsigned)time(NULL));//随机数前置动作
  4. char place = 'd';//起始方向
  5. int x = 25;//沙奈朵起始横坐标
  6. int y = 470;//沙奈朵起始纵坐标
  7. int n = 0;
  8. int m = 0;
  9. int blood = 3;//血条初始血量
  10. char ch1, ch2 = 'd', k1 = 'd', k2 = 'd', k3 = 'd', next1 = 'd', next2 = 'd';//控制跳跃次数
  11. clock_t start;//计时容量
  12. start = clock();//计时开始
  13. int fly1 = 0, fly2 = 0, fly3 = 0, fly4 = 0, fly5 = 0;//飞行高度
  14. int space1 = 0, space2 = 0, space3 = 0, space4 = 0, space5 = 0;//飞行动作参数
  15. int check_end1 = 0, check_end2 = 0, check_end3 = 0, check_end4 = 0, check_end5 = 1;//是否碰撞
  16. int check_next1 = 20, check_next2 = 20, check_next3 = 20, check_next4 = 20, check_next5 = 20;//判断是否需要扣血
  17. int lingshi1 = 0, lingshi2 = 0, lingshi3 = 0, lingshi4 = 15, lingshi5 = 400;//判断是否增加上空飞行小怪
  18. int npc_x1 = rand() % 201 + 30;//起始天空龙1横坐标
  19. int npc_x2 = rand() % 221 + 410;//起始天空龙2横坐标
  20. int npc_y3 = rand() % 481 + 0;//起始天空龙3纵坐标
  21. int npc_y4 = 480;//喷火龙纵坐标
  22. int npc_y5 = rand() % 411 + 100;//皮卡丘纵坐标
  23. int next_step = 1;//暂停游戏参数
  24. int huifu = 0;//BUG修复参数
  25. while (1)//开始游戏循环
  26. {
  27. if (y == 470)//落地刷新跳跃次数
  28. {
  29. k1 = 'd';
  30. k2 = 'd';
  31. }
  32. BeginBatchDraw();//开始绘图
  33. //设置地图
  34. IMAGE map_bk;//背景
  35. loadimage(&map_bk, _T("game_bk.png"));
  36. putimage(0, 0, &map_bk);
  37. IMAGE yun_yuan1, yun_bk1, yun_yuan2, yun_bk2;//外框
  38. //底层外框
  39. loadimage(&yun_yuan1, _T("yun1.jpg"), 50, 25);
  40. loadimage(&yun_bk1, _T("yun2.jpg"), 50, 25);
  41. for (i = 10; i < 810; i += 50)
  42. {
  43. putimage(i, 550, &yun_bk1, SRCAND);//添加位运算宏
  44. putimage(i, 550, &yun_yuan1, SRCPAINT);
  45. }
  46. //左右外框
  47. loadimage(&yun_yuan2, _T("yun1.jpg"), 25, 25);
  48. loadimage(&yun_bk2, _T("yun2.jpg"), 25, 25);
  49. for (i = 0; i < 530; i += 25)
  50. {
  51. putimage(10, i, &yun_bk2, SRCAND);//添加位运算宏
  52. putimage(10, i, &yun_yuan2, SRCPAINT);
  53. }
  54. for (i = 0; i < 530; i += 25)
  55. {
  56. putimage(785, i, &yun_bk2, SRCAND);//添加位运算宏
  57. putimage(785, i, &yun_yuan2, SRCPAINT);
  58. }
  59. //支撑点
  60. yun1();//大云
  61. yun2();//中云
  62. yun3();//小云
  63. //计时
  64. now = gettime(start);//获取游戏时间
  65. game_time(now);//显示游戏时间
  66. //血条
  67. xuetiao(blood);
  68. //npc小怪
  69. //天空龙1
  70. if (lingshi1 == 0)//判断是否刷新小怪
  71. {
  72. if (fly1 < 65)
  73. {
  74. top_npc1(fly1, space1, npc_x1);//生成天空龙1
  75. fly1++;
  76. space1++;
  77. if (space1 == 2)//选择动作
  78. {
  79. space1 = 0;
  80. }
  81. }
  82. }
  83. if (fly1 == 60)//天空龙1飞至底部
  84. {
  85. lingshi1 = rand() % 9 + 12;//间断生成小怪
  86. npc_x1 = rand() % 201 + 30;//随机天空龙1生成地点,位于地图左半边
  87. fly1 = 0;
  88. }
  89. if (lingshi1 > 0)//逼近生成时间
  90. {
  91. lingshi1--;
  92. }
  93. //天空龙2
  94. if (lingshi2 == 0)//判断是否生成小怪
  95. {
  96. if (fly2 < 65)
  97. {
  98. top_npc2(fly2, space2, npc_x2);//生成天空龙2
  99. fly2++;
  100. space2++;
  101. if (space2 == 2)//选择动作
  102. {
  103. space2 = 0;
  104. }
  105. }
  106. }
  107. if (fly2 == 60)//天空龙2飞至底部
  108. {
  109. lingshi2 = rand() % 9 + 12;//间断小怪生成时间
  110. npc_x2 = rand() % 221 + 410;//随机产生天空龙2生成地点,位于地图右半边
  111. fly2 = 0;
  112. }
  113. if (lingshi2 > 0)//逼近小怪生成时间
  114. {
  115. lingshi2--;
  116. }
  117. //天空龙3
  118. if (lingshi3 == 0)//判断是否生成小怪
  119. {
  120. if (fly3 < 50)
  121. {
  122. right_npc(fly3, space3, npc_y3);//生成天空龙3
  123. fly3++;
  124. space3++;
  125. if (space3 == 4)//选择动作
  126. {
  127. space3 = 0;
  128. }
  129. }
  130. }
  131. if (fly3 == 41)//天空龙3飞至左边
  132. {
  133. lingshi3 = rand() % 6 + 15;//间断小怪生成时间
  134. npc_y3 = rand() % 481 + 0;//随机产生天空龙3生成地点,位于地图右半边
  135. fly3 = 0;
  136. }
  137. if (lingshi3 > 0)//逼近小怪生成时间
  138. {
  139. lingshi3--;
  140. }
  141. //喷火龙
  142. if (lingshi4 == 0)//判断是否生成小怪
  143. {
  144. if (fly4 < 50)
  145. {
  146. ground_npc(fly4, space4, npc_y4);//生成喷火龙
  147. fly4++;
  148. space4++;
  149. if (space4 == 4)//选择动作
  150. {
  151. space4 = 0;
  152. }
  153. }
  154. }
  155. if (fly4 == 41)//喷火龙走至右边
  156. {
  157. lingshi4 = rand() % 6 + 15;//间断小怪生成时间
  158. fly4 = 0;
  159. }
  160. if (lingshi4 > 0)//逼近小怪生成时间
  161. {
  162. lingshi4--;
  163. }
  164. //皮卡丘
  165. if (lingshi5 == 0)//判断是否生成小怪
  166. {
  167. if (fly5 < 50)
  168. {
  169. end_pkq(fly5, space5, npc_y5);//生成皮卡丘
  170. fly5++;
  171. space5++;
  172. if (space5 == 4)//选择动作
  173. {
  174. space5 = 0;
  175. }
  176. }
  177. }
  178. if (fly5 == 41)//皮卡丘走至右边
  179. {
  180. lingshi5 = rand() % 51 + 100;//间断小怪生成时间
  181. npc_y5 = rand() % 411 + 100;
  182. fly5 = 0;
  183. }
  184. if (lingshi5 > 0)//逼近小怪生成时间
  185. {
  186. lingshi5--;
  187. }
  188. //角色(沙奈朵)
  189. IMAGE juese1, juese2, juese4, juese3;//沙奈朵行走图
  190. loadimage(&juese1, "snd1.png", 280, 160);
  191. loadimage(&juese2, "snd2.png", 280, 160);
  192. loadimage(&juese3, "snd3.png", 280, 160);
  193. loadimage(&juese4, "snd4.png", 280, 160);
  194. switch (ch2)//判定行走动作
  195. {
  196. case 'd':
  197. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  198. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  199. break;
  200. case 'a':
  201. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  202. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  203. break;
  204. }
  205. switch (place)//判断飞行降落和跳跃动作
  206. {
  207. case 'w'://飞行动作
  208. switch (ch2)//判断原行动方向
  209. {
  210. case 'a':
  211. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  212. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  213. break;
  214. case 'd':
  215. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  216. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  217. break;
  218. }
  219. case 's'://降落动作
  220. switch (ch2)//判断原行动方向
  221. {
  222. case 'a':
  223. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  224. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  225. break;
  226. case 'd':
  227. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  228. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  229. break;
  230. }
  231. case 'k'://跳跃动作
  232. switch (ch2)//判断原行动方向
  233. {
  234. case 'a':
  235. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  236. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  237. break;
  238. case 'd':
  239. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  240. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  241. break;
  242. }
  243. }
  244. if (_kbhit())//判断是否有输入
  245. {
  246. ch1 = _getch();//获取输入内容
  247. if (ch1 == 'k')//跳跃键
  248. {
  249. switch (ch1)
  250. {
  251. case 'k':
  252. place = 'k';
  253. //轮换历史键位
  254. next1 = k1;
  255. next2 = k2;
  256. k1 = 'k';
  257. k2 = next1;
  258. k3 = next2;
  259. //动作更换
  260. n++;
  261. if (n >= 4)
  262. {
  263. n = 0;
  264. }
  265. //判断跳跃次数
  266. if (y > 0 && k3 != 'k')//可以跳跃
  267. {
  268. if (m <= 20)
  269. {
  270. m += 20;
  271. y -= 120;
  272. break;
  273. }
  274. else
  275. {
  276. place = 's';
  277. //轮换动作
  278. n++;
  279. if (n >= 4)
  280. {
  281. n = 0;
  282. }
  283. //下降操作
  284. if (y <= 450)
  285. {
  286. y += 15;
  287. break;
  288. }
  289. }
  290. }
  291. else//二段跳后进入冷却
  292. {
  293. place = 's';
  294. //动作轮换
  295. n++;
  296. if (n >= 4)
  297. {
  298. n = 0;
  299. }
  300. //下降操作
  301. if (y <= 450)
  302. {
  303. y += 10;
  304. break;
  305. }
  306. break;
  307. }
  308. }
  309. }
  310. else if (ch1 == 's' || ch1 == 'w')//飞行键或降落键
  311. {
  312. switch (ch1)//判断飞行或降落
  313. {
  314. case 'w'://飞行
  315. if (fly_down == 0)
  316. {
  317. place = 'w';
  318. //动作轮换
  319. n++;
  320. if (n >= 4)
  321. {
  322. n = 0;
  323. }
  324. //飞行操作
  325. if (y > 250)
  326. {
  327. y -= 25;
  328. break;
  329. }
  330. }
  331. else
  332. {
  333. break;
  334. }
  335. case 's'://降落操作
  336. place = 's';
  337. //动作轮换
  338. n++;
  339. if (n >= 4)
  340. {
  341. n = 0;
  342. }
  343. //飞行操作
  344. if (y <= 450)
  345. {
  346. y += 15;
  347. break;
  348. }
  349. break;
  350. }
  351. }
  352. else if (ch1 == ' ')
  353. {
  354. HWND gamewindow = GetHWnd();//获取窗口句柄
  355. SetWindowText(gamewindow, "小命要紧");//设置窗口标题
  356. next_step = zanting(gamewindow);
  357. if (next_step == 1)
  358. {
  359. break;
  360. }
  361. }
  362. else//行走键或无效键位
  363. {
  364. switch (ch1)//判断行走键或无效键位
  365. {
  366. case 'a'://左走键
  367. case 'A':
  368. place = 'a';
  369. //历史键位轮换
  370. ch2 = 'a';
  371. next1 = k1;
  372. next2 = k2;
  373. k1 = 'a';
  374. k2 = next1;
  375. k3 = next2;
  376. //动作轮换
  377. n++;
  378. if (n >= 4)
  379. {
  380. n = 0;
  381. }
  382. //左走操作
  383. if (x >= 25)
  384. {
  385. x -= 20;
  386. break;
  387. }
  388. break;
  389. case 'd'://右走键
  390. case 'D':
  391. place = 'd';
  392. //历史键位轮换
  393. ch2 = 'd';
  394. next1 = k1;
  395. next2 = k2;
  396. k1 = 'd';
  397. k2 = next1;
  398. k3 = next2;
  399. //动作轮换
  400. n++;
  401. if (n >= 4)
  402. {
  403. n = 0;
  404. }
  405. //左走操作
  406. if (x <= 730)
  407. {
  408. x += 20;
  409. break;
  410. }
  411. break;
  412. default://无效键位
  413. break;//退出
  414. }
  415. }
  416. }
  417. //游戏内引力作用
  418. if (y <= 460)
  419. {
  420. y += gravity;
  421. }
  422. //跳跃冷却时间减小
  423. if (m > 0)
  424. {
  425. m--;
  426. }
  427. //判断沙奈朵是否站在支撑点位
  428. y = check_top(x, y);
  429. FlushBatchDraw();//结束绘画
  430. //判定碰撞
  431. //天空龙1
  432. if (check_next1 == 0)//非无敌时间
  433. {
  434. check_end1 = check_lose_blood(x, y, npc_x1, fly1 * 20);
  435. if (check_end1 == 1)//发生碰撞
  436. {
  437. blood--;//扣血
  438. //无敌时间,小怪无伤
  439. check_next1 = 10;
  440. check_next2 = 10;
  441. check_next3 = 10;
  442. check_next4 = 10;
  443. }
  444. }
  445. //天空龙2
  446. if (check_next2 == 0)//非无敌时间
  447. {
  448. check_end2 = check_lose_blood(x, y, npc_x2, fly2 * 10);
  449. if (check_end2 == 1)//发生碰撞
  450. {
  451. blood--;//扣血
  452. //无敌时间,小怪无伤
  453. check_next1 = 10;
  454. check_next2 = 10;
  455. check_next3 = 10;
  456. check_next4 = 10;
  457. }
  458. }
  459. //天空龙3
  460. if (check_next3 == 0)//非无敌时间
  461. {
  462. check_end3 = check_lose_blood_cm(x, y, 710 - fly3 * 20, npc_y3);
  463. if (check_end3 == 1)//发生碰撞
  464. {
  465. blood--;//扣血
  466. //无敌时间,小怪无伤
  467. check_next1 = 10;
  468. check_next2 = 10;
  469. check_next3 = 10;
  470. check_next4 = 10;
  471. }
  472. }
  473. //喷火龙
  474. if (check_next4 == 0)//非无敌时间
  475. {
  476. check_end4 = check_lose_blood_g(x, y, fly4 * 20, npc_y4);
  477. if (check_end4 == 1)//发生碰撞
  478. {
  479. blood--;//扣血
  480. //无敌时间,小怪无伤
  481. check_next1 = 10;
  482. check_next2 = 10;
  483. check_next3 = 10;
  484. check_next4 = 10;
  485. }
  486. }
  487. //判断无敌时间长短
  488. if (check_next1 > 0)
  489. {
  490. //无敌时间减少
  491. check_next1--;
  492. check_next2--;
  493. check_next3--;
  494. check_next4--;
  495. }
  496. //判断是否死亡
  497. if (blood == 0)//血条清零
  498. {
  499. Sleep(1000);//暂停游戏
  500. return 0;//回到游戏开始界面
  501. }
  502. //判断游戏胜利
  503. //皮卡丘
  504. huifu++;
  505. check_end5 = check_victory(x, y, fly5 * sudu, npc_y5);
  506. if (huifu > 100)
  507. {
  508. switch (check_end5)//发生碰撞
  509. {
  510. case 0:
  511. Sleep(1000);
  512. return 1;
  513. case 1:
  514. break;
  515. }
  516. }
  517. Sleep(75);//移动间断时间(ms)
  518. }
  519. return 0;
  520. }

难度选择窗口 

  1. void change_window()//难度窗口
  2. {
  3. while (1)
  4. {
  5. BeginBatchDraw();//开始绘画
  6. IMAGE game_nd_bk;
  7. loadimage(&game_nd_bk, _T("game_nd_bk.png"), window_length, window_width);//设置背景
  8. putimage(0, 0, &game_nd_bk);
  9. nomal_botton(25, 60, 200, 110, "有手进行");//第一个按钮
  10. nomal_botton(25, 150, 200, 200, "就这水平");//第二个按钮
  11. nomal_botton(25, 240, 200, 290, "有的东西");//第三个按钮
  12. nomal_botton(25, 330, 200, 380, "有亿点难");//第四个按钮
  13. FlushBatchDraw();//暂停绘画
  14. differ = select_differ();
  15. switch (differ)
  16. {
  17. case 0:
  18. fly_down = 0;
  19. gravity = 5;
  20. sudu = 20;
  21. return;
  22. case 1:
  23. fly_down = 0;
  24. gravity = 5;
  25. sudu = 40;
  26. return;
  27. case 2:
  28. fly_down = 0;
  29. gravity = 10;
  30. sudu = 40;
  31. return;
  32. case 3:
  33. fly_down = 1;
  34. gravity = 5;
  35. sudu = 40;
  36. return;
  37. default:
  38. break;
  39. }
  40. }
  41. return;
  42. }

游戏介绍窗口 

  1. void introduce_window()//游戏介绍窗口
  2. {
  3. int back;
  4. while (1)
  5. {
  6. BeginBatchDraw();//开始绘画
  7. IMAGE game_js_bk;
  8. loadimage(&game_js_bk, _T("game_js_bk.png"));//设置背景
  9. putimage(0, 0, &game_js_bk);
  10. nomal_botton(650, 500, 750, 550, "");//第一个按钮
  11. FlushBatchDraw();//停止绘画
  12. back = return_back();
  13. if (back == 4)
  14. {
  15. return;
  16. }
  17. }
  18. return;
  19. }

游戏胜利界面 

  1. void victory_window()//游戏结束,获得胜利
  2. {
  3. int back;
  4. char record[50];
  5. while (1)
  6. {
  7. BeginBatchDraw();//开始绘画
  8. IMAGE victory_bk;
  9. loadimage(&victory_bk, _T("victory_bk.png"), window_length, window_width);//设置背景
  10. putimage(0, 0, &victory_bk);
  11. _itoa(now, record, 10);
  12. //设置按钮
  13. nomal_botton(650, 500, 750, 550, "返回");//第一个按钮
  14. //输出记录
  15. nomal_botton(610, 440, 710, 510, "记录:");
  16. nomal_botton(680, 440, 780, 510, record);
  17. FlushBatchDraw();//停止绘画
  18. back = return_back();
  19. if (back == 4)
  20. {
  21. return;
  22. }
  23. }
  24. return;
  25. }
  1. void yun1()//大云朵
  2. {
  3. IMAGE yun_zcd1, yun_zcd2;
  4. //获取大云朵
  5. loadimage(&yun_zcd1, "yun_zcd1.png", 140, 30);
  6. loadimage(&yun_zcd2, "yun_zcd2.png", 140, 30);
  7. //云1
  8. putimage(180, 250, &yun_zcd2, SRCAND);
  9. putimage(180, 250, &yun_zcd1, SRCPAINT);
  10. //云2
  11. putimage(645, 440, &yun_zcd2, SRCAND);
  12. putimage(645, 440, &yun_zcd1, SRCPAINT);
  13. //云3
  14. putimage(420, 120, &yun_zcd2, SRCAND);
  15. putimage(420, 120, &yun_zcd1, SRCPAINT);
  16. return;
  17. }
  18. void yun2()//中云朵
  19. {
  20. IMAGE yun_yuan1, yun_bk1;
  21. //获取中云朵
  22. loadimage(&yun_yuan1, ("yun1.jpg"), 70, 35);
  23. loadimage(&yun_bk1, ("yun2.jpg"), 70, 35);
  24. //云1
  25. putimage(35, 350, &yun_bk1, SRCAND);
  26. putimage(35, 350, &yun_yuan1, SRCPAINT);
  27. //云2
  28. putimage(550, 330, &yun_bk1, SRCAND);
  29. putimage(550, 330, &yun_yuan1, SRCPAINT);
  30. //云3
  31. putimage(720, 280, &yun_bk1, SRCAND);
  32. putimage(720, 280, &yun_yuan1, SRCPAINT);
  33. //云4
  34. putimage(35, 160, &yun_bk1, SRCAND);
  35. putimage(35, 160, &yun_yuan1, SRCPAINT);
  36. return;
  37. }
  38. void yun3()//小云朵
  39. {
  40. IMAGE yun_yuan2, yun_bk2;
  41. //获取小云朵
  42. loadimage(&yun_yuan2, _T("yun1.jpg"), 40, 40);
  43. loadimage(&yun_bk2, _T("yun2.jpg"), 40, 40);
  44. //云1
  45. putimage(150, 420, &yun_bk2, SRCAND);
  46. putimage(150, 420, &yun_yuan2, SRCPAINT);
  47. //云2
  48. putimage(350, 180, &yun_bk2, SRCAND);
  49. putimage(350, 180, &yun_yuan2, SRCPAINT);
  50. //云3
  51. putimage(640, 200, &yun_bk2, SRCAND);
  52. putimage(640, 200, &yun_yuan2, SRCPAINT);
  53. //云4
  54. putimage(380, 410, &yun_bk2, SRCAND);
  55. putimage(380, 410, &yun_yuan2, SRCPAINT);
  56. return;
  57. }

 判断角色是否位于云上,使其不下落

  1. int check_top(int x, int y)//判断沙奈朵是否位于支撑点位
  2. {
  3. if (y < 200 && y > 150 && x > 140 && x < 280)//yun1.1
  4. {
  5. y = 170;//使不下落
  6. return y;
  7. }
  8. if (y < 380 && y > 340 && x > 605 && x < 745)//yun1.2
  9. {
  10. y = 360;//使不下落
  11. return y;
  12. }
  13. if (y < 60 && y > 20 && x > 380 && x < 520)//yun1.3
  14. {
  15. y = 40;//使不下落
  16. return y;
  17. }
  18. else if (y > 250 && y < 290 && x>0 && x < 80)//yun2.1
  19. {
  20. y = 270;//使不下落
  21. return y;
  22. }
  23. else if (y > 230 && y < 270 && x>515 && x < 600)//yun2.2
  24. {
  25. y = 250;//使不下落
  26. return y;
  27. }
  28. else if (y > 180 && y < 220 && x>685 && x < 750)//yun2.3
  29. {
  30. y = 200;//使不下落
  31. return y;
  32. }
  33. else if (y > 60 && y < 100 && x>0 && x < 65)//yun2.4
  34. {
  35. y = 80;//使不下落
  36. return y;
  37. }
  38. else if (y > 320 && y < 360 && x>110 && x < 150)//yun3.1
  39. {
  40. y = 340;//使不下落
  41. return y;
  42. }
  43. else if (y > 80 && y < 120 && x>310 && x < 350)//yun3.2
  44. {
  45. y = 100;//使不下落
  46. return y;
  47. }
  48. else if (y > 100 && y < 140 && x>600 && x < 640)//yun3.3
  49. {
  50. y = 120;//使不下落
  51. return y;
  52. }
  53. else if (y > 310 && y < 350 && x>340 && x < 380)//yun3.4
  54. {
  55. y = 330;//使不下落
  56. return y;
  57. }
  58. return y;
  59. }

显示游戏时间

  1. void game_time(int now)//显示游戏时间
  2. {
  3. setbkmode(TRANSPARENT);//设置字体背景透明
  4. char lingshi_text[50];//当前时间载体
  5. _itoa(now, lingshi_text, 10);//转化整型时间为字符串
  6. settextstyle(30, 15, "楷体");//设置字体
  7. settextcolor(BLACK);
  8. int text_x = 380;//内容横坐标
  9. int text_y = 0;//内容纵坐标
  10. outtextxy(text_x, text_y, lingshi_text);//输出时间
  11. return;
  12. }
  13. int gettime(clock_t start)//获得时间
  14. {
  15. clock_t end;
  16. int now;
  17. double now1;
  18. end = clock();//获取过去时间
  19. now1 = (double)(end - start) / CLOCKS_PER_SEC;//获取游戏开始时间
  20. now = int(now1);//转化为整数
  21. return now;//返回当前时间
  22. }

血条

  1. void xuetiao(int blood)//血条
  2. {
  3. IMAGE tx, tx_bk, xt_k, xt_k_bk, xt_y, xt_y_bk, xt_er, xt_er_bk, xt_s, xt_s_bk;
  4. //头像
  5. loadimage(&tx, "tx.png", 55, 40);
  6. loadimage(&tx_bk, "tx_bk.png", 55, 40);
  7. //空血
  8. loadimage(&xt_k, "xt_k.png", 180, 20);
  9. loadimage(&xt_k_bk, "xt_k_bk.png", 180, 20);
  10. //一血
  11. loadimage(&xt_y, "xt_y.png", 180, 20);
  12. loadimage(&xt_y_bk, "xt_y_bk.png", 180, 20);
  13. //二血
  14. loadimage(&xt_er, "xt_er.png", 180, 20);
  15. loadimage(&xt_er_bk, "xt_er_bk.png", 180, 20);
  16. //三血(满血)
  17. loadimage(&xt_s, "xt_s.png", 180, 20);
  18. loadimage(&xt_s_bk, "xt_s_bk.png", 180, 20);
  19. //判断血量图
  20. switch (blood)
  21. {
  22. case 3://满血
  23. putimage(30, 0, &tx_bk, SRCAND);
  24. putimage(30, 0, &tx, SRCPAINT);
  25. putimage(90, 20, &xt_s_bk, SRCAND);
  26. putimage(90, 20, &xt_s, SRCPAINT);
  27. return;
  28. case 2://二血
  29. putimage(30, 0, &tx_bk, SRCAND);
  30. putimage(30, 0, &tx, SRCPAINT);
  31. putimage(90, 20, &xt_er_bk, SRCAND);
  32. putimage(90, 20, &xt_er, SRCPAINT);
  33. return;
  34. case 1://一血
  35. putimage(30, 0, &tx_bk, SRCAND);
  36. putimage(30, 0, &tx, SRCPAINT);
  37. putimage(90, 20, &xt_y_bk, SRCAND);
  38. putimage(90, 20, &xt_y, SRCPAINT);
  39. return;
  40. case 0://空血
  41. putimage(30, 0, &tx_bk, SRCAND);
  42. putimage(30, 0, &tx, SRCPAINT);
  43. putimage(90, 20, &xt_k_bk, SRCAND);
  44. putimage(90, 20, &xt_k, SRCPAINT);
  45. return;
  46. }
  47. }

小怪NPC

  1. void top_npc1(int fly1, int space1, int npc_x1)//天空龙 1
  2. {
  3. IMAGE npc1, npc1_bk;
  4. //获取天空龙
  5. loadimage(&npc1, "top_npc1.png", 180, 70);
  6. loadimage(&npc1_bk, "top_npc1_bk.png", 180, 70);
  7. putimage(npc_x1, fly1 * 10, 90, 120, &npc1_bk, space1 * 85, 0, SRCAND);
  8. putimage(npc_x1, fly1 * 10, 90, 120, &npc1, space1 * 85, 0, SRCPAINT);
  9. return;
  10. }
  11. void top_npc2(int fly2, int space2, int npc_x2)//天空龙 2
  12. {
  13. IMAGE npc1, npc1_bk;
  14. //获取天空龙
  15. loadimage(&npc1, "top_npc1.png", 180, 70);
  16. loadimage(&npc1_bk, "top_npc1_bk.png", 180, 70);
  17. putimage(npc_x2, fly2 * 10, 90, 120, &npc1_bk, space2 * 85, 0, SRCAND);
  18. putimage(npc_x2, fly2 * 10, 90, 120, &npc1, space2 * 85, 0, SRCPAINT);
  19. return;
  20. }
  21. void right_npc(int fly3, int space3, int npc_y3)//天空龙 3
  22. {
  23. IMAGE npc, npc_bk;
  24. //获取天空龙
  25. loadimage(&npc, "left_npc.png", 360, 70);
  26. loadimage(&npc_bk, "left_npc_bk.png", 360, 70);
  27. putimage(710 - fly3 * 20, npc_y3, 90, 120, &npc_bk, space3 * 90, 0, SRCAND);
  28. putimage(710 - fly3 * 20, npc_y3, 90, 120, &npc, space3 * 90, 0, SRCPAINT);
  29. return;
  30. }
  31. void ground_npc(int fly4, int space4, int npc_y4)//喷火龙
  32. {
  33. IMAGE npc, npc_bk;
  34. //获取喷火龙
  35. loadimage(&npc, "ground_npc.png", 360, 70);
  36. loadimage(&npc_bk, "ground_npc_bk.png", 360, 70);
  37. putimage(fly4 * 20, npc_y4, 90, 120, &npc_bk, space4 * 90, 0, SRCAND);
  38. putimage(fly4 * 20, npc_y4, 90, 120, &npc, space4 * 90, 0, SRCPAINT);
  39. return;
  40. }

游戏胜利道具

  1. void end_pkq(int fly5, int space5, int npc_y5)//皮卡丘——结束道具
  2. {
  3. IMAGE npc1, npc_bk1, npc2, npc_bk2, npc3, npc_bk3;
  4. //获取皮卡丘
  5. loadimage(&npc1, "pkq1.png", 50, 40);
  6. loadimage(&npc_bk1, "pkq2.png", 50, 40);
  7. loadimage(&npc2, "pkq3.png", 50, 40);
  8. loadimage(&npc_bk2, "pkq4.png", 50, 40);
  9. loadimage(&npc3, "pkq5.png", 50, 40);
  10. loadimage(&npc_bk3, "pkq6.png", 50, 40);
  11. switch (space5)
  12. {
  13. case 0:
  14. case 2:
  15. putimage(fly5 * sudu, npc_y5, &npc_bk1, SRCAND);
  16. putimage(fly5 * sudu, npc_y5, &npc1, SRCPAINT);
  17. break;
  18. case 1:
  19. putimage(fly5 * sudu, npc_y5, &npc_bk2, SRCAND);
  20. putimage(fly5 * sudu, npc_y5, &npc2, SRCPAINT);
  21. break;
  22. case 3:
  23. putimage(fly5 * sudu, npc_y5, &npc_bk3, SRCAND);
  24. putimage(fly5 * sudu, npc_y5, &npc3, SRCPAINT);
  25. break;
  26. }
  27. return;
  28. }

扣血判定

  1. int check_lose_blood_cm(int x, int y, int npc_x, int npc_y)//判定扣血——天空龙
  2. {
  3. //中心坐标
  4. int snd_center_x, snd_center_y, npc_center_x, npc_center_y;
  5. int a, b;
  6. //确定中心
  7. snd_center_x = x + 35;
  8. snd_center_y = y + 40;
  9. npc_center_x = npc_x + 45;
  10. npc_center_y = npc_y + 35;
  11. //判断位置以及碰撞关系
  12. if (snd_center_x < npc_center_x)//判断横坐标
  13. {
  14. if (snd_center_y < npc_center_y)//判断纵坐标
  15. {
  16. a = npc_center_x - snd_center_x;
  17. b = npc_center_y - snd_center_y;
  18. if (a < 40 && b < 50)//发生碰撞
  19. {
  20. return 1;
  21. }
  22. else
  23. {
  24. return 0;
  25. }
  26. }
  27. else if (snd_center_y > npc_center_y)//判断纵坐标
  28. {
  29. a = npc_center_x - snd_center_x;
  30. b = snd_center_y - npc_center_y;
  31. if (a < 40 && b < 50)//发生碰撞
  32. {
  33. return 1;
  34. }
  35. else
  36. {
  37. return 0;
  38. }
  39. }
  40. }
  41. else if (snd_center_x > npc_center_x)//判断横坐标
  42. {
  43. if (snd_center_y < npc_center_y)//判断纵坐标
  44. {
  45. a = snd_center_x - npc_center_x;
  46. b = npc_center_y - snd_center_y;
  47. if (a < 40 && b < 50)//发生碰撞
  48. {
  49. return 1;
  50. }
  51. else
  52. {
  53. return 0;
  54. }
  55. }
  56. else if (snd_center_y > npc_center_y)//判断纵坐标
  57. {
  58. a = snd_center_x - npc_center_x;
  59. b = snd_center_y - npc_center_y;
  60. if (a < 40 && b < 50)//发生碰撞
  61. {
  62. return 1;
  63. }
  64. else
  65. {
  66. return 0;
  67. }
  68. }
  69. }
  70. return 0;
  71. }
  72. int check_lose_blood_g(int x, int y, int npc_x, int npc_y)//判定扣血——喷火龙
  73. {
  74. //中心坐标
  75. int snd_center_x, snd_center_y, npc_center_x, npc_center_y;
  76. int a, b;
  77. //确定中心
  78. snd_center_x = x + 35;
  79. snd_center_y = y + 40;
  80. npc_center_x = npc_x + 45;
  81. npc_center_y = npc_y + 35;
  82. //判断位置以及碰撞关系
  83. if (snd_center_x < npc_center_x)//判断横坐标
  84. {
  85. if (snd_center_y < npc_center_y)//判断纵坐标
  86. {
  87. a = npc_center_x - snd_center_x;
  88. b = npc_center_y - snd_center_y;
  89. if (a < 60 && b < 60)//发生碰撞
  90. {
  91. return 1;
  92. }
  93. else
  94. {
  95. return 0;
  96. }
  97. }
  98. else if (snd_center_y > npc_center_y)//判断纵坐标
  99. {
  100. a = npc_center_x - snd_center_x;
  101. b = snd_center_y - npc_center_y;
  102. if (a < 60 && b < 60)//发生碰撞
  103. {
  104. return 1;
  105. }
  106. else
  107. {
  108. return 0;
  109. }
  110. }
  111. }
  112. else if (snd_center_x > npc_center_x)//判断横坐标
  113. {
  114. if (snd_center_y < npc_center_y)//判断纵坐标
  115. {
  116. a = snd_center_x - npc_center_x;
  117. b = npc_center_y - snd_center_y;
  118. if (a < 30 && b < 60)//发生碰撞
  119. {
  120. return 1;
  121. }
  122. else
  123. {
  124. return 0;
  125. }
  126. }
  127. else if (snd_center_y > npc_center_y)//判断纵坐标
  128. {
  129. a = snd_center_x - npc_center_x;
  130. b = snd_center_y - npc_center_y;
  131. if (a < 60 && b < 60)//发生碰撞
  132. {
  133. return 1;
  134. }
  135. else
  136. {
  137. return 0;
  138. }
  139. }
  140. }
  141. return 0;
  142. }

判定游戏胜利——抓住皮卡丘

  1. int check_victory(int x, int y, int npc_x, int npc_y)//判定游戏胜利
  2. {
  3. //中心坐标
  4. int snd_center_x, snd_center_y, npc_center_x, npc_center_y;
  5. int a, b;
  6. //确定中心
  7. snd_center_x = x + 35;
  8. snd_center_y = y + 40;
  9. npc_center_x = npc_x + 25;
  10. npc_center_y = npc_y + 20;
  11. //判断位置以及碰撞关系
  12. if (snd_center_x < npc_center_x)//判断横坐标
  13. {
  14. if (snd_center_y < npc_center_y)//判断纵坐标
  15. {
  16. a = npc_center_x - snd_center_x;
  17. b = npc_center_y - snd_center_y;
  18. if (a < 30 && b < 30)//发生碰撞
  19. {
  20. return 0;
  21. }
  22. else
  23. {
  24. return 1;
  25. }
  26. }
  27. else if (snd_center_y > npc_center_y)//判断纵坐标
  28. {
  29. a = npc_center_x - snd_center_x;
  30. b = snd_center_y - npc_center_y;
  31. if (a < 30 && b < 30)//发生碰撞
  32. {
  33. return 0;
  34. }
  35. else
  36. {
  37. return 1;
  38. }
  39. }
  40. }
  41. else if (snd_center_x > npc_center_x)//判断横坐标
  42. {
  43. if (snd_center_y < npc_center_y)//判断纵坐标
  44. {
  45. a = snd_center_x - npc_center_x;
  46. b = npc_center_y - snd_center_y;
  47. if (a < 30 && b < 30)//发生碰撞
  48. {
  49. return 0;
  50. }
  51. else
  52. {
  53. return 1;
  54. }
  55. }
  56. else if (snd_center_y > npc_center_y)//判断纵坐标
  57. {
  58. a = snd_center_x - npc_center_x;
  59. b = snd_center_y - npc_center_y;
  60. if (a < 30 && b < 30)//发生碰撞
  61. {
  62. return 0;
  63. }
  64. else
  65. {
  66. return 1;
  67. }
  68. }
  69. }
  70. return 0;
  71. }

游戏暂停键

  1. int zanting(HWND gamewindow)//游戏暂停
  2. {
  3. int next_step;
  4. int answer = MessageBox(gamewindow, "是否继续游戏?", "小命要紧", MB_OKCANCEL);//添加选择框内容
  5. if (answer == IDOK)//继续游戏
  6. {
  7. next_step = 0;
  8. return next_step;;
  9. }
  10. else if (answer == IDCANCEL)//回到开始界面
  11. {
  12. next_step = 1;
  13. return next_step;;
  14. }
  15. }

模块类

正常状态按钮

  1. void nomal_botton(int left, int top, int right, int bottom, const char* text)//正常状态按钮
  2. {
  3. setbkmode(TRANSPARENT);//设置字体背景透明
  4. char lingshi_text[50] = { 0 };//按钮内容
  5. strcpy(lingshi_text, text);//获取内容
  6. settextstyle(20, 20, "宋体");//设置字体
  7. settextcolor(BLACK);
  8. int text_x = left + (right - left - textwidth(lingshi_text)) / 2;//内容横坐标
  9. int text_y = top + (bottom - top - textheight(lingshi_text)) / 2;//内容纵坐标
  10. outtextxy(text_x, text_y, lingshi_text);
  11. }

选中状态按钮

  1. void abnomal_botton(int left, int top, int right, int bottom)//选中状态按钮
  2. {
  3. BeginBatchDraw();
  4. setlinecolor(BLACK);//设置线条颜色
  5. setlinestyle(PS_SOLID, 1);//设置线条类型
  6. roundrect(left, top, right, bottom, 10, 10);//设置按钮
  7. FlushBatchDraw();
  8. }

游戏开始界面点击选项事件

  1. int select()//点击选项模块
  2. {
  3. ExMessage msg;
  4. while (1)
  5. {
  6. if (peekmessage(&msg, EM_MOUSE))//获取鼠标点击信息
  7. {
  8. switch (msg.message)//判断点击信息
  9. {
  10. case WM_LBUTTONDOWN://开始游戏
  11. if (msg.x > 25 && msg.x < 200 && msg.y>100 && msg.y < 150)
  12. {
  13. abnomal_botton(25, 100, 200, 150);//点击后按钮状态
  14. Sleep(500);
  15. return 0;
  16. }
  17. else if (msg.x > 25 && msg.x < 200 && msg.y>200 && msg.y < 250)//选择难度模式
  18. {
  19. abnomal_botton(25, 200, 200, 250);//点击后按钮状态
  20. Sleep(500);
  21. return 1;
  22. }
  23. else if (msg.x > 25 && msg.x < 200 && msg.y>300 && msg.y < 350)//游戏介绍
  24. {
  25. abnomal_botton(25, 300, 200, 350);//点击后按钮状态
  26. Sleep(500);
  27. return 3;
  28. }
  29. else if (msg.x > 20 && msg.x < 200 && msg.y>400 && msg.y < 450)//退出游戏
  30. {
  31. abnomal_botton(25, 400, 200, 450);//点击后按钮状态
  32. Sleep(500);
  33. return 4;
  34. }
  35. default:
  36. return 5;
  37. }
  38. }
  39. }

游戏介绍点击返回事件

  1. int return_back()//游戏介绍返回点击
  2. {
  3. ExMessage msg;
  4. while (1)
  5. {
  6. if (peekmessage(&msg, EM_MOUSE))//获取鼠标点击信息
  7. {
  8. switch (msg.message)//判断点击信息
  9. {
  10. case WM_LBUTTONDOWN://开始游戏
  11. if (msg.x > 550 && msg.x < 750 && msg.y>350 && msg.y < 550)
  12. {
  13. abnomal_botton(650, 500, 750, 550);//点击后按钮状态
  14. Sleep(500);
  15. return 4;
  16. }
  17. default:
  18. return 5;
  19. }
  20. }
  21. }
  22. }

难度选择按钮设置

  1. int select_differ()//难度选择
  2. {
  3. ExMessage msg;
  4. while (1)
  5. {
  6. if (peekmessage(&msg, EM_MOUSE))//获取鼠标点击信息
  7. {
  8. switch (msg.message)//判断点击信息
  9. {
  10. case WM_LBUTTONDOWN://开始游戏
  11. if (msg.x > 25 && msg.x < 200 && msg.y>60 && msg.y < 110)
  12. {
  13. abnomal_botton(25, 60, 200, 110);//点击后按钮状态
  14. Sleep(500);
  15. return 0;
  16. }
  17. else if (msg.x > 25 && msg.x < 200 && msg.y>150 && msg.y < 200)//选择难度模式
  18. {
  19. abnomal_botton(25, 150, 200, 200);//点击后按钮状态
  20. Sleep(500);
  21. return 1;
  22. }
  23. else if (msg.x > 25 && msg.x < 200 && msg.y>240 && msg.y < 290)//游戏介绍
  24. {
  25. abnomal_botton(25, 240, 200, 290);//点击后按钮状态
  26. Sleep(500);
  27. return 2;
  28. }
  29. else if (msg.x > 20 && msg.x < 200 && msg.y>330 && msg.y < 380)//退出游戏
  30. {
  31. abnomal_botton(25, 330, 200, 380);//点击后按钮状态
  32. Sleep(500);
  33. return 3;
  34. }
  35. default:
  36. return 4;
  37. }
  38. }
  39. }
  40. }

开始界面菜单中转站

  1. void menu(int choice, HWND startwindow)//菜单中转
  2. {
  3. switch (choice)
  4. {
  5. case 0://开始游戏
  6. int result;
  7. running_window();
  8. cleardevice();
  9. result = game_window();
  10. if (result == 0)
  11. {
  12. start_window();
  13. }
  14. else if (result == 1)
  15. {
  16. victory_window();
  17. }
  18. return;
  19. case 1://选择模式
  20. change_window();
  21. return;
  22. case 3://游戏简介
  23. introduce_window();
  24. return;
  25. case 4://退出游戏
  26. end_mode(startwindow);
  27. start_window();
  28. return;
  29. case 5:
  30. return;
  31. }
  32. }

进度条

  1. void running(int i, int lunhuan)//进度条
  2. {
  3. //进度条
  4. IMAGE a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16;
  5. //皮卡丘
  6. IMAGE g1, g2, g3, g4, g7, g8;
  7. //获取资源
  8. //进度条
  9. loadimage(&a1, _T("jdt1.png"), 750, 40);
  10. loadimage(&a2, _T("jdt2.png"), 750, 40);
  11. loadimage(&a3, _T("jdt3.png"), 750, 40);
  12. loadimage(&a4, _T("jdt4.png"), 750, 40);
  13. loadimage(&a5, _T("jdt5.png"), 750, 40);
  14. loadimage(&a6, _T("jdt6.png"), 750, 40);
  15. loadimage(&a7, _T("jdt7.png"), 750, 40);
  16. loadimage(&a8, _T("jdt8.png"), 750, 40);
  17. loadimage(&a9, _T("jdt9.png"), 750, 40);
  18. loadimage(&a10, _T("jdt10.png"), 750, 40);
  19. loadimage(&a11, _T("jdt11.png"), 750, 40);
  20. loadimage(&a12, _T("jdt12.png"), 750, 40);
  21. loadimage(&a15, _T("jdt15.png"), 750, 40);
  22. loadimage(&a16, _T("jdt16.png"), 750, 40);
  23. loadimage(&a13, _T("jdt13.png"), 750, 40);
  24. loadimage(&a14, _T("jdt14.png"), 750, 40);
  25. //皮卡丘
  26. loadimage(&g1, _T("pkq1.png"), 70, 60);
  27. loadimage(&g2, _T("pkq2.png"), 70, 60);
  28. loadimage(&g3, _T("pkq3.png"), 70, 60);
  29. loadimage(&g4, _T("pkq4.png"), 70, 60);
  30. loadimage(&g7, _T("pkq5.png"), 70, 60);
  31. loadimage(&g8, _T("pkq6.png"), 70, 60);
  32. switch (i)//判断进程
  33. {
  34. case 1:
  35. if (lunhuan == 0 || lunhuan == 2)
  36. {
  37. putimage(35, 520, &a2, SRCAND);//添加位运算宏
  38. putimage(35, 520, &a1, SRCPAINT);
  39. putimage(25, 500, &g2, SRCAND);//添加位运算宏
  40. putimage(25, 500, &g1, SRCPAINT);
  41. break;
  42. }
  43. else if (lunhuan == 1)
  44. {
  45. putimage(35, 520, &a2, SRCAND);//添加位运算宏
  46. putimage(35, 520, &a1, SRCPAINT);
  47. putimage(25, 500, &g4, SRCAND);//添加位运算宏
  48. putimage(25, 500, &g3, SRCPAINT);
  49. break;
  50. }
  51. else if (lunhuan == 3)
  52. {
  53. putimage(35, 520, &a2, SRCAND);//添加位运算宏
  54. putimage(35, 520, &a1, SRCPAINT);
  55. putimage(25, 500, &g8, SRCAND);//添加位运算宏
  56. putimage(25, 500, &g7, SRCPAINT);
  57. break;
  58. }
  59. case 2:
  60. if (lunhuan == 0 || lunhuan == 2)
  61. {
  62. putimage(35, 520, &a4, SRCAND);//添加位运算宏
  63. putimage(35, 520, &a3, SRCPAINT);
  64. putimage(60, 500, &g2, SRCAND);//添加位运算宏
  65. putimage(60, 500, &g1, SRCPAINT);
  66. break;
  67. }
  68. else if (lunhuan == 1)
  69. {
  70. putimage(35, 520, &a4, SRCAND);//添加位运算宏
  71. putimage(35, 520, &a3, SRCPAINT);
  72. putimage(60, 500, &g4, SRCAND);//添加位运算宏
  73. putimage(60, 500, &g3, SRCPAINT);
  74. break;
  75. }
  76. else if (lunhuan == 3)
  77. {
  78. putimage(35, 520, &a4, SRCAND);//添加位运算宏
  79. putimage(35, 520, &a3, SRCPAINT);
  80. putimage(60, 500, &g8, SRCAND);//添加位运算宏
  81. putimage(60, 500, &g7, SRCPAINT);
  82. break;
  83. }
  84. case 3:
  85. if (lunhuan == 0 || lunhuan == 2)
  86. {
  87. putimage(35, 520, &a6, SRCAND);//添加位运算宏
  88. putimage(35, 520, &a5, SRCPAINT);
  89. putimage(110, 500, &g2, SRCAND);//添加位运算宏
  90. putimage(110, 500, &g1, SRCPAINT);
  91. break;
  92. }
  93. else if (lunhuan == 1)
  94. {
  95. putimage(35, 520, &a6, SRCAND);//添加位运算宏
  96. putimage(35, 520, &a5, SRCPAINT);
  97. putimage(110, 500, &g4, SRCAND);//添加位运算宏
  98. putimage(110, 500, &g3, SRCPAINT);
  99. break;
  100. }
  101. else if (lunhuan == 3)
  102. {
  103. putimage(35, 520, &a6, SRCAND);//添加位运算宏
  104. putimage(35, 520, &a5, SRCPAINT);
  105. putimage(110, 500, &g8, SRCAND);//添加位运算宏
  106. putimage(110, 500, &g7, SRCPAINT);
  107. break;
  108. }
  109. case 4:
  110. if (lunhuan == 0 || lunhuan == 2)
  111. {
  112. putimage(35, 520, &a8, SRCAND);//添加位运算宏
  113. putimage(35, 520, &a7, SRCPAINT);
  114. putimage(180, 500, &g2, SRCAND);//添加位运算宏
  115. putimage(180, 500, &g1, SRCPAINT);
  116. break;
  117. }
  118. else if (lunhuan == 1)
  119. {
  120. putimage(35, 520, &a8, SRCAND);//添加位运算宏
  121. putimage(35, 520, &a7, SRCPAINT);
  122. putimage(180, 500, &g4, SRCAND);//添加位运算宏
  123. putimage(180, 500, &g3, SRCPAINT);
  124. break;
  125. }
  126. else if (lunhuan == 1)
  127. {
  128. putimage(35, 520, &a8, SRCAND);//添加位运算宏
  129. putimage(35, 520, &a7, SRCPAINT);
  130. putimage(180, 500, &g8, SRCAND);//添加位运算宏
  131. putimage(180, 500, &g7, SRCPAINT);
  132. break;
  133. }
  134. case 5:
  135. if (lunhuan == 0 || lunhuan == 2)
  136. {
  137. putimage(35, 520, &a10, SRCAND);//添加位运算宏
  138. putimage(35, 520, &a9, SRCPAINT);
  139. putimage(345, 500, &g2, SRCAND);//添加位运算宏
  140. putimage(345, 500, &g1, SRCPAINT);
  141. break;
  142. }
  143. else if (lunhuan == 1)
  144. {
  145. putimage(35, 520, &a10, SRCAND);//添加位运算宏
  146. putimage(35, 520, &a9, SRCPAINT);
  147. putimage(345, 500, &g4, SRCAND);//添加位运算宏
  148. putimage(345, 500, &g3, SRCPAINT);
  149. break;
  150. }
  151. else if (lunhuan == 3)
  152. {
  153. putimage(35, 520, &a10, SRCAND);//添加位运算宏
  154. putimage(35, 520, &a9, SRCPAINT);
  155. putimage(345, 500, &g8, SRCAND);//添加位运算宏
  156. putimage(345, 500, &g7, SRCPAINT);
  157. break;
  158. }
  159. case 6:
  160. if (lunhuan == 0 || lunhuan == 2)
  161. {
  162. putimage(35, 520, &a12, SRCAND);//添加位运算宏
  163. putimage(35, 520, &a11, SRCPAINT);
  164. putimage(370, 500, &g2, SRCAND);//添加位运算宏
  165. putimage(370, 500, &g1, SRCPAINT);
  166. break;
  167. }
  168. else if (lunhuan == 1)
  169. {
  170. putimage(35, 520, &a12, SRCAND);//添加位运算宏
  171. putimage(35, 520, &a11, SRCPAINT);
  172. putimage(370, 500, &g4, SRCAND);//添加位运算宏
  173. putimage(370, 500, &g3, SRCPAINT);
  174. break;
  175. }
  176. else if (lunhuan == 3)
  177. {
  178. putimage(35, 520, &a12, SRCAND);//添加位运算宏
  179. putimage(35, 520, &a11, SRCPAINT);
  180. putimage(370, 500, &g8, SRCAND);//添加位运算宏
  181. putimage(370, 500, &g7, SRCPAINT);
  182. break;
  183. }
  184. case 7:
  185. if (lunhuan == 0 || lunhuan == 2)
  186. {
  187. putimage(35, 520, &a14, SRCAND);//添加位运算宏
  188. putimage(35, 520, &a13, SRCPAINT);
  189. putimage(520, 500, &g2, SRCAND);//添加位运算宏
  190. putimage(520, 500, &g1, SRCPAINT);
  191. break;
  192. }
  193. else if (lunhuan == 1)
  194. {
  195. putimage(35, 520, &a14, SRCAND);//添加位运算宏
  196. putimage(35, 520, &a13, SRCPAINT);
  197. putimage(520, 500, &g4, SRCAND);//添加位运算宏
  198. putimage(520, 500, &g3, SRCPAINT);
  199. break;
  200. }
  201. else if (lunhuan == 3)
  202. {
  203. putimage(35, 520, &a14, SRCAND);//添加位运算宏
  204. putimage(35, 520, &a13, SRCPAINT);
  205. putimage(520, 500, &g8, SRCAND);//添加位运算宏
  206. putimage(520, 500, &g7, SRCPAINT);
  207. break;
  208. }
  209. case 8:
  210. if (lunhuan == 0 || lunhuan == 2)
  211. {
  212. putimage(35, 520, &a16, SRCAND);//添加位运算宏
  213. putimage(35, 520, &a15, SRCPAINT);
  214. putimage(720, 500, &g2, SRCAND);//添加位运算宏
  215. putimage(720, 500, &g1, SRCPAINT);
  216. break;
  217. }
  218. else if (lunhuan == 1)
  219. {
  220. putimage(35, 520, &a16, SRCAND);//添加位运算宏
  221. putimage(35, 520, &a15, SRCPAINT);
  222. putimage(720, 500, &g4, SRCAND);//添加位运算宏
  223. putimage(720, 500, &g3, SRCPAINT);
  224. break;
  225. }
  226. else if (lunhuan == 3)
  227. {
  228. putimage(35, 520, &a16, SRCAND);//添加位运算宏
  229. putimage(35, 520, &a15, SRCPAINT);
  230. putimage(720, 500, &g8, SRCAND);//添加位运算宏
  231. putimage(720, 500, &g7, SRCPAINT);
  232. break;
  233. }
  234. default:
  235. break;
  236. }
  237. }

选择进度条进度 

  1. int check_jdt(int zhongzhuan)//判断进度条位置,返回决定参数
  2. {
  3. if (zhongzhuan < 4)
  4. {
  5. i = 1;
  6. return i;
  7. }
  8. else if (zhongzhuan > 3 && zhongzhuan < 8)
  9. {
  10. i = 2;
  11. return i;
  12. }
  13. else if (zhongzhuan > 7 && zhongzhuan < 12)
  14. {
  15. i = 3;
  16. return i;
  17. }
  18. else if (zhongzhuan > 11 && zhongzhuan < 16)
  19. {
  20. i = 4;
  21. return i;
  22. }
  23. else if (zhongzhuan > 15 && zhongzhuan < 20)
  24. {
  25. i = 5;
  26. return i;
  27. }
  28. else if (zhongzhuan > 19 && zhongzhuan < 24)
  29. {
  30. i = 6;
  31. return i;
  32. }
  33. else if (zhongzhuan > 23 && zhongzhuan < 28)
  34. {
  35. i = 7;
  36. return i;
  37. }
  38. else if (zhongzhuan > 27 && zhongzhuan < 32)
  39. {
  40. i = 8;
  41. return i;
  42. }
  43. }

退出游戏模块

游戏总有离开的时候

  1. void end_mode(HWND startwindow)//结束模块
  2. {
  3. int answer = MessageBox(startwindow, "是否结束游戏?", "猫娘乐园", MB_OKCANCEL);//添加选择框内容
  4. if (answer == IDOK)
  5. {
  6. closegraph();//结束游戏
  7. mciSendString("close bgm.mp3 ", 0, 0, 0);
  8. exit(-1);
  9. }
  10. else if (answer == IDCANCEL)//回到游戏界面
  11. {
  12. return;
  13. }
  14. }

背景音乐

游戏自然少不了BGM

  1. void music()//背景音乐
  2. {
  3. mciSendString("open bgm.mp3 alias BGM", 0, 0, 0);
  4. mciSendString("play BGM repeat", 0, 0, 0);
  5. return;
  6. }

主程序

  1. //主程序
  2. int main()
  3. {
  4. start_window();//加载开始界面
  5. //游戏开始
  6. //游戏结束
  7. return 0;//退出游戏
  8. }

完整代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. //头文件
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<graphics.h>
  6. #include<conio.h>
  7. #include<time.h>
  8. #include <iostream>
  9. #include<mmsystem.h>//包含多媒体设备接口头文件,一定放在graphics.h下面
  10. #pragma comment(lib,"winmm.lib")//加载静态库
  11. //定义数据
  12. #define window_length 820//窗口长度
  13. #define window_width 600//窗口宽度
  14. #define juese_height 80//角色高度
  15. #define juese_width 70//角色宽度
  16. //自定义函数总览
  17. //窗口类
  18. void start_window();//开始窗口
  19. void running_window();//加载窗口
  20. int game_window();//游戏窗口
  21. void change_window();//难度窗口
  22. void introduce_window();//介绍窗口
  23. void victory_window();//胜利界面
  24. //游戏类
  25. void yun1();//支撑物1
  26. void yun2();//支撑物2
  27. void yun3();//支撑物3
  28. int check_top(int x, int y);//判定——上方
  29. void game_time(int now);//计时
  30. int gettime(clock_t start);
  31. void xuetiao(int blood);//血条
  32. void top_npc1(int fly1, int space1, int npc_x1);//天空龙 1
  33. void top_npc2(int fly2, int space2, int npc_x2);//天空龙 2
  34. void right_npc(int fly3, int space3, int npc_y3);//天空龙 3
  35. void ground_npc(int fly4, int space4, int npc_y4);//喷火龙
  36. void end_pkq(int fly5, int space5, int npc_y5);//结束道具
  37. int check_lose_blood(int x, int y, int npc_x, int npc_y);//判定扣血
  38. int check_lose_blood_cm(int x, int y, int npc_x, int npc_y);//判定扣血
  39. int check_lose_blood_g(int x, int y, int npc_x, int npc_y);//判定扣血
  40. int check_victory(int x, int y, int npc_x, int npc_y);//判定游戏胜利
  41. int zanting(HWND gamewindow);//游戏暂停
  42. //模块类
  43. void nomal_botton(int left, int top, int right, int bottom, const char* text);//正常状态按钮
  44. void abnomal_botton(int left, int top, int right, int bottom);//选中状态按钮
  45. int select();//点击选项
  46. int return_back();//返回选项
  47. int select_differ();//难度选择
  48. void menu(int choice, HWND start_window);//菜单中转
  49. void running(int i, int lunhuan);//进度条
  50. void music();//BGM
  51. void end_mode(HWND startwindow);//结束模块
  52. int check_jdt(int zhongzhuan);//进度条动画皮卡丘
  53. //全局变量
  54. int i = 0;//需要临时变量使使用
  55. int fly_down = 0;//飞行功能
  56. int gravity = 5;//重力
  57. int sudu = 20;//移速
  58. int differ = 0;//难度
  59. int now = 0;//当前时间
  60. //自定义函数
  61. // 窗口类
  62. void start_window()//开始窗口
  63. {
  64. music();
  65. initgraph(window_length, window_width);//启动窗口
  66. HWND startwindow = GetHWnd();//获取窗口句柄
  67. SetWindowText(startwindow, "小命要紧");//设置窗口标题
  68. while (1)
  69. {
  70. BeginBatchDraw();
  71. IMAGE start_bk;
  72. loadimage(&start_bk, _T("start_bk.png"));//设置背景
  73. putimage(0, 0, &start_bk);
  74. //设置按钮
  75. nomal_botton(25, 100, 200, 150, "开始游戏");//第一个按钮
  76. nomal_botton(25, 200, 200, 250, "选择难度");//第二个按钮
  77. nomal_botton(25, 300, 200, 350, "游戏介绍");//第三个按钮
  78. nomal_botton(25, 400, 200, 450, "退出游戏");//第四个按钮
  79. FlushBatchDraw();
  80. //选项循环模式
  81. int choice;//选项参数
  82. choice = select();//选择选项
  83. menu(choice, startwindow);//加载选项
  84. }
  85. }
  86. void running_window()//加载窗口
  87. {
  88. i = 1;
  89. int zhongzhuan = 0;
  90. int lunhuan = 0;
  91. while (1)
  92. {
  93. BeginBatchDraw();//开始绘图
  94. IMAGE running_bk;
  95. loadimage(&running_bk, _T("running_bk.png"));//设置背景
  96. putimage(0, 0, &running_bk);
  97. running(i, lunhuan);
  98. lunhuan++;
  99. FlushBatchDraw();//结束绘图
  100. if (i == 8 && lunhuan == 4)//判断皮卡丘动作
  101. {
  102. Sleep(1000);
  103. break;
  104. }
  105. if (lunhuan >= 4)
  106. {
  107. lunhuan = 0;
  108. }
  109. zhongzhuan++;
  110. i = check_jdt(zhongzhuan);//选择进度条进度
  111. Sleep(50);
  112. }
  113. }
  114. int game_window()//游戏窗口
  115. {
  116. srand((unsigned)time(NULL));//随机数前置动作
  117. char place = 'd';//起始方向
  118. int x = 25;//沙奈朵起始横坐标
  119. int y = 470;//沙奈朵起始纵坐标
  120. int n = 0;
  121. int m = 0;
  122. int blood = 3;//血条初始血量
  123. char ch1, ch2 = 'd', k1 = 'd', k2 = 'd', k3 = 'd', next1 = 'd', next2 = 'd';//控制跳跃次数
  124. clock_t start;//计时容量
  125. start = clock();//计时开始
  126. int fly1 = 0, fly2 = 0, fly3 = 0, fly4 = 0, fly5 = 0;//飞行高度
  127. int space1 = 0, space2 = 0, space3 = 0, space4 = 0, space5 = 0;//飞行动作参数
  128. int check_end1 = 0, check_end2 = 0, check_end3 = 0, check_end4 = 0, check_end5 = 1;//是否碰撞
  129. int check_next1 = 20, check_next2 = 20, check_next3 = 20, check_next4 = 20, check_next5 = 20;//判断是否需要扣血
  130. int lingshi1 = 0, lingshi2 = 0, lingshi3 = 0, lingshi4 = 15, lingshi5 = 400;//判断是否增加上空飞行小怪
  131. int npc_x1 = rand() % 201 + 30;//起始天空龙1横坐标
  132. int npc_x2 = rand() % 221 + 410;//起始天空龙2横坐标
  133. int npc_y3 = rand() % 481 + 0;//起始天空龙3纵坐标
  134. int npc_y4 = 480;//喷火龙纵坐标
  135. int npc_y5 = rand() % 411 + 100;//皮卡丘纵坐标
  136. int next_step = 1;//暂停游戏参数
  137. int huifu = 0;//BUG修复参数
  138. while (1)//开始游戏循环
  139. {
  140. if (y == 470)//落地刷新跳跃次数
  141. {
  142. k1 = 'd';
  143. k2 = 'd';
  144. }
  145. BeginBatchDraw();//开始绘图
  146. //设置地图
  147. IMAGE map_bk;//背景
  148. loadimage(&map_bk, _T("game_bk.png"));
  149. putimage(0, 0, &map_bk);
  150. IMAGE yun_yuan1, yun_bk1, yun_yuan2, yun_bk2;//外框
  151. //底层外框
  152. loadimage(&yun_yuan1, _T("yun1.jpg"), 50, 25);
  153. loadimage(&yun_bk1, _T("yun2.jpg"), 50, 25);
  154. for (i = 10; i < 810; i += 50)
  155. {
  156. putimage(i, 550, &yun_bk1, SRCAND);//添加位运算宏
  157. putimage(i, 550, &yun_yuan1, SRCPAINT);
  158. }
  159. //左右外框
  160. loadimage(&yun_yuan2, _T("yun1.jpg"), 25, 25);
  161. loadimage(&yun_bk2, _T("yun2.jpg"), 25, 25);
  162. for (i = 0; i < 530; i += 25)
  163. {
  164. putimage(10, i, &yun_bk2, SRCAND);//添加位运算宏
  165. putimage(10, i, &yun_yuan2, SRCPAINT);
  166. }
  167. for (i = 0; i < 530; i += 25)
  168. {
  169. putimage(785, i, &yun_bk2, SRCAND);//添加位运算宏
  170. putimage(785, i, &yun_yuan2, SRCPAINT);
  171. }
  172. //支撑点
  173. yun1();//大云
  174. yun2();//中云
  175. yun3();//小云
  176. //计时
  177. now = gettime(start);//获取游戏时间
  178. game_time(now);//显示游戏时间
  179. //血条
  180. xuetiao(blood);
  181. //npc小怪
  182. //天空龙1
  183. if (lingshi1 == 0)//判断是否刷新小怪
  184. {
  185. if (fly1 < 65)
  186. {
  187. top_npc1(fly1, space1, npc_x1);//生成天空龙1
  188. fly1++;
  189. space1++;
  190. if (space1 == 2)//选择动作
  191. {
  192. space1 = 0;
  193. }
  194. }
  195. }
  196. if (fly1 == 60)//天空龙1飞至底部
  197. {
  198. lingshi1 = rand() % 9 + 12;//间断生成小怪
  199. npc_x1 = rand() % 201 + 30;//随机天空龙1生成地点,位于地图左半边
  200. fly1 = 0;
  201. }
  202. if (lingshi1 > 0)//逼近生成时间
  203. {
  204. lingshi1--;
  205. }
  206. //天空龙2
  207. if (lingshi2 == 0)//判断是否生成小怪
  208. {
  209. if (fly2 < 65)
  210. {
  211. top_npc2(fly2, space2, npc_x2);//生成天空龙2
  212. fly2++;
  213. space2++;
  214. if (space2 == 2)//选择动作
  215. {
  216. space2 = 0;
  217. }
  218. }
  219. }
  220. if (fly2 == 60)//天空龙2飞至底部
  221. {
  222. lingshi2 = rand() % 9 + 12;//间断小怪生成时间
  223. npc_x2 = rand() % 221 + 410;//随机产生天空龙2生成地点,位于地图右半边
  224. fly2 = 0;
  225. }
  226. if (lingshi2 > 0)//逼近小怪生成时间
  227. {
  228. lingshi2--;
  229. }
  230. //天空龙3
  231. if (lingshi3 == 0)//判断是否生成小怪
  232. {
  233. if (fly3 < 50)
  234. {
  235. right_npc(fly3, space3, npc_y3);//生成天空龙3
  236. fly3++;
  237. space3++;
  238. if (space3 == 4)//选择动作
  239. {
  240. space3 = 0;
  241. }
  242. }
  243. }
  244. if (fly3 == 41)//天空龙3飞至左边
  245. {
  246. lingshi3 = rand() % 6 + 15;//间断小怪生成时间
  247. npc_y3 = rand() % 481 + 0;//随机产生天空龙3生成地点,位于地图右半边
  248. fly3 = 0;
  249. }
  250. if (lingshi3 > 0)//逼近小怪生成时间
  251. {
  252. lingshi3--;
  253. }
  254. //喷火龙
  255. if (lingshi4 == 0)//判断是否生成小怪
  256. {
  257. if (fly4 < 50)
  258. {
  259. ground_npc(fly4, space4, npc_y4);//生成喷火龙
  260. fly4++;
  261. space4++;
  262. if (space4 == 4)//选择动作
  263. {
  264. space4 = 0;
  265. }
  266. }
  267. }
  268. if (fly4 == 41)//喷火龙走至右边
  269. {
  270. lingshi4 = rand() % 6 + 15;//间断小怪生成时间
  271. fly4 = 0;
  272. }
  273. if (lingshi4 > 0)//逼近小怪生成时间
  274. {
  275. lingshi4--;
  276. }
  277. //皮卡丘
  278. if (lingshi5 == 0)//判断是否生成小怪
  279. {
  280. if (fly5 < 50)
  281. {
  282. end_pkq(fly5, space5, npc_y5);//生成皮卡丘
  283. fly5++;
  284. space5++;
  285. if (space5 == 4)//选择动作
  286. {
  287. space5 = 0;
  288. }
  289. }
  290. }
  291. if (fly5 == 41)//皮卡丘走至右边
  292. {
  293. lingshi5 = rand() % 51 + 100;//间断小怪生成时间
  294. npc_y5 = rand() % 411 + 100;
  295. fly5 = 0;
  296. }
  297. if (lingshi5 > 0)//逼近小怪生成时间
  298. {
  299. lingshi5--;
  300. }
  301. //角色(沙奈朵)
  302. IMAGE juese1, juese2, juese4, juese3;//沙奈朵行走图
  303. loadimage(&juese1, "snd1.png", 280, 160);
  304. loadimage(&juese2, "snd2.png", 280, 160);
  305. loadimage(&juese3, "snd3.png", 280, 160);
  306. loadimage(&juese4, "snd4.png", 280, 160);
  307. switch (ch2)//判定行走动作
  308. {
  309. case 'd':
  310. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  311. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  312. break;
  313. case 'a':
  314. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  315. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  316. break;
  317. }
  318. switch (place)//判断飞行降落和跳跃动作
  319. {
  320. case 'w'://飞行动作
  321. switch (ch2)//判断原行动方向
  322. {
  323. case 'a':
  324. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  325. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  326. break;
  327. case 'd':
  328. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  329. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  330. break;
  331. }
  332. case 's'://降落动作
  333. switch (ch2)//判断原行动方向
  334. {
  335. case 'a':
  336. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  337. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  338. break;
  339. case 'd':
  340. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  341. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  342. break;
  343. }
  344. case 'k'://跳跃动作
  345. switch (ch2)//判断原行动方向
  346. {
  347. case 'a':
  348. putimage(x, y, juese_width, juese_height, &juese4, n * juese_width, juese_height, SRCAND);
  349. putimage(x, y, juese_width, juese_height, &juese3, n * juese_width, juese_height, SRCPAINT);
  350. break;
  351. case 'd':
  352. putimage(x, y, juese_width, juese_height, &juese2, n * juese_width, juese_height, SRCAND);
  353. putimage(x, y, juese_width, juese_height, &juese1, n * juese_width, juese_height, SRCPAINT);
  354. break;
  355. }
  356. }
  357. if (_kbhit())//判断是否有输入
  358. {
  359. ch1 = _getch();//获取输入内容
  360. if (ch1 == 'k')//跳跃键
  361. {
  362. switch (ch1)
  363. {
  364. case 'k':
  365. place = 'k';
  366. //轮换历史键位
  367. next1 = k1;
  368. next2 = k2;
  369. k1 = 'k';
  370. k2 = next1;
  371. k3 = next2;
  372. //动作更换
  373. n++;
  374. if (n >= 4)
  375. {
  376. n = 0;
  377. }
  378. //判断跳跃次数
  379. if (y > 0 && k3 != 'k')//可以跳跃
  380. {
  381. if (m <= 20)
  382. {
  383. m += 20;
  384. y -= 120;
  385. break;
  386. }
  387. else
  388. {
  389. place = 's';
  390. //轮换动作
  391. n++;
  392. if (n >= 4)
  393. {
  394. n = 0;
  395. }
  396. //下降操作
  397. if (y <= 450)
  398. {
  399. y += 15;
  400. break;
  401. }
  402. }
  403. }
  404. else//二段跳后进入冷却
  405. {
  406. place = 's';
  407. //动作轮换
  408. n++;
  409. if (n >= 4)
  410. {
  411. n = 0;
  412. }
  413. //下降操作
  414. if (y <= 450)
  415. {
  416. y += 10;
  417. break;
  418. }
  419. break;
  420. }
  421. }
  422. }
  423. else if (ch1 == 's' || ch1 == 'w')//飞行键或降落键
  424. {
  425. switch (ch1)//判断飞行或降落
  426. {
  427. case 'w'://飞行
  428. if (fly_down == 0)
  429. {
  430. place = 'w';
  431. //动作轮换
  432. n++;
  433. if (n >= 4)
  434. {
  435. n = 0;
  436. }
  437. //飞行操作
  438. if (y > 250)
  439. {
  440. y -= 25;
  441. break;
  442. }
  443. }
  444. else
  445. {
  446. break;
  447. }
  448. case 's'://降落操作
  449. place = 's';
  450. //动作轮换
  451. n++;
  452. if (n >= 4)
  453. {
  454. n = 0;
  455. }
  456. //飞行操作
  457. if (y <= 450)
  458. {
  459. y += 15;
  460. break;
  461. }
  462. break;
  463. }
  464. }
  465. else if (ch1 == ' ')
  466. {
  467. HWND gamewindow = GetHWnd();//获取窗口句柄
  468. SetWindowText(gamewindow, "小命要紧");//设置窗口标题
  469. next_step = zanting(gamewindow);
  470. if (next_step == 1)
  471. {
  472. break;
  473. }
  474. }
  475. else//行走键或无效键位
  476. {
  477. switch (ch1)//判断行走键或无效键位
  478. {
  479. case 'a'://左走键
  480. case 'A':
  481. place = 'a';
  482. //历史键位轮换
  483. ch2 = 'a';
  484. next1 = k1;
  485. next2 = k2;
  486. k1 = 'a';
  487. k2 = next1;
  488. k3 = next2;
  489. //动作轮换
  490. n++;
  491. if (n >= 4)
  492. {
  493. n = 0;
  494. }
  495. //左走操作
  496. if (x >= 25)
  497. {
  498. x -= 20;
  499. break;
  500. }
  501. break;
  502. case 'd'://右走键
  503. case 'D':
  504. place = 'd';
  505. //历史键位轮换
  506. ch2 = 'd';
  507. next1 = k1;
  508. next2 = k2;
  509. k1 = 'd';
  510. k2 = next1;
  511. k3 = next2;
  512. //动作轮换
  513. n++;
  514. if (n >= 4)
  515. {
  516. n = 0;
  517. }
  518. //左走操作
  519. if (x <= 730)
  520. {
  521. x += 20;
  522. break;
  523. }
  524. break;
  525. default://无效键位
  526. break;//退出
  527. }
  528. }
  529. }
  530. //游戏内引力作用
  531. if (y <= 460)
  532. {
  533. y += gravity;
  534. }
  535. //跳跃冷却时间减小
  536. if (m > 0)
  537. {
  538. m--;
  539. }
  540. //判断沙奈朵是否站在支撑点位
  541. y = check_top(x, y);
  542. FlushBatchDraw();//结束绘画
  543. //判定碰撞
  544. //天空龙1
  545. if (check_next1 == 0)//非无敌时间
  546. {
  547. check_end1 = check_lose_blood(x, y, npc_x1, fly1 * 20);
  548. if (check_end1 == 1)//发生碰撞
  549. {
  550. blood--;//扣血
  551. //无敌时间,小怪无伤
  552. check_next1 = 10;
  553. check_next2 = 10;
  554. check_next3 = 10;
  555. check_next4 = 10;
  556. }
  557. }
  558. //天空龙2
  559. if (check_next2 == 0)//非无敌时间
  560. {
  561. check_end2 = check_lose_blood(x, y, npc_x2, fly2 * 10);
  562. if (check_end2 == 1)//发生碰撞
  563. {
  564. blood--;//扣血
  565. //无敌时间,小怪无伤
  566. check_next1 = 10;
  567. check_next2 = 10;
  568. check_next3 = 10;
  569. check_next4 = 10;
  570. }
  571. }
  572. //天空龙3
  573. if (check_next3 == 0)//非无敌时间
  574. {
  575. check_end3 = check_lose_blood_cm(x, y, 710 - fly3 * 20, npc_y3);
  576. if (check_end3 == 1)//发生碰撞
  577. {
  578. blood--;//扣血
  579. //无敌时间,小怪无伤
  580. check_next1 = 10;
  581. check_next2 = 10;
  582. check_next3 = 10;
  583. check_next4 = 10;
  584. }
  585. }
  586. //喷火龙
  587. if (check_next4 == 0)//非无敌时间
  588. {
  589. check_end4 = check_lose_blood_g(x, y, fly4 * 20, npc_y4);
  590. if (check_end4 == 1)//发生碰撞
  591. {
  592. blood--;//扣血
  593. //无敌时间,小怪无伤
  594. check_next1 = 10;
  595. check_next2 = 10;
  596. check_next3 = 10;
  597. check_next4 = 10;
  598. }
  599. }
  600. //判断无敌时间长短
  601. if (check_next1 > 0)
  602. {
  603. //无敌时间减少
  604. check_next1--;
  605. check_next2--;
  606. check_next3--;
  607. check_next4--;
  608. }
  609. //判断是否死亡
  610. if (blood == 0)//血条清零
  611. {
  612. Sleep(1000);//暂停游戏
  613. return 0;//回到游戏开始界面
  614. }
  615. //判断游戏胜利
  616. //皮卡丘
  617. huifu++;
  618. check_end5 = check_victory(x, y, fly5 * sudu, npc_y5);
  619. if (huifu > 100)
  620. {
  621. switch (check_end5)//发生碰撞
  622. {
  623. case 0:
  624. Sleep(1000);
  625. return 1;
  626. case 1:
  627. break;
  628. }
  629. }
  630. Sleep(75);//移动间断时间(ms)
  631. }
  632. return 0;
  633. }
  634. void change_window()//难度窗口
  635. {
  636. while (1)
  637. {
  638. BeginBatchDraw();//开始绘画
  639. IMAGE game_nd_bk;
  640. loadimage(&game_nd_bk, _T("game_nd_bk.png"), window_length, window_width);//设置背景
  641. putimage(0, 0, &game_nd_bk);
  642. nomal_botton(25, 60, 200, 110, "有手进行");//第一个按钮
  643. nomal_botton(25, 150, 200, 200, "就这水平");//第二个按钮
  644. nomal_botton(25, 240, 200, 290, "有的东西");//第三个按钮
  645. nomal_botton(25, 330, 200, 380, "有亿点难");//第四个按钮
  646. FlushBatchDraw();//暂停绘画
  647. differ = select_differ();
  648. switch (differ)
  649. {
  650. case 0:
  651. fly_down = 0;
  652. gravity = 5;
  653. sudu = 20;
  654. return;
  655. case 1:
  656. fly_down = 0;
  657. gravity = 5;
  658. sudu = 40;
  659. return;
  660. case 2:
  661. fly_down = 0;
  662. gravity = 10;
  663. sudu = 40;
  664. return;
  665. case 3:
  666. fly_down = 1;
  667. gravity = 5;
  668. sudu = 40;
  669. return;
  670. default:
  671. break;
  672. }
  673. }
  674. return;
  675. }
  676. void introduce_window()//游戏介绍窗口
  677. {
  678. int back;
  679. while (1)
  680. {
  681. BeginBatchDraw();//开始绘画
  682. IMAGE game_js_bk;
  683. loadimage(&game_js_bk, _T("game_js_bk.png"));//设置背景
  684. putimage(0, 0, &game_js_bk);
  685. nomal_botton(650, 500, 750, 550, "");//第一个按钮
  686. FlushBatchDraw();//停止绘画
  687. back = return_back();
  688. if (back == 4)
  689. {
  690. return;
  691. }
  692. }
  693. return;
  694. }
  695. void victory_window()//游戏结束,获得胜利
  696. {
  697. int back;
  698. char record[50];
  699. while (1)
  700. {
  701. BeginBatchDraw();//开始绘画
  702. IMAGE victory_bk;
  703. loadimage(&victory_bk, _T("victory_bk.png"), window_length, window_width);//设置背景
  704. putimage(0, 0, &victory_bk);
  705. _itoa(now, record, 10);
  706. //设置按钮
  707. nomal_botton(650, 500, 750, 550, "返回");//第一个按钮
  708. //输出记录
  709. nomal_botton(610, 440, 710, 510, "记录:");
  710. nomal_botton(680, 440, 780, 510, record);
  711. FlushBatchDraw();//停止绘画
  712. back = return_back();
  713. if (back == 4)
  714. {
  715. return;
  716. }
  717. }
  718. return;
  719. }
  720. //游戏类
  721. void yun1()//大云朵
  722. {
  723. IMAGE yun_zcd1, yun_zcd2;
  724. //获取大云朵
  725. loadimage(&yun_zcd1, "yun_zcd1.png", 140, 30);
  726. loadimage(&yun_zcd2, "yun_zcd2.png", 140, 30);
  727. //云1
  728. putimage(180, 250, &yun_zcd2, SRCAND);
  729. putimage(180, 250, &yun_zcd1, SRCPAINT);
  730. //云2
  731. putimage(645, 440, &yun_zcd2, SRCAND);
  732. putimage(645, 440, &yun_zcd1, SRCPAINT);
  733. //云3
  734. putimage(420, 120, &yun_zcd2, SRCAND);
  735. putimage(420, 120, &yun_zcd1, SRCPAINT);
  736. return;
  737. }
  738. void yun2()//中云朵
  739. {
  740. IMAGE yun_yuan1, yun_bk1;
  741. //获取中云朵
  742. loadimage(&yun_yuan1, ("yun1.jpg"), 70, 35);
  743. loadimage(&yun_bk1, ("yun2.jpg"), 70, 35);
  744. //云1
  745. putimage(35, 350, &yun_bk1, SRCAND);
  746. putimage(35, 350, &yun_yuan1, SRCPAINT);
  747. //云2
  748. putimage(550, 330, &yun_bk1, SRCAND);
  749. putimage(550, 330, &yun_yuan1, SRCPAINT);
  750. //云3
  751. putimage(720, 280, &yun_bk1, SRCAND);
  752. putimage(720, 280, &yun_yuan1, SRCPAINT);
  753. //云4
  754. putimage(35, 160, &yun_bk1, SRCAND);
  755. putimage(35, 160, &yun_yuan1, SRCPAINT);
  756. return;
  757. }
  758. void yun3()//小云朵
  759. {
  760. IMAGE yun_yuan2, yun_bk2;
  761. //获取小云朵
  762. loadimage(&yun_yuan2, _T("yun1.jpg"), 40, 40);
  763. loadimage(&yun_bk2, _T("yun2.jpg"), 40, 40);
  764. //云1
  765. putimage(150, 420, &yun_bk2, SRCAND);
  766. putimage(150, 420, &yun_yuan2, SRCPAINT);
  767. //云2
  768. putimage(350, 180, &yun_bk2, SRCAND);
  769. putimage(350, 180, &yun_yuan2, SRCPAINT);
  770. //云3
  771. putimage(640, 200, &yun_bk2, SRCAND);
  772. putimage(640, 200, &yun_yuan2, SRCPAINT);
  773. //云4
  774. putimage(380, 410, &yun_bk2, SRCAND);
  775. putimage(380, 410, &yun_yuan2, SRCPAINT);
  776. return;
  777. }
  778. int check_top(int x, int y)//判断沙奈朵是否位于支撑点位
  779. {
  780. if (y < 200 && y > 150 && x > 140 && x < 280)//yun1.1
  781. {
  782. y = 170;//使不下落
  783. return y;
  784. }
  785. if (y < 380 && y > 340 && x > 605 && x < 745)//yun1.2
  786. {
  787. y = 360;//使不下落
  788. return y;
  789. }
  790. if (y < 60 && y > 20 && x > 380 && x < 520)//yun1.3
  791. {
  792. y = 40;//使不下落
  793. return y;
  794. }
  795. else if (y > 250 && y < 290 && x>0 && x < 80)//yun2.1
  796. {
  797. y = 270;//使不下落
  798. return y;
  799. }
  800. else if (y > 230 && y < 270 && x>515 && x < 600)//yun2.2
  801. {
  802. y = 250;//使不下落
  803. return y;
  804. }
  805. else if (y > 180 && y < 220 && x>685 && x < 750)//yun2.3
  806. {
  807. y = 200;//使不下落
  808. return y;
  809. }
  810. else if (y > 60 && y < 100 && x>0 && x < 65)//yun2.4
  811. {
  812. y = 80;//使不下落
  813. return y;
  814. }
  815. else if (y > 320 && y < 360 && x>110 && x < 150)//yun3.1
  816. {
  817. y = 340;//使不下落
  818. return y;
  819. }
  820. else if (y > 80 && y < 120 && x>310 && x < 350)//yun3.2
  821. {
  822. y = 100;//使不下落
  823. return y;
  824. }
  825. else if (y > 100 && y < 140 && x>600 && x < 640)//yun3.3
  826. {
  827. y = 120;//使不下落
  828. return y;
  829. }
  830. else if (y > 310 && y < 350 && x>340 && x < 380)//yun3.4
  831. {
  832. y = 330;//使不下落
  833. return y;
  834. }
  835. return y;
  836. }
  837. void game_time(int now)//显示游戏时间
  838. {
  839. setbkmode(TRANSPARENT);//设置字体背景透明
  840. char lingshi_text[50];//当前时间载体
  841. _itoa(now, lingshi_text, 10);//转化整型时间为字符串
  842. settextstyle(30, 15, "楷体");//设置字体
  843. settextcolor(BLACK);
  844. int text_x = 380;//内容横坐标
  845. int text_y = 0;//内容纵坐标
  846. outtextxy(text_x, text_y, lingshi_text);//输出时间
  847. return;
  848. }
  849. int gettime(clock_t start)//获得时间
  850. {
  851. clock_t end;
  852. int now;
  853. double now1;
  854. end = clock();//获取过去时间
  855. now1 = (double)(end - start) / CLOCKS_PER_SEC;//获取游戏开始时间
  856. now = int(now1);//转化为整数
  857. return now;//返回当前时间
  858. }
  859. void xuetiao(int blood)//血条
  860. {
  861. IMAGE tx, tx_bk, xt_k, xt_k_bk, xt_y, xt_y_bk, xt_er, xt_er_bk, xt_s, xt_s_bk;
  862. //头像
  863. loadimage(&tx, "tx.png", 55, 40);
  864. loadimage(&tx_bk, "tx_bk.png", 55, 40);
  865. //空血
  866. loadimage(&xt_k, "xt_k.png", 180, 20);
  867. loadimage(&xt_k_bk, "xt_k_bk.png", 180, 20);
  868. //一血
  869. loadimage(&xt_y, "xt_y.png", 180, 20);
  870. loadimage(&xt_y_bk, "xt_y_bk.png", 180, 20);
  871. //二血
  872. loadimage(&xt_er, "xt_er.png", 180, 20);
  873. loadimage(&xt_er_bk, "xt_er_bk.png", 180, 20);
  874. //三血(满血)
  875. loadimage(&xt_s, "xt_s.png", 180, 20);
  876. loadimage(&xt_s_bk, "xt_s_bk.png", 180, 20);
  877. //判断血量图
  878. switch (blood)
  879. {
  880. case 3://满血
  881. putimage(30, 0, &tx_bk, SRCAND);
  882. putimage(30, 0, &tx, SRCPAINT);
  883. putimage(90, 20, &xt_s_bk, SRCAND);
  884. putimage(90, 20, &xt_s, SRCPAINT);
  885. return;
  886. case 2://二血
  887. putimage(30, 0, &tx_bk, SRCAND);
  888. putimage(30, 0, &tx, SRCPAINT);
  889. putimage(90, 20, &xt_er_bk, SRCAND);
  890. putimage(90, 20, &xt_er, SRCPAINT);
  891. return;
  892. case 1://一血
  893. putimage(30, 0, &tx_bk, SRCAND);
  894. putimage(30, 0, &tx, SRCPAINT);
  895. putimage(90, 20, &xt_y_bk, SRCAND);
  896. putimage(90, 20, &xt_y, SRCPAINT);
  897. return;
  898. case 0://空血
  899. putimage(30, 0, &tx_bk, SRCAND);
  900. putimage(30, 0, &tx, SRCPAINT);
  901. putimage(90, 20, &xt_k_bk, SRCAND);
  902. putimage(90, 20, &xt_k, SRCPAINT);
  903. return;
  904. }
  905. }
  906. void top_npc1(int fly1, int space1, int npc_x1)//天空龙 1
  907. {
  908. IMAGE npc1, npc1_bk;
  909. //获取天空龙
  910. loadimage(&npc1, "top_npc1.png", 180, 70);
  911. loadimage(&npc1_bk, "top_npc1_bk.png", 180, 70);
  912. putimage(npc_x1, fly1 * 10, 90, 120, &npc1_bk, space1 * 85, 0, SRCAND);
  913. putimage(npc_x1, fly1 * 10, 90, 120, &npc1, space1 * 85, 0, SRCPAINT);
  914. return;
  915. }
  916. void top_npc2(int fly2, int space2, int npc_x2)//天空龙 2
  917. {
  918. IMAGE npc1, npc1_bk;
  919. //获取天空龙
  920. loadimage(&npc1, "top_npc1.png", 180, 70);
  921. loadimage(&npc1_bk, "top_npc1_bk.png", 180, 70);
  922. putimage(npc_x2, fly2 * 10, 90, 120, &npc1_bk, space2 * 85, 0, SRCAND);
  923. putimage(npc_x2, fly2 * 10, 90, 120, &npc1, space2 * 85, 0, SRCPAINT);
  924. return;
  925. }
  926. void right_npc(int fly3, int space3, int npc_y3)//天空龙 3
  927. {
  928. IMAGE npc, npc_bk;
  929. //获取天空龙
  930. loadimage(&npc, "left_npc.png", 360, 70);
  931. loadimage(&npc_bk, "left_npc_bk.png", 360, 70);
  932. putimage(710 - fly3 * 20, npc_y3, 90, 120, &npc_bk, space3 * 90, 0, SRCAND);
  933. putimage(710 - fly3 * 20, npc_y3, 90, 120, &npc, space3 * 90, 0, SRCPAINT);
  934. return;
  935. }
  936. void ground_npc(int fly4, int space4, int npc_y4)//喷火龙
  937. {
  938. IMAGE npc, npc_bk;
  939. //获取喷火龙
  940. loadimage(&npc, "ground_npc.png", 360, 70);
  941. loadimage(&npc_bk, "ground_npc_bk.png", 360, 70);
  942. putimage(fly4 * 20, npc_y4, 90, 120, &npc_bk, space4 * 90, 0, SRCAND);
  943. putimage(fly4 * 20, npc_y4, 90, 120, &npc, space4 * 90, 0, SRCPAINT);
  944. return;
  945. }
  946. void end_pkq(int fly5, int space5, int npc_y5)//皮卡丘——结束道具
  947. {
  948. IMAGE npc1, npc_bk1, npc2, npc_bk2, npc3, npc_bk3;
  949. //获取皮卡丘
  950. loadimage(&npc1, "pkq1.png", 50, 40);
  951. loadimage(&npc_bk1, "pkq2.png", 50, 40);
  952. loadimage(&npc2, "pkq3.png", 50, 40);
  953. loadimage(&npc_bk2, "pkq4.png", 50, 40);
  954. loadimage(&npc3, "pkq5.png", 50, 40);
  955. loadimage(&npc_bk3, "pkq6.png", 50, 40);
  956. switch (space5)
  957. {
  958. case 0:
  959. case 2:
  960. putimage(fly5 * sudu, npc_y5, &npc_bk1, SRCAND);
  961. putimage(fly5 * sudu, npc_y5, &npc1, SRCPAINT);
  962. break;
  963. case 1:
  964. putimage(fly5 * sudu, npc_y5, &npc_bk2, SRCAND);
  965. putimage(fly5 * sudu, npc_y5, &npc2, SRCPAINT);
  966. break;
  967. case 3:
  968. putimage(fly5 * sudu, npc_y5, &npc_bk3, SRCAND);
  969. putimage(fly5 * sudu, npc_y5, &npc3, SRCPAINT);
  970. break;
  971. }
  972. return;
  973. }
  974. int check_lose_blood(int x, int y, int npc_x, int npc_y)//判定扣血
  975. {
  976. //中心坐标
  977. int snd_center_x, snd_center_y, npc_center_x, npc_center_y;
  978. int a, b;
  979. //确定中心
  980. snd_center_x = x + 35;
  981. snd_center_y = y + 40;
  982. npc_center_x = npc_x + 45;
  983. npc_center_y = npc_y - 300;
  984. //判断位置以及碰撞关系
  985. if (snd_center_x < npc_center_x)//判断横坐标
  986. {
  987. if (snd_center_y < npc_center_y)//判断纵坐标
  988. {
  989. a = npc_center_x - snd_center_x;
  990. b = npc_center_y - snd_center_y;
  991. if (a < 50 && b < 40)//发生碰撞
  992. {
  993. return 1;
  994. }
  995. else
  996. {
  997. return 0;
  998. }
  999. }
  1000. else if (snd_center_y > npc_center_y)//判断纵坐标
  1001. {
  1002. a = npc_center_x - snd_center_x;
  1003. b = snd_center_y - npc_center_y;
  1004. if (a < 50 && b < 40)//发生碰撞
  1005. {
  1006. return 1;
  1007. }
  1008. else
  1009. {
  1010. return 0;
  1011. }
  1012. }
  1013. }
  1014. else if (snd_center_x > npc_center_x)//判断横坐标
  1015. {
  1016. if (snd_center_y < npc_center_y)//判断纵坐标
  1017. {
  1018. a = snd_center_x - npc_center_x;
  1019. b = npc_center_y - snd_center_y;
  1020. if (a < 50 && b < 40)//发生碰撞
  1021. {
  1022. return 1;
  1023. }
  1024. else
  1025. {
  1026. return 0;
  1027. }
  1028. }
  1029. else if (snd_center_y > npc_center_y)//判断纵坐标
  1030. {
  1031. a = snd_center_x - npc_center_x;
  1032. b = snd_center_y - npc_center_y;
  1033. if (a < 50 && b < 40)//发生碰撞
  1034. {
  1035. return 1;
  1036. }
  1037. else
  1038. {
  1039. return 0;
  1040. }
  1041. }
  1042. }
  1043. return 0;
  1044. }
  1045. int check_lose_blood_cm(int x, int y, int npc_x, int npc_y)//判定扣血——天空龙
  1046. {
  1047. //中心坐标
  1048. int snd_center_x, snd_center_y, npc_center_x, npc_center_y;
  1049. int a, b;
  1050. //确定中心
  1051. snd_center_x = x + 35;
  1052. snd_center_y = y + 40;
  1053. npc_center_x = npc_x + 45;
  1054. npc_center_y = npc_y + 35;
  1055. //判断位置以及碰撞关系
  1056. if (snd_center_x < npc_center_x)//判断横坐标
  1057. {
  1058. if (snd_center_y < npc_center_y)//判断纵坐标
  1059. {
  1060. a = npc_center_x - snd_center_x;
  1061. b = npc_center_y - snd_center_y;
  1062. if (a < 40 && b < 50)//发生碰撞
  1063. {
  1064. return 1;
  1065. }
  1066. else
  1067. {
  1068. return 0;
  1069. }
  1070. }
  1071. else if (snd_center_y > npc_center_y)//判断纵坐标
  1072. {
  1073. a = npc_center_x - snd_center_x;
  1074. b = snd_center_y - npc_center_y;
  1075. if (a < 40 && b < 50)//发生碰撞
  1076. {
  1077. return 1;
  1078. }
  1079. else
  1080. {
  1081. return 0;
  1082. }
  1083. }
  1084. }
  1085. else if (snd_center_x > npc_center_x)//判断横坐标
  1086. {
  1087. if (snd_center_y < npc_center_y)//判断纵坐标
  1088. {
  1089. a = snd_center_x - npc_center_x;
  1090. b = npc_center_y - snd_center_y;
  1091. if (a < 40 && b < 50)//发生碰撞
  1092. {
  1093. return 1;
  1094. }
  1095. else
  1096. {
  1097. return 0;
  1098. }
  1099. }
  1100. else if (snd_center_y > npc_center_y)//判断纵坐标
  1101. {
  1102. a = snd_center_x - npc_center_x;
  1103. b = snd_center_y - npc_center_y;
  1104. if (a < 40 && b < 50)//发生碰撞
  1105. {
  1106. return 1;
  1107. }
  1108. else
  1109. {
  1110. return 0;
  1111. }
  1112. }
  1113. }
  1114. return 0;
  1115. }
  1116. int check_lose_blood_g(int x, int y, int npc_x, int npc_y)//判定扣血——喷火龙
  1117. {
  1118. //中心坐标
  1119. int snd_center_x, snd_center_y, npc_center_x, npc_center_y;
  1120. int a, b;
  1121. //确定中心
  1122. snd_center_x = x + 35;
  1123. snd_center_y = y + 40;
  1124. npc_center_x = npc_x + 45;
  1125. npc_center_y = npc_y + 35;
  1126. //判断位置以及碰撞关系
  1127. if (snd_center_x < npc_center_x)//判断横坐标
  1128. {
  1129. if (snd_center_y < npc_center_y)//判断纵坐标
  1130. {
  1131. a = npc_center_x - snd_center_x;
  1132. b = npc_center_y - snd_center_y;
  1133. if (a < 60 && b < 60)//发生碰撞
  1134. {
  1135. return 1;
  1136. }
  1137. else
  1138. {
  1139. return 0;
  1140. }
  1141. }
  1142. else if (snd_center_y > npc_center_y)//判断纵坐标
  1143. {
  1144. a = npc_center_x - snd_center_x;
  1145. b = snd_center_y - npc_center_y;
  1146. if (a < 60 && b < 60)//发生碰撞
  1147. {
  1148. return 1;
  1149. }
  1150. else
  1151. {
  1152. return 0;
  1153. }
  1154. }
  1155. }
  1156. else if (snd_center_x > npc_center_x)//判断横坐标
  1157. {
  1158. if (snd_center_y < npc_center_y)//判断纵坐标
  1159. {
  1160. a = snd_center_x - npc_center_x;
  1161. b = npc_center_y - snd_center_y;
  1162. if (a < 30 && b < 60)//发生碰撞
  1163. {
  1164. return 1;
  1165. }
  1166. else
  1167. {
  1168. return 0;
  1169. }
  1170. }
  1171. else if (snd_center_y > npc_center_y)//判断纵坐标
  1172. {
  1173. a = snd_center_x - npc_center_x;
  1174. b = snd_center_y - npc_center_y;
  1175. if (a < 60 && b < 60)//发生碰撞
  1176. {
  1177. return 1;
  1178. }
  1179. else
  1180. {
  1181. return 0;
  1182. }
  1183. }
  1184. }
  1185. return 0;
  1186. }
  1187. int check_victory(int x, int y, int npc_x, int npc_y)//判定游戏胜利
  1188. {
  1189. //中心坐标
  1190. int snd_center_x, snd_center_y, npc_center_x, npc_center_y;
  1191. int a, b;
  1192. //确定中心
  1193. snd_center_x = x + 35;
  1194. snd_center_y = y + 40;
  1195. npc_center_x = npc_x + 25;
  1196. npc_center_y = npc_y + 20;
  1197. //判断位置以及碰撞关系
  1198. if (snd_center_x < npc_center_x)//判断横坐标
  1199. {
  1200. if (snd_center_y < npc_center_y)//判断纵坐标
  1201. {
  1202. a = npc_center_x - snd_center_x;
  1203. b = npc_center_y - snd_center_y;
  1204. if (a < 30 && b < 30)//发生碰撞
  1205. {
  1206. return 0;
  1207. }
  1208. else
  1209. {
  1210. return 1;
  1211. }
  1212. }
  1213. else if (snd_center_y > npc_center_y)//判断纵坐标
  1214. {
  1215. a = npc_center_x - snd_center_x;
  1216. b = snd_center_y - npc_center_y;
  1217. if (a < 30 && b < 30)//发生碰撞
  1218. {
  1219. return 0;
  1220. }
  1221. else
  1222. {
  1223. return 1;
  1224. }
  1225. }
  1226. }
  1227. else if (snd_center_x > npc_center_x)//判断横坐标
  1228. {
  1229. if (snd_center_y < npc_center_y)//判断纵坐标
  1230. {
  1231. a = snd_center_x - npc_center_x;
  1232. b = npc_center_y - snd_center_y;
  1233. if (a < 30 && b < 30)//发生碰撞
  1234. {
  1235. return 0;
  1236. }
  1237. else
  1238. {
  1239. return 1;
  1240. }
  1241. }
  1242. else if (snd_center_y > npc_center_y)//判断纵坐标
  1243. {
  1244. a = snd_center_x - npc_center_x;
  1245. b = snd_center_y - npc_center_y;
  1246. if (a < 30 && b < 30)//发生碰撞
  1247. {
  1248. return 0;
  1249. }
  1250. else
  1251. {
  1252. return 1;
  1253. }
  1254. }
  1255. }
  1256. return 0;
  1257. }
  1258. int zanting(HWND gamewindow)//游戏暂停
  1259. {
  1260. int next_step;
  1261. int answer = MessageBox(gamewindow, "是否继续游戏?", "小命要紧", MB_OKCANCEL);//添加选择框内容
  1262. if (answer == IDOK)//继续游戏
  1263. {
  1264. next_step = 0;
  1265. return next_step;;
  1266. }
  1267. else if (answer == IDCANCEL)//回到开始界面
  1268. {
  1269. next_step = 1;
  1270. return next_step;;
  1271. }
  1272. }
  1273. //模块类
  1274. void nomal_botton(int left, int top, int right, int bottom, const char* text)//正常状态按钮
  1275. {
  1276. setbkmode(TRANSPARENT);//设置字体背景透明
  1277. char lingshi_text[50] = { 0 };//按钮内容
  1278. strcpy(lingshi_text, text);//获取内容
  1279. settextstyle(20, 20, "宋体");//设置字体
  1280. settextcolor(BLACK);
  1281. int text_x = left + (right - left - textwidth(lingshi_text)) / 2;//内容横坐标
  1282. int text_y = top + (bottom - top - textheight(lingshi_text)) / 2;//内容纵坐标
  1283. outtextxy(text_x, text_y, lingshi_text);
  1284. }
  1285. void abnomal_botton(int left, int top, int right, int bottom)//选中状态按钮
  1286. {
  1287. BeginBatchDraw();
  1288. setlinecolor(BLACK);//设置线条颜色
  1289. setlinestyle(PS_SOLID, 1);//设置线条类型
  1290. roundrect(left, top, right, bottom, 10, 10);//设置按钮
  1291. FlushBatchDraw();
  1292. }
  1293. int select()//点击选项模块
  1294. {
  1295. ExMessage msg;
  1296. while (1)
  1297. {
  1298. if (peekmessage(&msg, EM_MOUSE))//获取鼠标点击信息
  1299. {
  1300. switch (msg.message)//判断点击信息
  1301. {
  1302. case WM_LBUTTONDOWN://开始游戏
  1303. if (msg.x > 25 && msg.x < 200 && msg.y>100 && msg.y < 150)
  1304. {
  1305. abnomal_botton(25, 100, 200, 150);//点击后按钮状态
  1306. Sleep(500);
  1307. return 0;
  1308. }
  1309. else if (msg.x > 25 && msg.x < 200 && msg.y>200 && msg.y < 250)//选择难度模式
  1310. {
  1311. abnomal_botton(25, 200, 200, 250);//点击后按钮状态
  1312. Sleep(500);
  1313. return 1;
  1314. }
  1315. else if (msg.x > 25 && msg.x < 200 && msg.y>300 && msg.y < 350)//游戏介绍
  1316. {
  1317. abnomal_botton(25, 300, 200, 350);//点击后按钮状态
  1318. Sleep(500);
  1319. return 3;
  1320. }
  1321. else if (msg.x > 20 && msg.x < 200 && msg.y>400 && msg.y < 450)//退出游戏
  1322. {
  1323. abnomal_botton(25, 400, 200, 450);//点击后按钮状态
  1324. Sleep(500);
  1325. return 4;
  1326. }
  1327. default:
  1328. return 5;
  1329. }
  1330. }
  1331. }
  1332. }
  1333. int return_back()//游戏介绍返回点击
  1334. {
  1335. ExMessage msg;
  1336. while (1)
  1337. {
  1338. if (peekmessage(&msg, EM_MOUSE))//获取鼠标点击信息
  1339. {
  1340. switch (msg.message)//判断点击信息
  1341. {
  1342. case WM_LBUTTONDOWN://开始游戏
  1343. if (msg.x > 550 && msg.x < 750 && msg.y>350 && msg.y < 550)
  1344. {
  1345. abnomal_botton(650, 500, 750, 550);//点击后按钮状态
  1346. Sleep(500);
  1347. return 4;
  1348. }
  1349. default:
  1350. return 5;
  1351. }
  1352. }
  1353. }
  1354. }
  1355. int select_differ()//难度选择
  1356. {
  1357. ExMessage msg;
  1358. while (1)
  1359. {
  1360. if (peekmessage(&msg, EM_MOUSE))//获取鼠标点击信息
  1361. {
  1362. switch (msg.message)//判断点击信息
  1363. {
  1364. case WM_LBUTTONDOWN://开始游戏
  1365. if (msg.x > 25 && msg.x < 200 && msg.y>60 && msg.y < 110)
  1366. {
  1367. abnomal_botton(25, 60, 200, 110);//点击后按钮状态
  1368. Sleep(500);
  1369. return 0;
  1370. }
  1371. else if (msg.x > 25 && msg.x < 200 && msg.y>150 && msg.y < 200)//选择难度模式
  1372. {
  1373. abnomal_botton(25, 150, 200, 200);//点击后按钮状态
  1374. Sleep(500);
  1375. return 1;
  1376. }
  1377. else if (msg.x > 25 && msg.x < 200 && msg.y>240 && msg.y < 290)//游戏介绍
  1378. {
  1379. abnomal_botton(25, 240, 200, 290);//点击后按钮状态
  1380. Sleep(500);
  1381. return 2;
  1382. }
  1383. else if (msg.x > 20 && msg.x < 200 && msg.y>330 && msg.y < 380)//退出游戏
  1384. {
  1385. abnomal_botton(25, 330, 200, 380);//点击后按钮状态
  1386. Sleep(500);
  1387. return 3;
  1388. }
  1389. default:
  1390. return 4;
  1391. }
  1392. }
  1393. }
  1394. }
  1395. void menu(int choice, HWND startwindow)//菜单中转
  1396. {
  1397. switch (choice)
  1398. {
  1399. case 0://开始游戏
  1400. int result;
  1401. running_window();
  1402. cleardevice();
  1403. result = game_window();
  1404. if (result == 0)
  1405. {
  1406. start_window();
  1407. }
  1408. else if (result == 1)
  1409. {
  1410. victory_window();
  1411. }
  1412. return;
  1413. case 1://选择模式
  1414. change_window();
  1415. return;
  1416. case 3://游戏简介
  1417. introduce_window();
  1418. return;
  1419. case 4://退出游戏
  1420. end_mode(startwindow);
  1421. start_window();
  1422. return;
  1423. case 5:
  1424. return;
  1425. }
  1426. }
  1427. void running(int i, int lunhuan)//进度条
  1428. {
  1429. //进度条
  1430. IMAGE a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16;
  1431. //皮卡丘
  1432. IMAGE g1, g2, g3, g4, g7, g8;
  1433. //获取资源
  1434. //进度条
  1435. loadimage(&a1, _T("jdt1.png"), 750, 40);
  1436. loadimage(&a2, _T("jdt2.png"), 750, 40);
  1437. loadimage(&a3, _T("jdt3.png"), 750, 40);
  1438. loadimage(&a4, _T("jdt4.png"), 750, 40);
  1439. loadimage(&a5, _T("jdt5.png"), 750, 40);
  1440. loadimage(&a6, _T("jdt6.png"), 750, 40);
  1441. loadimage(&a7, _T("jdt7.png"), 750, 40);
  1442. loadimage(&a8, _T("jdt8.png"), 750, 40);
  1443. loadimage(&a9, _T("jdt9.png"), 750, 40);
  1444. loadimage(&a10, _T("jdt10.png"), 750, 40);
  1445. loadimage(&a11, _T("jdt11.png"), 750, 40);
  1446. loadimage(&a12, _T("jdt12.png"), 750, 40);
  1447. loadimage(&a15, _T("jdt15.png"), 750, 40);
  1448. loadimage(&a16, _T("jdt16.png"), 750, 40);
  1449. loadimage(&a13, _T("jdt13.png"), 750, 40);
  1450. loadimage(&a14, _T("jdt14.png"), 750, 40);
  1451. //皮卡丘
  1452. loadimage(&g1, _T("pkq1.png"), 70, 60);
  1453. loadimage(&g2, _T("pkq2.png"), 70, 60);
  1454. loadimage(&g3, _T("pkq3.png"), 70, 60);
  1455. loadimage(&g4, _T("pkq4.png"), 70, 60);
  1456. loadimage(&g7, _T("pkq5.png"), 70, 60);
  1457. loadimage(&g8, _T("pkq6.png"), 70, 60);
  1458. switch (i)//判断进程
  1459. {
  1460. case 1:
  1461. if (lunhuan == 0 || lunhuan == 2)
  1462. {
  1463. putimage(35, 520, &a2, SRCAND);//添加位运算宏
  1464. putimage(35, 520, &a1, SRCPAINT);
  1465. putimage(25, 500, &g2, SRCAND);//添加位运算宏
  1466. putimage(25, 500, &g1, SRCPAINT);
  1467. break;
  1468. }
  1469. else if (lunhuan == 1)
  1470. {
  1471. putimage(35, 520, &a2, SRCAND);//添加位运算宏
  1472. putimage(35, 520, &a1, SRCPAINT);
  1473. putimage(25, 500, &g4, SRCAND);//添加位运算宏
  1474. putimage(25, 500, &g3, SRCPAINT);
  1475. break;
  1476. }
  1477. else if (lunhuan == 3)
  1478. {
  1479. putimage(35, 520, &a2, SRCAND);//添加位运算宏
  1480. putimage(35, 520, &a1, SRCPAINT);
  1481. putimage(25, 500, &g8, SRCAND);//添加位运算宏
  1482. putimage(25, 500, &g7, SRCPAINT);
  1483. break;
  1484. }
  1485. case 2:
  1486. if (lunhuan == 0 || lunhuan == 2)
  1487. {
  1488. putimage(35, 520, &a4, SRCAND);//添加位运算宏
  1489. putimage(35, 520, &a3, SRCPAINT);
  1490. putimage(60, 500, &g2, SRCAND);//添加位运算宏
  1491. putimage(60, 500, &g1, SRCPAINT);
  1492. break;
  1493. }
  1494. else if (lunhuan == 1)
  1495. {
  1496. putimage(35, 520, &a4, SRCAND);//添加位运算宏
  1497. putimage(35, 520, &a3, SRCPAINT);
  1498. putimage(60, 500, &g4, SRCAND);//添加位运算宏
  1499. putimage(60, 500, &g3, SRCPAINT);
  1500. break;
  1501. }
  1502. else if (lunhuan == 3)
  1503. {
  1504. putimage(35, 520, &a4, SRCAND);//添加位运算宏
  1505. putimage(35, 520, &a3, SRCPAINT);
  1506. putimage(60, 500, &g8, SRCAND);//添加位运算宏
  1507. putimage(60, 500, &g7, SRCPAINT);
  1508. break;
  1509. }
  1510. case 3:
  1511. if (lunhuan == 0 || lunhuan == 2)
  1512. {
  1513. putimage(35, 520, &a6, SRCAND);//添加位运算宏
  1514. putimage(35, 520, &a5, SRCPAINT);
  1515. putimage(110, 500, &g2, SRCAND);//添加位运算宏
  1516. putimage(110, 500, &g1, SRCPAINT);
  1517. break;
  1518. }
  1519. else if (lunhuan == 1)
  1520. {
  1521. putimage(35, 520, &a6, SRCAND);//添加位运算宏
  1522. putimage(35, 520, &a5, SRCPAINT);
  1523. putimage(110, 500, &g4, SRCAND);//添加位运算宏
  1524. putimage(110, 500, &g3, SRCPAINT);
  1525. break;
  1526. }
  1527. else if (lunhuan == 3)
  1528. {
  1529. putimage(35, 520, &a6, SRCAND);//添加位运算宏
  1530. putimage(35, 520, &a5, SRCPAINT);
  1531. putimage(110, 500, &g8, SRCAND);//添加位运算宏
  1532. putimage(110, 500, &g7, SRCPAINT);
  1533. break;
  1534. }
  1535. case 4:
  1536. if (lunhuan == 0 || lunhuan == 2)
  1537. {
  1538. putimage(35, 520, &a8, SRCAND);//添加位运算宏
  1539. putimage(35, 520, &a7, SRCPAINT);
  1540. putimage(180, 500, &g2, SRCAND);//添加位运算宏
  1541. putimage(180, 500, &g1, SRCPAINT);
  1542. break;
  1543. }
  1544. else if (lunhuan == 1)
  1545. {
  1546. putimage(35, 520, &a8, SRCAND);//添加位运算宏
  1547. putimage(35, 520, &a7, SRCPAINT);
  1548. putimage(180, 500, &g4, SRCAND);//添加位运算宏
  1549. putimage(180, 500, &g3, SRCPAINT);
  1550. break;
  1551. }
  1552. else if (lunhuan == 1)
  1553. {
  1554. putimage(35, 520, &a8, SRCAND);//添加位运算宏
  1555. putimage(35, 520, &a7, SRCPAINT);
  1556. putimage(180, 500, &g8, SRCAND);//添加位运算宏
  1557. putimage(180, 500, &g7, SRCPAINT);
  1558. break;
  1559. }
  1560. case 5:
  1561. if (lunhuan == 0 || lunhuan == 2)
  1562. {
  1563. putimage(35, 520, &a10, SRCAND);//添加位运算宏
  1564. putimage(35, 520, &a9, SRCPAINT);
  1565. putimage(345, 500, &g2, SRCAND);//添加位运算宏
  1566. putimage(345, 500, &g1, SRCPAINT);
  1567. break;
  1568. }
  1569. else if (lunhuan == 1)
  1570. {
  1571. putimage(35, 520, &a10, SRCAND);//添加位运算宏
  1572. putimage(35, 520, &a9, SRCPAINT);
  1573. putimage(345, 500, &g4, SRCAND);//添加位运算宏
  1574. putimage(345, 500, &g3, SRCPAINT);
  1575. break;
  1576. }
  1577. else if (lunhuan == 3)
  1578. {
  1579. putimage(35, 520, &a10, SRCAND);//添加位运算宏
  1580. putimage(35, 520, &a9, SRCPAINT);
  1581. putimage(345, 500, &g8, SRCAND);//添加位运算宏
  1582. putimage(345, 500, &g7, SRCPAINT);
  1583. break;
  1584. }
  1585. case 6:
  1586. if (lunhuan == 0 || lunhuan == 2)
  1587. {
  1588. putimage(35, 520, &a12, SRCAND);//添加位运算宏
  1589. putimage(35, 520, &a11, SRCPAINT);
  1590. putimage(370, 500, &g2, SRCAND);//添加位运算宏
  1591. putimage(370, 500, &g1, SRCPAINT);
  1592. break;
  1593. }
  1594. else if (lunhuan == 1)
  1595. {
  1596. putimage(35, 520, &a12, SRCAND);//添加位运算宏
  1597. putimage(35, 520, &a11, SRCPAINT);
  1598. putimage(370, 500, &g4, SRCAND);//添加位运算宏
  1599. putimage(370, 500, &g3, SRCPAINT);
  1600. break;
  1601. }
  1602. else if (lunhuan == 3)
  1603. {
  1604. putimage(35, 520, &a12, SRCAND);//添加位运算宏
  1605. putimage(35, 520, &a11, SRCPAINT);
  1606. putimage(370, 500, &g8, SRCAND);//添加位运算宏
  1607. putimage(370, 500, &g7, SRCPAINT);
  1608. break;
  1609. }
  1610. case 7:
  1611. if (lunhuan == 0 || lunhuan == 2)
  1612. {
  1613. putimage(35, 520, &a14, SRCAND);//添加位运算宏
  1614. putimage(35, 520, &a13, SRCPAINT);
  1615. putimage(520, 500, &g2, SRCAND);//添加位运算宏
  1616. putimage(520, 500, &g1, SRCPAINT);
  1617. break;
  1618. }
  1619. else if (lunhuan == 1)
  1620. {
  1621. putimage(35, 520, &a14, SRCAND);//添加位运算宏
  1622. putimage(35, 520, &a13, SRCPAINT);
  1623. putimage(520, 500, &g4, SRCAND);//添加位运算宏
  1624. putimage(520, 500, &g3, SRCPAINT);
  1625. break;
  1626. }
  1627. else if (lunhuan == 3)
  1628. {
  1629. putimage(35, 520, &a14, SRCAND);//添加位运算宏
  1630. putimage(35, 520, &a13, SRCPAINT);
  1631. putimage(520, 500, &g8, SRCAND);//添加位运算宏
  1632. putimage(520, 500, &g7, SRCPAINT);
  1633. break;
  1634. }
  1635. case 8:
  1636. if (lunhuan == 0 || lunhuan == 2)
  1637. {
  1638. putimage(35, 520, &a16, SRCAND);//添加位运算宏
  1639. putimage(35, 520, &a15, SRCPAINT);
  1640. putimage(720, 500, &g2, SRCAND);//添加位运算宏
  1641. putimage(720, 500, &g1, SRCPAINT);
  1642. break;
  1643. }
  1644. else if (lunhuan == 1)
  1645. {
  1646. putimage(35, 520, &a16, SRCAND);//添加位运算宏
  1647. putimage(35, 520, &a15, SRCPAINT);
  1648. putimage(720, 500, &g4, SRCAND);//添加位运算宏
  1649. putimage(720, 500, &g3, SRCPAINT);
  1650. break;
  1651. }
  1652. else if (lunhuan == 3)
  1653. {
  1654. putimage(35, 520, &a16, SRCAND);//添加位运算宏
  1655. putimage(35, 520, &a15, SRCPAINT);
  1656. putimage(720, 500, &g8, SRCAND);//添加位运算宏
  1657. putimage(720, 500, &g7, SRCPAINT);
  1658. break;
  1659. }
  1660. default:
  1661. break;
  1662. }
  1663. }
  1664. void end_mode(HWND startwindow)//结束模块
  1665. {
  1666. int answer = MessageBox(startwindow, "是否结束游戏?", "猫娘乐园", MB_OKCANCEL);//添加选择框内容
  1667. if (answer == IDOK)
  1668. {
  1669. closegraph();//结束游戏
  1670. mciSendString("close bgm.mp3 ", 0, 0, 0);
  1671. exit(-1);
  1672. }
  1673. else if (answer == IDCANCEL)//回到游戏界面
  1674. {
  1675. return;
  1676. }
  1677. }
  1678. int check_jdt(int zhongzhuan)//判断进度条位置,返回决定参数
  1679. {
  1680. if (zhongzhuan < 4)
  1681. {
  1682. i = 1;
  1683. return i;
  1684. }
  1685. else if (zhongzhuan > 3 && zhongzhuan < 8)
  1686. {
  1687. i = 2;
  1688. return i;
  1689. }
  1690. else if (zhongzhuan > 7 && zhongzhuan < 12)
  1691. {
  1692. i = 3;
  1693. return i;
  1694. }
  1695. else if (zhongzhuan > 11 && zhongzhuan < 16)
  1696. {
  1697. i = 4;
  1698. return i;
  1699. }
  1700. else if (zhongzhuan > 15 && zhongzhuan < 20)
  1701. {
  1702. i = 5;
  1703. return i;
  1704. }
  1705. else if (zhongzhuan > 19 && zhongzhuan < 24)
  1706. {
  1707. i = 6;
  1708. return i;
  1709. }
  1710. else if (zhongzhuan > 23 && zhongzhuan < 28)
  1711. {
  1712. i = 7;
  1713. return i;
  1714. }
  1715. else if (zhongzhuan > 27 && zhongzhuan < 32)
  1716. {
  1717. i = 8;
  1718. return i;
  1719. }
  1720. }
  1721. void music()//背景音乐
  1722. {
  1723. mciSendString("open bgm.mp3 alias BGM", 0, 0, 0);
  1724. mciSendString("play BGM repeat", 0, 0, 0);
  1725. return;
  1726. }
  1727. //主程序
  1728. int main()
  1729. {
  1730. start_window();//加载开始界面
  1731. //游戏开始
  1732. //游戏结束
  1733. return 0;//退出游戏
  1734. }

下载链接加上游戏素材

打包后:

链接:https://pan.baidu.com/s/1z3doEvnkdki555dBR3ywvQ?pwd=mzau 
提取码:mzau

打包前(含素材):

链接:https://pan.baidu.com/s/10OgYAvB6AvBZcKGo6612tA?pwd=05je 
提取码:05je


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/358870
推荐阅读
相关标签
  

闽ICP备14008679号