当前位置:   article > 正文

对于小游戏2048代码具体讲解_2048小游戏代码的每步解析

2048小游戏代码的每步解析

1.如何做到打印外面的方框。

  1. void Game_printf()
  2. {
  3. int i,k,j;
  4. printf("SCORE = %d\n", score);
  5. for (i=0;i<high;i++) //从第一行开始打印,由上往下。
  6. {
  7. for (k=0;k<4;k++) //画出每一行的格子分割线。
  8. {
  9. printf(" ");
  10. for(j=0;j<4;j++)
  11. {
  12. printf("-");
  13. }
  14. }
  15. printf("\n");
  16. for (k=0;k<4;k++)
  17. {
  18. printf("|");
  19. if (array[i][k]!=0) //如果这个不为0则将这个数打出来
  20. {
  21. printf("%4d", array[i][k]);
  22. }
  23. else //如果这个数是0的话,则打印空格。
  24. {
  25. for (j=0; j<4;j++)
  26. {
  27. printf(" ");
  28. }
  29. }
  30. }
  31. printf("|\n");
  32. if (i==high-1) //当i位于最后一行的时候,不需要用分割线来进行分割。
  33. {
  34. for (k=0; k<4; k++)
  35. {
  36. printf(" ");
  37. for (j=0; j<4; j++)
  38. {
  39. printf("-"); //打出最下面的底线。
  40. }
  41. }
  42. printf("\n");
  43. }
  44. }
  45. printf("使用上下左右或者wasd来进行游戏操作\n"); //提示本游戏的键位设置,应该如何玩这个游戏。
  46. }

对于打印方框来说,用好其他的符号,便可以很好的打印这个边框。

每一个空格占四个格子,在进行输出的时候,如果是零,为了美观,我们将这个用四个空格来进行代替。如果是其他的数字,那么就用%4d来输出,那样,数字就会正好的在中间。

  1. void Game_ranf() //生成一个随机数。
  2. {
  3. int x,y,t;
  4. do{
  5. x=rand()%4;
  6. y=rand()%4;
  7. }while(array[x][y]); //只有在等于0的空格上随机出现。
  8. t=rand()%10;
  9. if(t==4) //设置概率,当t随机出来为4的时候,赋值给array[x][y]
  10. array[x][y]=4;
  11. else //否则就是将2赋值给数组空白地方
  12. array[x][y]=2;
  13. }

2.当知道如何打印格子之后,我们就要开始我们的第一步,根据2048的游戏规则,我么在最开始的时候,我们需要先生成两个随机数,那么我们应该如何来生成着两个随机数呢。

我们可以采用rand(),函数来进行我们的随机数输出,因为是随机生成2或者4,并且我们的2生成的概率要大于四。我们先定义一个xy,来进行位置的输出,如果x和y的数组不是零,那么重新进行随机数的赋值。当然我们还需要注意一个,我们的随机数很多,但是我们的随机数应该被四除取余数。

  1. int Game_win()
  2. {
  3. int i,j;
  4. for(i=0;i<4;i++)
  5. {
  6. for(j=0;j<4;j++)
  7. {
  8. if(array[i][j]==2048)
  9. return 1;
  10. if(array[i][j]==0)
  11. return 0;
  12. }
  13. }
  14. return -1;
  15. }

我们还需要写一个来判断输赢的函数,进行暴力搜索,如果有2048,那么就返回1,则代表游戏已经赢了,如果是0,那么返回为0,表示游戏继续,当搜索完成之后,任然没有找到2048或者0,那么我们的游戏就输了。返回-1;

  1. void move_left()
  2. {
  3. int i,j,k;
  4. for(i=0;i<4;i++) //从第一行开始,然后一个一个的来进行左移;
  5. {
  6. k=0; //用k来当最左边的那个列元素。
  7. for(j=1;j<4;j++) //从这一行的第二个开始来进行判断。
  8. {
  9. if(array[i][j]!=0) //判断这个地方的元素是不是等于零,如果等于零,直接下一个。
  10. {
  11. if(array[i][k]==0) //如果第一个等于零,把第一个的元素往右边移动。
  12. {
  13. array[i][k]=array[i][j];
  14. array[i][j]=0; //移动之后,原本的那个元素变成了零。
  15. }
  16. else //如果不等于零,那么分为两种情况,一种是两个元素相等,一个是不相等。
  17. if(array[i][k]==array[i][j]) //如果两个元素相等,那么相加,然后到最左边,之后k++
  18. {
  19. array[i][k]=2*array[i][k];
  20. score+=array[i][k];
  21. array[i][j]=0; //原本的那个元素变为了零。
  22. k++;
  23. }
  24. else //如果两个元素不相同,那么就是碰撞。
  25. {
  26. k++; //首先先加跳到下一个
  27. array[i][k]=array[i][j]; //将下一个值赋给k。
  28. if (j!=k) //如果j不等于k的值,那么就是直接将j的那个元素变为0
  29. {
  30. array[i][j]=0;
  31. }
  32. }
  33. }
  34. }
  35. }
  36. }

