歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

熱門游戲 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. }

Copyright © Linux教程網 All Rights Reserved