热门游戏 2048 C++ 源代码分享


这游戏前一段时间传的很火,前几天早上上课实在太无聊了,就决定把这游戏自己也写一个。

前后写了一个多小时吧,大概300行左右,没什么复杂算法,不过实在懒得去优化了,但估计优化完能控制在200行以下,有兴趣的朋友可以自己优化一下。

说明:我一开始玩的是IOS APP版的TRHEES,后来才玩的2048,两者在滑动的规则上有些区别,本人这个版本是这两者的结合。

最后,祝试玩愉快!

界面丑陋,求不笑。

以下是 C++源代码:

  1. /*By Reason*/
  2. #include<iostream>
  3. #include <iomanip>
  4. #include<math.h>
  5. #include<stdlib.h>
  6. #include<time.h>
  7. #include <conio.h> //为了读取方向键
  8. #include<windows.h>
  9. usingnamespace std;   
  10. //srand( (unsigned)time( NULL ) ); //随机数种子 不能用在这里
  11. int pane[4][4]; //棋盘
  12. int N=1; //2的n次方
  13. void showpane() //显示棋盘
  14. cout<<setw(46)<<"X2048 by Reason"<<endl; 
  15. cout<<setw(50)<<" |-----------------------|"<<endl; 
  16. for(int i=0;i<=3;i++) 
  17. cout<<setw(24)<<""
  18. for(int j=0;j<=3;j++) 
  19. //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED); 
  20. cout<<setw(2)<<"|"<<setw(4)<<pane[i][j]; 
  21.  
  22. if(j==3) 
  23. cout<<setw(2)<<"|"<<endl; 
  24. cout<<setw(50)<<" |-----------------------|"<<endl; 
  25. void newgame() //开始游戏
  26. N=1; 
  27. for(int i=0;i<=3;i++) //初始化棋盘
  28. for(int j=0;j<=3;j++) 
  29. pane[i][j]=0; 
  30. srand( (unsigned)time( NULL ) ); 
  31. int m=rand()%4; 
  32. int n=rand()%4; 
  33. int p=rand()%4; 
  34. int q=rand()%4; 
  35. pane[m][n]=pane[p][q]=2; 
  36. showpane(); 
  37. int if2n(int x) //判断x是否是2的n次方
  38. int flag=0; 
  39. for(int n=1;n<=11;n++) 
  40. if(x==pow(2,n)) 
  41. flag=1; 
  42. if(n>N) 
  43. N=n; 
  44. return flag; 
  45. return flag; 
  46. int upmove() //上移
  47. int flag=0; 
  48. for(int j=0;j<=3;j++) 
  49. for(int i=0;i<3;i++) 
  50. if(if2n(pane[i][j]+pane[i+1][j])==1) 
  51. pane[i][j]=pane[i][j]+pane[i+1][j]; 
  52. pane[i+1][j]=0; 
  53. flag=1; 
  54. return flag; 
  55. int downmove() //下移
  56. int flag=0; 
  57. for(int j=0;j<=3;j++) 
  58. for(int i=3;i>0;i--) 
  59. if(if2n(pane[i][j]+pane[i-1][j])==1) 
  60. pane[i][j]=pane[i][j]+pane[i-1][j]; 
  61. pane[i-1][j]=0; 
  62. flag=1; 
  63. return flag; 
  64. int leftmove() //左移
  65. int flag=0; 
  66. for(int i=0;i<=3;i++) 
  67. for(int j=0;j<3;j++) 
  68. if(if2n(pane[i][j]+pane[i][j+1])==1) 
  69. pane[i][j]=pane[i][j]+pane[i][j+1]; 
  70. pane[i][j+1]=0; 
  71. flag=1; 
  72. return flag; 
  73. int rightmove() //右移
  74. int flag=0; 
  75. for(int i=0;i<=3;i++) 
  76. for(int j=3;j>0;j--) 
  77. if(if2n(pane[i][j]+pane[i][j-1])==1) 
  78. pane[i][j]=pane[i][j]+pane[i][j-1]; 
  79. pane[i][j-1]=0; 
  80. flag=1; 
  81. return flag; 
  82. int testup() //能否上移测试
  83. int flag=0; 
  84. for(int j=0;j<=3;j++) 
  85. for(int i=0;i<3;i++) 
  86. if(if2n(pane[i][j]+pane[i+1][j])==1) 
  87. flag=1; 
  88. return flag; 
  89. int testdown() //测试能否下移
  90. int flag=0; 
  91. for(int j=0;j<=3;j++) 
  92. for(int i=3;i>0;i--) 
  93. if(if2n(pane[i][j]+pane[i-1][j])==1) 
  94. flag=1; 
  95. return flag; 
  96. int testleft() //测试能否左移
  97. int flag=0; 
  98. for(int i=0;i<=3;i++) 
  99. for(int j=0;j<3;j++) 
  100. if(if2n(pane[i][j]+pane[i][j+1])==1) 
  101. flag=1; 
  102. return flag; 
  103. int testright() //测试能否右移
  104. int flag=0; 
  105. for(int i=0;i<=3;i++) 
  106. for(int j=3;j>0;j--) 
  107. if(if2n(pane[i][j]+pane[i][j-1])==1) 
  108. flag=1; 
  109. return flag; 
  110. int panemax() //棋盘最大数
  111. int max=pane[0][0]; 
  112. for(int i=0;i<=3;i++) 
  113. for(int j=0;j<=3;j++) 
  114. if(pane[i][j]>max) 
  115. max=pane[i][j]; 
  116. return max; 
  117. int ifwin() //判断是否胜利
  118. int flag=0; 
  119. if(panemax()==2048) 
  120. cout<<setw(45)<<"You Win!"<<endl; 
  121. flag=1; 
  122. return flag; 
  123. int ifGameOver() //判断是否游戏结束
  124. int flag=0; 
  125. if(testup()+ testdown() + testleft() + testright() ==0) 
  126. cout<<setw(43)<<"Game Over!"<<endl; 
  127. flag=1; 
  128. return flag; 
  129. void addnewnumberup() //上移后添加新数
  130. srand( (unsigned)time( NULL ) ); 
  131. int n; 
  132. if(N==1) 
  133. n=1; 
  134. else
  135. n=(rand()%(N)+1); 
  136. int newnumber=pow(2,n); 
  137. for(int i=3;i>=0;i--) 
  138. for(int j=0;j<=3;j++) 
  139. if(pane[i][j]==0) 
  140. pane[i][j]=newnumber; 
  141. return
  142. void addnewnumberdown() //下移后添加新数
  143. srand( (unsigned)time( NULL ) ); 
  144. int n; 
  145. if(N==1) 
  146. n=1; 
  147. else
  148. n=(rand()%(N)+1); int newnumber=pow(2,n); 
  149. for(int i=0;i<=3;i++) 
  150. for(int j=0;j<=3;j++) 
  151. if(pane[i][j]==0) 
  152. pane[i][j]=newnumber; 
  153. return
  154. void addnewnumberleft() //左移后添加新数
  155. srand( (unsigned)time( NULL ) ); 
  156. int n; 
  157. if(N==1) 
  158. n=1; 
  159. else
  160. n=(rand()%(N)+1); 
  161. int newnumber=pow(2,n); 
  162. for(int j=3;j>=0;j--) 
  163. for(int i=0;i<=3;i++) 
  164. if(pane[i][j]==0) 
  165. pane[i][j]=newnumber; 
  166. return
  167. void addnewnumberright() //右移后添加新数
  168. srand( (unsigned)time( NULL ) ); 
  169. int n; 
  170. if(N==1) 
  171. n=1; 
  172. else
  173. n=(rand()%(N)+1); 
  174. int newnumber=pow(2,n); 
  175. for(int j=0;j<=3;j++) 
  176. for(int i=0;i<=3;i++) 
  177. if(pane[i][j]==0) 
  178. pane[i][j]=newnumber; 
  179. return
  180. int GetDirection() //读取方向
  181.     int ret = 0; 
  182.  
  183.     do 
  184.     { 
  185.         int ch = _getch(); 
  186.         if(isascii(ch)) 
  187.             continue
  188.  
  189.         ch = _getch(); 
  190.         switch(ch) 
  191.         { 
  192.         case 72:   
  193.             ret = 2; // top
  194.             break
  195.         case 75:   
  196.             ret = 1; // left 
  197.             break
  198.         case 77:   
  199.             ret = 3; // right
  200.             break
  201.         case 80:   
  202.             ret = 4; // down
  203.             break
  204.         default:   
  205.             break
  206.         } 
  207.     } while (ret == 0); 
  208.      
  209.     return ret; 
  210. void main() //主函数
  211. system("color f9"); 
  212. int makesure=1; 
  213. while(makesure) 
  214. system("cls"); 
  215. newgame(); 
  216. while(ifwin()+ifGameOver()==0) 
  217. int c=GetDirection(); 
  218. switch(c) 
  219. case 2: 
  220. upmove(); 
  221. addnewnumberup(); 
  222. system("cls"); 
  223. showpane(); 
  224. break
  225. case 4: 
  226. downmove(); 
  227. addnewnumberdown(); 
  228. system("cls"); 
  229. showpane(); 
  230. break
  231. case 1: 
  232. leftmove(); 
  233. addnewnumberleft(); 
  234. system("cls"); 
  235. showpane(); 
  236. break
  237. case 3: 
  238. rightmove(); 
  239. addnewnumberright(); 
  240. system("cls"); 
  241. showpane(); 
  242. break
  243. default:   
  244. break
  245. cout<<setw(43)<<"你的最后成绩为:"<<panemax()<<endl; 
  246. cout<<setw(60)<<"若要重新开始游戏请输入1,若要结束请输入0。"<<endl; 
  247. cin>>makesure; 
  248. while(makesure!=1&&makesure!=0) 
  249. cout<<"输入不正确,请重新输入!"<<endl; 
  250. cin>>makesure; 
  251. cout<<"再见!"<<endl; 
  252. system("pause"); 
  253.  
  254. }

本文永久更新链接地址:

相关内容

    暂无相关文章