现在到了我们整个程序最复杂的地方了,我们拿往左边移动来进行举例说明,既然是往左边移动,那么我们就从左边开始我们的循环,设置三个变量,首先用k来当最左边的那个数,在将j赋值1从第二个开始我们的计算查找,如果等于零,那么往后继续走,但是k的值不变,如果碰见不等于的值,那么将k与j的元素互换,相当于j转移到了最左边的地方。如果两个元素相同,将右边的那个置零,左边的元素乘2,那样子,我们等到了合成的式子,如果不是一样的,把右边的放在左边元素的下一位。

  1. void Game_jixu()
  2. {
  3. //为了判断在键盘上按下的哪个键
  4. int ch2 = 0;
  5. while (1)
  6. {
  7. ch2 = _getch();
  8. if (ch2 == 72||ch2=='w')
  9. {
  10. move_up();
  11. break;
  12. }
  13. if (ch2 == 80||ch2=='s')
  14. {
  15. move_down();
  16. break;
  17. }
  18. if (ch2 == 75||ch2=='a')
  19. {
  20. move_left();
  21. break;
  22. }
  23. if (ch2 == 77||ch2=='d')
  24. {
  25. move_right();
  26. break;
  27. }
  28. }
  29. }

这一段代码游戏继续的代码,从键盘中获取按键,最好使用<conio.h>文件里面的getch()来进行判断,因为整个是获取后直接执行,更加适合我们这个游戏的设定。

  1. int Game()
  2. {
  3. int t;
  4. srand((unsigned int)time(NULL));
  5. suijishu();
  6. suijishu();
  7. dayin();
  8. Game_jixu();
  9. while(1)
  10. {
  11. t=shuying();
  12. if(t==1)
  13. {
  14. printf("恭喜你,赢得了比赛!\n");
  15. return;
  16. }
  17. if(t==-1)
  18. {
  19. printf("很遗憾,你已经没有可移动的方块,你输了\n");
  20. return;
  21. }
  22. else
  23. {
  24. Game_jixu();
  25. system("cls");
  26. suijishu();
  27. dayin();
  28. }
  29. }
  30. }

剩下的就是游戏的本体了,没有很多需要讲解的,不过我们最好加一个<windows.h>文件下的system("cls");来进行每一次执行之后的清屏,使得玩起来更加舒适。

