分享

纯C写的小游戏

 孤独一兵 2016-11-23

很多编程爱好者都编写过推箱子游戏编程吧,最近有好些朋友看见我以前的推箱子程序后,

问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。

纯C写的小游戏-----最炫酷推箱子

纯C写的小游戏-----推箱子 (加群: 571545210 学习编程,在群里获得更多的学习资料)

通过w,s,a,d实现上下左右的移动

声明画图函数

然后分别对移动位置进行情况判断:

1.如果人前面是空地。

2.如果人前面是目的地。

3.如果人前面是箱子。有以下两种情况:

如果人前面是箱子,而箱子前面是空地。

如果人的前面是箱子,而箱子前面是目的地。

4.如果人前面是已经进入某目的地的箱子。有以下两种情况:

如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

5.对箱子原先位置的判断。

6.对人原先位置进行判断。

【从百科上参考查阅下载的代码,并加以整理】

[cpp] view plain copy

  1. //此小游戏使用C语言编写,编译环境VS2008

  2. #include

  3. #include

  4. #include

  5. int i,j;

  6. void draw_map(int map[10][12]); //声明画图函数

  7. int main()

  8. {

  9. char input;

  10. int count=0; //定义记分变量

  11. /*下面定义一个二维数组,其中的元素是不同图像的ID号,在后面的函数中将讲解不同数字分别代表的图像元素*/

  12. int map[10][12] = {

  13. {2,2,2,2,2,1,1,1,1,1,2,2},

  14. {1,1,1,1,2,1,0,0,0,1,1,2},

  15. {1,0,0,1,1,1,0,1,0,0,1,2},

  16. {1,0,4,3,3,3,3,3,1,0,1,1},

  17. {1,0,0,1,1,3,3,3,4,0,0,1},

  18. {1,0,0,0,0,4,1,1,4,1,0,1},

  19. {1,0,4,1,4,0,0,0,4,0,0,1},

  20. {1,1,0,6,0,1,1,1,4,1,0,1},

  21. {2,1,1,1,1,1,2,1,0,0,0,1},

  22. {2,2,2,2,2,2,2,1,1,1,1,1}

  23. };

  24. while (1) //死循环,等待用户命令

  25. {

  26. system('CLS');

  27. for (i=0;i<>

  28. {

  29. printf('%d',i);

  30. }

  31. printf('\n');

  32. /*for (i=1;i<>

  33. {

  34. printf('%d\n',i);

  35. }*/

  36. printf('\n');

  37. draw_map(map);

  38. printf('当前得分:%d\n',count);

  39. //找初始位置

  40. for (i=0;i<>

  41. {

  42. for (j=0;j<>

  43. {

  44. if (map[i][j]==6||map[i][j]==9)

  45. break;

  46. }

  47. if (map[i][j]==6||map[i][j]==9)

  48. break;

  49. }

  50. printf('您的当前坐标(%d,%d)',i,j);

  51. input = getch(); //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。

  52. switch (input)

  53. {

  54. case'w':

  55. //如果人前面是空地。 //0代表空地 6代表人 //3代表目的地

  56. if(map[i-1][j]==0)

  57. {

  58. map[i-1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

  59. if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

  60. map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

  61. else

  62. map[i][j]=0; //否则原地ID修改为空地ID 。

  63. }

  64. //如果人前面是目的地。

  65. elseif((map[i-1][j]==3)||(map[i-1][j]==9))

  66. {

  67. map[i-1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

  68. if(map[i][j]==9) //如果原地也是目的地(ID为)。

  69. map[i][j]=3; //人走后把原地ID修改回目的地ID。

  70. else

  71. map[i][j]=0; //否则原地ID修改为为空地ID

  72. }

  73. //如果人前面是箱子。//4代表箱子 //7箱子进入目的地

  74. elseif(map[i-1][j]==4)

  75. {

  76. //如果人前面是箱子,而箱子前面是空地。

  77. if (map[i-2][j]==0)

  78. {

  79. map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

  80. //下面是对箱子原地进行判断

  81. if(map[i-1][j]==7) //如果箱子原地为目的地。

  82. map[i-1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

  83. else

  84. map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

  85. //下面是对人原地进行判断

  86. if(map[i][j]==9) //如果之前是目的地。

  87. map[i][j]=3; //人走了之后修改回目的地ID。

  88. else

  89. map[i][j]=0; //否则就是空地。

  90. }

  91. //如果人的前面是箱子,而箱子前面是目的地。

  92. elseif (map[i-2][j]==3)

  93. {

  94. map[i-2][j]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

  95. count++;

  96. //下面是对箱子原先位置的判断,同上。

  97. if(map[i-1][j]==7)

  98. map[i-1][j]=9;

  99. else

  100. map[i-1][j]=6;

  101. //下面是对人原先位置进行判断,同上。

  102. if(map[i][j]==9)

  103. map[i][j]=3;

  104. else

  105. map[i][j]=0;

  106. }

  107. }

  108. //如果人前面是已经进入某目的地的箱子(ID=7)。

  109. elseif(map[i-1][j]==7)

  110. {

  111. //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

  112. if(map[i-2][j]==0)

  113. {

  114. count--;

  115. map[i-2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

  116. map[i-1][j]=9; //人自然而然的就站在了原先的目的地上了。

  117. //下面是对人原先地进行判断,方法同上。

  118. if(map[i][j]==9)

  119. map[i][j]=3;

  120. else

  121. map[i][j]=0;

  122. }

  123. //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

  124. if(map[i-2][j]==3)

  125. {

  126. map[i-2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。

  127. map[i-1][j]=9; //人站在了目的地上。

  128. //下面是对人原先站立地进行判断,方法同上。

  129. if(map[i][j]==9)

  130. map[i][j]=3;

  131. else

  132. map[i][j]=0;

  133. }

  134. }

  135. break;

  136. case's':

  137. //如果人前面是空地。

  138. if(map[i+1][j]==0)

  139. {

  140. map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

  141. if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

  142. map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

  143. else

  144. map[i][j]=0; //否则原地ID修改为空地ID 。

  145. }

  146. //如果人前面是目的地。

  147. elseif(map[i+1][j]==3)

  148. {

  149. map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

  150. if(map[i][j]==9) //如果原地也是目的地(ID为)。

  151. map[i][j]=3; //人走后把原地ID修改回目的地ID。

  152. else

  153. map[i][j]=0; //否则原地ID修改为为空地ID

  154. }

  155. //如果人前面是箱子。

  156. elseif(map[i+1][j]==4)

  157. {

  158. //如果人前面是箱子,而箱子前面是空地。

  159. if (map[i+2][j]==0)

  160. {

  161. map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

  162. //下面是对箱子原地进行判断

  163. if(map[i+1][j]==7) //如果箱子原地为目的地。

  164. map[i+1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

  165. else

  166. map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

  167. //下面是对人原地进行判断

  168. if(map[i][j]==9) //如果之前是目的地。

  169. map[i][j]=3; //人走了之后修改回目的地ID。

  170. else

  171. map[i][j]=0; //否则就是空地。 (加群: 571545210 学习编程,在群里获得更多的学习资料)

  172. }

  173. //如果人的前面是箱子,而箱子前面是目的地。

  174. elseif (map[i+2][j]==3)

  175. {

  176. map[i-2][j]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

  177. count++;

  178. //下面是对箱子原先位置的判断,同上。

  179. if(map[i+1][j]==7)

  180. map[i+1][j]=9;

  181. else

  182. map[i+1][j]=6;

  183. //下面是对人原先位置进行判断,同上。

  184. if(map[i][j]==9)

  185. map[i][j]=3;

  186. else

  187. map[i][j]=0;

  188. }

  189. }

  190. //如果人前面是已经进入某目的地的箱子(ID=7)。

  191. elseif(map[i+1][j]==7)

  192. {

  193. //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

  194. if(map[i+2][j]==0)

  195. {

  196. count--;

  197. map[i+2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

  198. map[i+1][j]=9; //人自然而然的就站在了原先的目的地上了。

  199. //下面是对人原先地进行判断,方法同上。

  200. if(map[i][j]==9)

  201. map[i][j]=3;

  202. else

  203. map[i][j]=0;

  204. }

  205. //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

  206. if(map[i+2][j]==3)

  207. {

  208. map[i+2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。

  209. map[i+1][j]=9; //人站在了目的地上。

  210. //下面是对人原先站立地进行判断,方法同上。

  211. if(map[i][j]==9)

  212. map[i][j]=3;

  213. else

  214. map[i][j]=0;

  215. }

  216. }

  217. break;

  218. case'a':

  219. //如果人前面是空地。

  220. if(map[i][j-1]==0)

  221. {

  222. map[i][j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

  223. if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

  224. map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

  225. else

  226. map[i][j]=0; //否则原地ID修改为空地ID 。

  227. }

  228. //如果人前面是目的地。

  229. elseif(map[i][j-1]==3)

  230. {

  231. map[i][j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

  232. if(map[i][j]==9) //如果原地也是目的地(ID为)。

  233. map[i][j]=3; //人走后把原地ID修改回目的地ID。

  234. else

  235. map[i][j]=0; //否则原地ID修改为为空地ID

  236. }

  237. //如果人前面是箱子。

  238. elseif(map[i][j-1]==4)

  239. {

  240. //如果人前面是箱子,而箱子前面是空地。

  241. if (map[i][j-2]==0)

  242. {

  243. map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

  244. //下面是对箱子原地进行判断

  245. if(map[i][j-1]==7) //如果箱子原地为目的地。

  246. map[i][j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

  247. else

  248. map[i][j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

  249. //下面是对人原地进行判断

  250. if(map[i][j]==9) //如果之前是目的地。

  251. map[i][j]=3; //人走了之后修改回目的地ID。

  252. else

  253. map[i][j]=0; //否则就是空地。

  254. }

  255. //如果人的前面是箱子,而箱子前面是目的地。

  256. elseif (map[i][j-2]==3)

  257. {

  258. count++;

  259. map[i][j-2]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

  260. //下面是对箱子原先位置的判断,同上。

  261. if(map[i][j-1]==7)

  262. map[i][j-1]=9;

  263. else

  264. map[i][j-1]=6;

  265. //下面是对人原先位置进行判断,同上。

  266. if(map[i][j]==9)

  267. map[i][j]=3;

  268. else

  269. map[i][j]=0;

  270. }

  271. }

  272. //如果人前面是已经进入某目的地的箱子(ID=7)。

  273. elseif(map[i][j-1]==7)

  274. {

  275. //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

  276. if(map[i][j-2]==0)

  277. {

  278. count--;

  279. map[i][j-2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

  280. map[i][j-1]=9; //人自然而然的就站在了原先的目的地上了。

  281. //下面是对人原先地进行判断,方法同上。

  282. if(map[i][j]==9)

  283. map[i][j]=3;

  284. else

  285. map[i][j]=0;

  286. }

  287. //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

  288. if(map[i][j-2]==3)

  289. {

  290. map[i][j-2]=7; //把箱子推入了另一目的地,自然,ID也应是。

  291. map[i][j-1]=9; //人站在了目的地上。

  292. //下面是对人原先站立地进行判断,方法同上。

  293. if(map[i][j]==9)

  294. map[i][j]=3;

  295. else

  296. map[i][j]=0;

  297. }

  298. }

  299. break;

  300. case'd':

  301. //如果人前面是空地。

  302. if(map[i][j+1]==0)

  303. {

  304. map[i][j+1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。

  305. if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。

  306. map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。

  307. else

  308. map[i][j]=0; //否则原地ID修改为空地ID 。

  309. }

  310. //如果人前面是目的地。

  311. elseif(map[i][j+1]==3)

  312. {

  313. map[i][j+1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。

  314. if(map[i][j]==9) //如果原地也是目的地(ID为)。

  315. map[i][j]=3; //人走后把原地ID修改回目的地ID。

  316. else

  317. map[i][j]=0; //否则原地ID修改为为空地ID

  318. }

  319. //如果人前面是箱子。

  320. elseif(map[i][j+1]==4)

  321. {

  322. //如果人前面是箱子,而箱子前面是空地。

  323. if (map[i][j+2]==0)

  324. {

  325. map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()

  326. //下面是对箱子原地进行判断

  327. if(map[i][j+1]==7) //如果箱子原地为目的地。

  328. map[i][j+1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。

  329. else

  330. map[i][j+1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。

  331. //下面是对人原地进行判断

  332. if(map[i][j]==9) //如果之前是目的地。

  333. map[i][j]=3; //人走了之后修改回目的地ID。

  334. else

  335. map[i][j]=0; //否则就是空地。

  336. }

  337. //如果人的前面是箱子,而箱子前面是目的地。

  338. elseif (map[i][j+2]==3)

  339. {

  340. count++;

  341. map[i][j+2]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。

  342. //下面是对箱子原先位置的判断,同上。

  343. if(map[i][j+1]==7)

  344. map[i][j+1]=9;

  345. else

  346. map[i][j+1]=6;

  347. //下面是对人原先位置进行判断,同上。

  348. if(map[i][j]==9)

  349. map[i][j]=3;

  350. else

  351. map[i][j]=0;

  352. }

  353. }

  354. //如果人前面是已经进入某目的地的箱子(ID=7)。

  355. elseif(map[i][j+1]==7)

  356. {

  357. //如果人前面是已经进入某目的地的箱子,而箱子前面是空地。

  358. if(map[i][j+2]==0)

  359. {

  360. count--;

  361. map[i][j+2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。

  362. map[i][j+1]=9; //人自然而然的就站在了原先的目的地上了。

  363. //下面是对人原先地进行判断,方法同上。

  364. if(map[i][j]==9)

  365. map[i][j]=3;

  366. else

  367. map[i][j]=0;

  368. }

  369. //如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。

  370. if(map[i][j+2]==3)

  371. {

  372. map[i][j+2]=7; //把箱子推入了另一目的地,自然,ID也应是。

  373. map[i][j+1]=9; //人站在了目的地上。

  374. //下面是对人原先站立地进行判断,方法同上。

  375. if(map[i][j]==9)

  376. map[i][j]=3;

  377. else

  378. map[i][j]=0;

  379. }

  380. }

  381. break;

  382. }

  383. if(count==8) //如果分数达到分

  384. {

  385. system('CLS'); //清屏

  386. draw_map(map);

  387. break; //退出死循环

  388. }

  389. }

  390. printf('\n恭喜你,过关了!!\n'); //过关提示

  391. return 0;

  392. }

  393. void draw_map(int map[10][12])

  394. {

  395. for(i=0;i<>

  396. {

  397. for(j=0;j<>

  398. {

  399. switch(map[i][j])

  400. {

  401. case 0:

  402. printf(' '); //数字代表道路

  403. break;

  404. case 1:

  405. printf('#'); //数字代表墙壁

  406. break;

  407. case 2:

  408. printf(' '); //数字是游戏边框的空白部分

  409. break;

  410. case 3:

  411. printf('!'); //数字代表目的地

  412. break;

  413. case 4:

  414. printf('*'); //数字代表箱子

  415. break;

  416. case 7:

  417. printf('$'); //数字代表箱子进入目的地

  418. break;

  419. case 6:

  420. printf('@'); //数字代表人

  421. break;

  422. case 9:

  423. printf('@'); //数字代表人进入目的地

  424. break;

  425. }

  426. }

  427. printf('\n'); //分行输出

  428. }

  429. }

  430. (加群: 571545210 学习编程,在群里获得更多的学习资料)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约