当前位置:   article > 正文

C语言经典小游戏之----推箱子_推箱子判断游戏胜利

推箱子判断游戏胜利

        在进行推箱子的实验中,可以使用对应的API函数来改变对应箱子的颜色,也需要根据,人在移动的过程中,可以通过方向键,并改变对应的颜色,从而实现控制人物的目的。

       代码实现如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<windows.h>
  5. #include<conio.h>
  6. int x = 0, y = 0;
  7. //存储当前使用的地图
  8. int map[10][10] = { 0 };
  9. //地图 1
  10. int map_1[10][10] = {
  11. { 0,0,1,1,1,0,0,0 },
  12. { 0,0,1,4,1,0,0,0 },
  13. { 0,0,1,0,1,1,1,1 },
  14. { 1,1,1,0,0,2,4,1 },
  15. { 1,4,2,2,0,1,1,1 },
  16. { 1,1,1,3,2,1,0,0 },
  17. { 0,0,0,1,4,1,0,0 },
  18. { 0,0,0,1,1,1,0,0 }
  19. };
  20. //地图 2
  21. int map_2[10][10] = {
  22. { 0,0,0,1,1,1,1,1,1,1 },
  23. { 0,0,1,1,0,0,1,0,3,1 },
  24. { 0,0,1,0,0,0,1,0,0,1 },
  25. { 0,0,1,2,0,2,0,2,0,1 },
  26. { 0,0,1,0,2,1,1,0,0,1 },
  27. { 1,1,1,0,2,0,1,0,1,1 },
  28. { 1,4,4,4,4,4,0,0,1,0 },
  29. { 1,1,1,1,1,1,1,1,1,0 },
  30. };
  31. //判断游戏是否挑战成功
  32. int finish();
  33. //控制小人移动
  34. void move(int x1, int y1, int x2, int y2);
  35. //根据二维数组,渲染地图
  36. int render();
  37. //查找小人所在的当前位置
  38. void find();
  39. //根据用户输入,确定用户选择哪张地图
  40. void setmap(int n);
  41. //设置文本显示时的颜色
  42. void color(int m);
  43. int main() {
  44. int n;
  45. char dir;
  46. char c;
  47. printf("**************推箱子游戏欢迎您***************\n"
  48. "* *\n"
  49. "* ----------------------- *\n"
  50. "* | Powered By c.biancheng.net | *\n"
  51. "* ----------------------- *\n"
  52. "* *\n"
  53. "* ♀:自己的位置 *\n"
  54. "* ☆:箱子要到的的位置 *\n"
  55. "* ■:箱子的位置 *\n"
  56. "* *\n"
  57. "* | 游戏规则 | *\n"
  58. "* *\n"
  59. "* 控制♀将■推到☆的位置 *\n"
  60. "* 按 wasd 控制♀的移动 *\n"
  61. "* 按 r 重新开始游戏 *\n"
  62. "* 按 q 退出游戏 *\n"
  63. "*********************************************\n");
  64. color(0xA);
  65. printf("请选择关卡:(1/2)(0:退出游戏):");
  66. while (scanf("%d", &n)) {
  67. getchar();
  68. //n==0,游戏退出
  69. if (n == 0) {
  70. printf("game over\n");
  71. break;
  72. }
  73. system("cls");//清空命令行窗口中显示的所有信息
  74. if (n == 1 || n == 2) {
  75. setmap(n);//根据 n 的值,设置当前地图
  76. render();//根据所选地图,在命令行窗口中将其渲染出来
  77. //游戏开始,用户输入字符w/a/s/d,控制小人移动
  78. while ((dir = getch()) != EOF) {
  79. system("cls");//移动之前,删除原有命令行中的地图
  80. find();//移动之前,需找到当前小人所在的位置
  81. //根据 dir 字符的值,控制小人的移动,以及设置重新开始和退出选项的操作
  82. switch (dir) {
  83. case 'w':move(x - 1, y, x - 2, y); break;
  84. case 's':move(x + 1, y, x + 2, y); break;
  85. case 'a':move(x, y - 1, x, y - 2); break;
  86. case 'd':move(x, y + 1, x, y + 2); break;
  87. case 'r':setmap(n); break;
  88. case 'q':return 0;
  89. }
  90. //重新渲染人移动后的场景
  91. render();
  92. //每次移动,判断是否挑战成功
  93. if (finish()) {
  94. printf("游戏胜利,请重新选择关卡(1/2)(0:退出游戏):");
  95. break;
  96. }
  97. }
  98. }
  99. else {
  100. printf("输入有误,请重新输入\n");
  101. printf("请选择关卡:(1/2)(0:退出游戏):");
  102. }
  103. }
  104. system("pause");
  105. return 0;
  106. }
  107. // 按w的时候的输出结果
  108. void move(int x1, int y1, int x2, int y2) {
  109. if (map[x][y] == 3) //找到自己的位置
  110. {
  111. //人前边是箱子,箱子在空格上
  112. if (map[x1][y1] == 2) {
  113. //箱子前边是空格
  114. if (map[x2][y2] == 0) {
  115. map[x][y] = 0;
  116. map[x1][y1] = 3;
  117. map[x2][y2] = 2;
  118. }
  119. //箱子前边是位置
  120. if (map[x2][y2] == 4) {
  121. map[x][y] = 0;
  122. map[x1][y1] = 3;
  123. map[x2][y2] = 5;
  124. }
  125. }
  126. //人前是箱子,箱子在位置上
  127. if (map[x1][y1] == 5) {
  128. //箱子前边是空格
  129. if (map[x2][y2] == 0) {
  130. map[x][y] = 0;
  131. map[x1][y1] = 6;
  132. map[x2][y2] = 2;
  133. }
  134. //箱子前边是位置
  135. if (map[x2][y2] == 4) {
  136. map[x][y] = 0;
  137. map[x1][y1] = 6;
  138. map[x2][y2] = 5;
  139. }
  140. }
  141. //人前为空格
  142. if (map[x1][y1] == 0) {
  143. map[x1][y1] = 3;
  144. map[x][y] = 0;
  145. }
  146. if (map[x1][y1] == 4) {
  147. map[x][y] = 0;
  148. map[x1][y1] = 6;
  149. }
  150. }
  151. if (map[x][y] == 6) //人在位置上
  152. {
  153. //位置前是箱子,箱子在空格上
  154. if (map[x1][y1] == 2) {
  155. //箱子前是空格
  156. if (map[x2][y2] == 0) {
  157. map[x][y] = 4;
  158. map[x1][y1] = 3;
  159. map[x2][y2] = 2;
  160. }
  161. //箱子前是位置
  162. if (map[x2][y2] == 4) {
  163. map[x][y] = 4;
  164. map[x1][y1] = 3;
  165. map[x2][y2] = 5;
  166. }
  167. }
  168. //位置前是箱子,箱子在位置上
  169. if (map[x1][y1] == 5) {
  170. //箱子前是空格
  171. if (map[x2][y2] == 0) {
  172. map[x][y] = 4;
  173. map[x1][y1] = 6;
  174. map[x2][y2] = 2;
  175. }
  176. //箱子前是位置
  177. if (map[x2][y2] == 4) {
  178. map[x][y] = 4;
  179. map[x1][y1] = 6;
  180. map[x2][y2] = 5;
  181. }
  182. }
  183. //人前面是位置
  184. if (map[x1][y1] == 4) {
  185. map[x][y] = 4;
  186. map[x1][y1] = 6;
  187. }
  188. //人前面是空格
  189. if (map[x1][y1] == 0) {
  190. map[x][y] = 4;
  191. map[x1][y1] = 3;
  192. }
  193. }
  194. }
  195. void find() {
  196. for (x = 0; x < 10; x++) {
  197. for (y = 0; y < 10; y++) {
  198. if (map[x][y] == 3 || map[x][y] == 6) {
  199. return;
  200. }
  201. }
  202. }
  203. }
  204. int render() {
  205. for (x = 0; x<10; x++) {
  206. for (y = 0; y<10; y++) {
  207. if (map[x][y] == 1) {
  208. color(8);
  209. printf("■"); //输出砖块的样子
  210. }
  211. if (map[x][y] == 3) {
  212. color(3);
  213. printf("♀"); //输出自己的位置
  214. }
  215. if (map[x][y] == 2) {
  216. color(4);
  217. printf("■"); //输出箱子
  218. }
  219. if (map[x][y] == 4) {
  220. color(0xE);
  221. printf("☆"); //输出箱子要到的位置
  222. }
  223. if (map[x][y] == 0) {
  224. color(0xF);
  225. printf(" "); //输出空白
  226. }
  227. if (map[x][y] == 5) {
  228. color(6);
  229. printf("★"); //箱子到达目标位置后的图标
  230. }
  231. if (map[x][y] == 6) {
  232. color(3);
  233. printf("♀");//人达到星星处,要由☆改为♀
  234. }
  235. }
  236. printf("\n");
  237. }
  238. return 0;
  239. }
  240. void setmap(int n) {
  241. if (n == 1) {
  242. memcpy(map, map_1, sizeof(map_1));
  243. }
  244. if (n == 2) {
  245. memcpy(map, map_2, sizeof(map_2));
  246. }
  247. }
  248. int finish()
  249. {
  250. for (x = 0; x < 10; x++) {
  251. for (y = 0; y < 10; y++) {
  252. if (map[x][y] == 2)
  253. return 0;
  254. }
  255. }
  256. return 1;
  257. }
  258. void color(int m) {
  259. HANDLE consolehend;
  260. consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
  261. SetConsoleTextAttribute(consolehend, m);
  262. }

对应的实验现象如下:

 

总结:在编写C语言代码的过程中,理解对应API函数的真正使用方法,加深对函数的理解。

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

闽ICP备14008679号