最后把整个代码放在下面,供参考,如果有写的不好的地方,希望各位大佬指出来,共同学习。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<time.h>
  4. #include<windows.h>
  5. #include<conio.h>
  6. #define high 4
  7. #define wide 4
  8. int score=0;
  9. int array[4][4]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  10. void suijishu() //生成一个随机数。
  11. {
  12. int x,y,t;
  13. do{
  14. x=rand()%4;
  15. y=rand()%4;
  16. }while(array[x][y]); //只有在等于0的空格上随机出现。
  17. t=rand()%10;
  18. if(t==4) //设置概率,当t随机出来为4的时候,赋值给array[x][y]
  19. array[x][y]=4;
  20. else //否则就是将2赋值给数组空白地方
  21. array[x][y]=2;
  22. }
  23. void dayin()
  24. {
  25. int i,k,j;
  26. printf("SCORE = %d\n", score);
  27. for (i=0;i<high;i++) //从第一行开始打印,由上往下。
  28. {
  29. for (k=0;k<4;k++) //画出每一行的格子分割线。
  30. {
  31. printf(" ");
  32. for(j=0;j<4;j++)
  33. {
  34. printf("-");
  35. }
  36. }
  37. printf("\n");
  38. for (k=0;k<4;k++)
  39. {
  40. printf("|");
  41. if (array[i][k]!=0) //如果这个不为0则将这个数打出来
  42. {
  43. printf("%4d", array[i][k]);
  44. }
  45. else //如果这个数是0的话,则打印空格。
  46. {
  47. for (j=0; j<4;j++)
  48. {
  49. printf(" ");
  50. }
  51. }
  52. }
  53. printf("|\n");
  54. if (i==high-1) //当i位于最后一行的时候,不需要用分割线来进行分割。
  55. {
  56. for (k=0; k<4; k++)
  57. {
  58. printf(" ");
  59. for (j=0; j<4; j++)
  60. {
  61. printf("-"); //打出最下面的底线。
  62. }
  63. }
  64. printf("\n");
  65. }
  66. }
  67. printf("使用上下左右或者wasd来进行游戏操作\n"); //提示本游戏的键位设置,应该如何玩这个游戏。
  68. }
  69. int shuying()
  70. {
  71. int i,j;
  72. for(i=0;i<4;i++)
  73. {
  74. for(j=0;j<4;j++)
  75. {
  76. if(array[i][j]==2048)
  77. return 1;
  78. if(array[i][j]==0)
  79. return 0;
  80. }
  81. }
  82. return -1;
  83. }
  84. void move_left()
  85. {
  86. int i,j,k;
  87. for(i=0;i<4;i++) //从第一行开始,然后一个一个的来进行左移;
  88. {
  89. k=0; //用k来当最左边的那个列元素。
  90. for(j=1;j<4;j++) //从这一行的第二个开始来进行判断。
  91. {
  92. if(array[i][j]!=0) //判断这个地方的元素是不是等于零,如果等于零,直接下一个。
  93. {
  94. if(array[i][k]==0) //如果第一个等于零,把第一个的元素往右边移动。
  95. {
  96. array[i][k]=array[i][j];
  97. array[i][j]=0; //移动之后,原本的那个元素变成了零。
  98. }
  99. else //如果不等于零,那么分为两种情况,一种是两个元素相等,一个是不相等。
  100. if(array[i][k]==array[i][j]) //如果两个元素相等,那么相加,然后到最左边,之后k++
  101. {
  102. array[i][k]=2*array[i][k];
  103. score+=array[i][k];
  104. array[i][j]=0; //原本的那个元素变为了零。
  105. k++;
  106. }
  107. else //如果两个元素不相同,那么就是碰撞。
  108. {
  109. k++; //首先先加跳到下一个
  110. array[i][k]=array[i][j]; //将下一个值赋给k。
  111. if (j!=k) //如果j不等于k的值,那么就是直接将j的那个元素变为0
  112. {
  113. array[i][j]=0;
  114. }
  115. }
  116. }
  117. }
  118. }
  119. }
  120. void move_right()
  121. {
  122. int i,j,k;
  123. for (i=0;i<4;i++)
  124. {
  125. k=3;
  126. for(j=2;j>=0;j--)
  127. {
  128. if(array[i][j]!=0)
  129. {
  130. if (array[i][k]==0)
  131. {
  132. array[i][k]=array[i][j];
  133. array[i][j]=0;
  134. }
  135. else
  136. if(array[i][k] == array[i][j])
  137. {
  138. array[i][k]*=2;
  139. score+=array[i][k];
  140. array[i][j]=0;
  141. k--;
  142. }
  143. else
  144. {
  145. k--;
  146. array[i][k] = array[i][j];
  147. if (j != k)
  148. {
  149. array[i][j] = 0;
  150. }
  151. }
  152. }
  153. }
  154. }
  155. }
  156. void move_up()
  157. {
  158. int i,j,k;
  159. for (j = 0; j < 4; j++)
  160. {
  161. k=0;
  162. for (i=1;i<4;i++)
  163. {
  164. if(array[i][j]>0)
  165. {
  166. if (array[k][j] == array[i][j])
  167. {
  168. array[k][j]*=2;
  169. score+=array[k][j];
  170. array[i][j]=0;
  171. k++;
  172. }
  173. else
  174. if(array[k][j]==0)
  175. {
  176. array[k][j]=array[i][j];
  177. array[i][j]=0;
  178. }
  179. else
  180. {
  181. k++;
  182. array[k][j]=array[i][j];
  183. if(i!=k)
  184. {
  185. array[i][j]=0;
  186. }
  187. }
  188. }
  189. }
  190. }
  191. }
  192. void move_down()
  193. {
  194. int i,j,k;
  195. for(j=0;j<4;j++)
  196. {
  197. k=3;
  198. for(i=2;i>=0;i--)
  199. {
  200. if(array[i][j]>0)
  201. {
  202. if(array[k][j]==array[i][j])
  203. {
  204. array[k][j]*=2;
  205. score+=array[k][j];
  206. array[i][j]=0;
  207. k--;
  208. }
  209. else
  210. if(array[k][j]==0)
  211. {
  212. array[k][j]=array[i][j];
  213. array[i][j]=0;
  214. }
  215. else
  216. {
  217. k--;
  218. array[k][j]=array[i][j];
  219. if (i!=k)
  220. {
  221. array[i][j]=0;
  222. }
  223. }
  224. }
  225. }
  226. }
  227. }
  228. void Game_jixu()
  229. {
  230. //为了判断在键盘上按下的哪个键
  231. int ch2 = 0;
  232. while (1)
  233. {
  234. ch2 = _getch();
  235. if (ch2 == 72||ch2=='w')
  236. {
  237. move_up();
  238. break;
  239. }
  240. if (ch2 == 80||ch2=='s')
  241. {
  242. move_down();
  243. break;
  244. }
  245. if (ch2 == 75||ch2=='a')
  246. {
  247. move_left();
  248. break;
  249. }
  250. if (ch2 == 77||ch2=='d')
  251. {
  252. move_right();
  253. break;
  254. }
  255. }
  256. }
  257. int Game()
  258. {
  259. int t;
  260. srand((unsigned int)time(NULL));
  261. suijishu();
  262. suijishu();
  263. dayin();
  264. Game_jixu();
  265. while(1)
  266. {
  267. t=shuying();
  268. if(t==1)
  269. {
  270. printf("恭喜你,赢得了比赛!\n");
  271. return;
  272. }
  273. if(t==-1)
  274. {
  275. printf("很遗憾,你已经没有可移动的方块,你输了\n");
  276. return;
  277. }
  278. else
  279. {
  280. Game_jixu();
  281. system("cls");
  282. suijishu();
  283. dayin();
  284. }
  285. }
  286. }
  287. int main()
  288. {
  289. Game();
  290. system("pause");
  291. return 0;
  292. }

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

闽ICP备14008679号