歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 熱門游戲 2048 C++ 源代碼分享

熱門游戲 2048 C++ 源代碼分享

日期:2017/3/1 9:42:55   编辑:Linux編程

這游戲前一段時間傳的很火,前幾天早上上課實在太無聊了,就決定把這游戲自己也寫一個。

前後寫了一個多小時吧,大概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. {
  15. cout<<setw(46)<<"X2048 by Reason"<<endl;
  16. cout<<setw(50)<<" |-----------------------|"<<endl;
  17. for(int i=0;i<=3;i++)
  18. {
  19. cout<<setw(24)<<"";
  20. for(int j=0;j<=3;j++)
  21. {
  22. //SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED);
  23. cout<<setw(2)<<"|"<<setw(4)<<pane[i][j];
  24. if(j==3)
  25. {
  26. cout<<setw(2)<<"|"<<endl;
  27. cout<<setw(50)<<" |-----------------------|"<<endl;
  28. }
  29. }
  30. }
  31. }
  32. void newgame() //開始游戲
  33. {
  34. N=1;
  35. for(int i=0;i<=3;i++) //初始化棋盤
  36. for(int j=0;j<=3;j++)
  37. pane[i][j]=0;
  38. srand( (unsigned)time( NULL ) );
  39. int m=rand()%4;
  40. int n=rand()%4;
  41. int p=rand()%4;
  42. int q=rand()%4;
  43. pane[m][n]=pane[p][q]=2;
  44. showpane();
  45. }
  46. int if2n(int x) //判斷x是否是2的n次方
  47. {
  48. int flag=0;
  49. for(int n=1;n<=11;n++)
  50. {
  51. if(x==pow(2,n))
  52. {
  53. flag=1;
  54. if(n>N)
  55. N=n;
  56. return flag;
  57. }
  58. }
  59. return flag;
  60. }
  61. int upmove() //上移
  62. {
  63. int flag=0;
  64. for(int j=0;j<=3;j++)
  65. for(int i=0;i<3;i++)
  66. {
  67. if(if2n(pane[i][j]+pane[i+1][j])==1)
  68. {
  69. pane[i][j]=pane[i][j]+pane[i+1][j];
  70. pane[i+1][j]=0;
  71. flag=1;
  72. }
  73. }
  74. return flag;
  75. }
  76. int downmove() //下移
  77. {
  78. int flag=0;
  79. for(int j=0;j<=3;j++)
  80. for(int i=3;i>0;i--)
  81. {
  82. if(if2n(pane[i][j]+pane[i-1][j])==1)
  83. {
  84. pane[i][j]=pane[i][j]+pane[i-1][j];
  85. pane[i-1][j]=0;
  86. flag=1;
  87. }
  88. }
  89. return flag;
  90. }
  91. int leftmove() //左移
  92. {
  93. int flag=0;
  94. for(int i=0;i<=3;i++)
  95. for(int j=0;j<3;j++)
  96. {
  97. if(if2n(pane[i][j]+pane[i][j+1])==1)
  98. {
  99. pane[i][j]=pane[i][j]+pane[i][j+1];
  100. pane[i][j+1]=0;
  101. flag=1;
  102. }
  103. }
  104. return flag;
  105. }
  106. int rightmove() //右移
  107. {
  108. int flag=0;
  109. for(int i=0;i<=3;i++)
  110. for(int j=3;j>0;j--)
  111. {
  112. if(if2n(pane[i][j]+pane[i][j-1])==1)
  113. {
  114. pane[i][j]=pane[i][j]+pane[i][j-1];
  115. pane[i][j-1]=0;
  116. flag=1;
  117. }
  118. }
  119. return flag;
  120. }
  121. int testup() //能否上移測試
  122. {
  123. int flag=0;
  124. for(int j=0;j<=3;j++)
  125. for(int i=0;i<3;i++)
  126. {
  127. if(if2n(pane[i][j]+pane[i+1][j])==1)
  128. {
  129. flag=1;
  130. }
  131. }
  132. return flag;
  133. }
  134. int testdown() //測試能否下移
  135. {
  136. int flag=0;
  137. for(int j=0;j<=3;j++)
  138. for(int i=3;i>0;i--)
  139. {
  140. if(if2n(pane[i][j]+pane[i-1][j])==1)
  141. {
  142. flag=1;
  143. }
  144. }
  145. return flag;
  146. }
  147. int testleft() //測試能否左移
  148. {
  149. int flag=0;
  150. for(int i=0;i<=3;i++)
  151. for(int j=0;j<3;j++)
  152. {
  153. if(if2n(pane[i][j]+pane[i][j+1])==1)
  154. {
  155. flag=1;
  156. }
  157. }
  158. return flag;
  159. }
  160. int testright() //測試能否右移
  161. {
  162. int flag=0;
  163. for(int i=0;i<=3;i++)
  164. for(int j=3;j>0;j--)
  165. {
  166. if(if2n(pane[i][j]+pane[i][j-1])==1)
  167. {
  168. flag=1;
  169. }
  170. }
  171. return flag;
  172. }
  173. int panemax() //棋盤最大數
  174. {
  175. int max=pane[0][0];
  176. for(int i=0;i<=3;i++)
  177. for(int j=0;j<=3;j++)
  178. if(pane[i][j]>max)
  179. max=pane[i][j];
  180. return max;
  181. }
  182. int ifwin() //判斷是否勝利
  183. {
  184. int flag=0;
  185. if(panemax()==2048)
  186. {
  187. cout<<setw(45)<<"You Win!"<<endl;
  188. flag=1;
  189. }
  190. return flag;
  191. }
  192. int ifGameOver() //判斷是否游戲結束
  193. {
  194. int flag=0;
  195. if(testup()+ testdown() + testleft() + testright() ==0)
  196. {
  197. cout<<setw(43)<<"Game Over!"<<endl;
  198. flag=1;
  199. }
  200. return flag;
  201. }
  202. void addnewnumberup() //上移後添加新數
  203. {
  204. srand( (unsigned)time( NULL ) );
  205. int n;
  206. if(N==1)
  207. n=1;
  208. else
  209. n=(rand()%(N)+1);
  210. int newnumber=pow(2,n);
  211. for(int i=3;i>=0;i--)
  212. for(int j=0;j<=3;j++)
  213. if(pane[i][j]==0)
  214. {
  215. pane[i][j]=newnumber;
  216. return;
  217. }
  218. }
  219. void addnewnumberdown() //下移後添加新數
  220. {
  221. srand( (unsigned)time( NULL ) );
  222. int n;
  223. if(N==1)
  224. n=1;
  225. else
  226. n=(rand()%(N)+1); int newnumber=pow(2,n);
  227. for(int i=0;i<=3;i++)
  228. for(int j=0;j<=3;j++)
  229. if(pane[i][j]==0)
  230. {
  231. pane[i][j]=newnumber;
  232. return;
  233. }
  234. }
  235. void addnewnumberleft() //左移後添加新數
  236. {
  237. srand( (unsigned)time( NULL ) );
  238. int n;
  239. if(N==1)
  240. n=1;
  241. else
  242. n=(rand()%(N)+1);
  243. int newnumber=pow(2,n);
  244. for(int j=3;j>=0;j--)
  245. for(int i=0;i<=3;i++)
  246. if(pane[i][j]==0)
  247. {
  248. pane[i][j]=newnumber;
  249. return;
  250. }
  251. }
  252. void addnewnumberright() //右移後添加新數
  253. {
  254. srand( (unsigned)time( NULL ) );
  255. int n;
  256. if(N==1)
  257. n=1;
  258. else
  259. n=(rand()%(N)+1);
  260. int newnumber=pow(2,n);
  261. for(int j=0;j<=3;j++)
  262. for(int i=0;i<=3;i++)
  263. if(pane[i][j]==0)
  264. {
  265. pane[i][j]=newnumber;
  266. return;
  267. }
  268. }
  269. int GetDirection() //讀取方向
  270. {
  271. int ret = 0;
  272. do
  273. {
  274. int ch = _getch();
  275. if(isascii(ch))
  276. continue;
  277. ch = _getch();
  278. switch(ch)
  279. {
  280. case 72:
  281. ret = 2; // top
  282. break;
  283. case 75:
  284. ret = 1; // left
  285. break;
  286. case 77:
  287. ret = 3; // right
  288. break;
  289. case 80:
  290. ret = 4; // down
  291. break;
  292. default:
  293. break;
  294. }
  295. } while (ret == 0);
  296. return ret;
  297. }
  298. void main() //主函數
  299. {
  300. system("color f9");
  301. int makesure=1;
  302. while(makesure)
  303. {
  304. system("cls");
  305. newgame();
  306. while(ifwin()+ifGameOver()==0)
  307. {
  308. int c=GetDirection();
  309. switch(c)
  310. {
  311. case 2:
  312. upmove();
  313. addnewnumberup();
  314. system("cls");
  315. showpane();
  316. break;
  317. case 4:
  318. downmove();
  319. addnewnumberdown();
  320. system("cls");
  321. showpane();
  322. break;
  323. case 1:
  324. leftmove();
  325. addnewnumberleft();
  326. system("cls");
  327. showpane();
  328. break;
  329. case 3:
  330. rightmove();
  331. addnewnumberright();
  332. system("cls");
  333. showpane();
  334. break;
  335. default:
  336. break;
  337. }
  338. }
  339. cout<<setw(43)<<"你的最後成績為:"<<panemax()<<endl;
  340. cout<<setw(60)<<"若要重新開始游戲請輸入1,若要結束請輸入0。"<<endl;
  341. cin>>makesure;
  342. while(makesure!=1&&makesure!=0)
  343. {
  344. cout<<"輸入不正確,請重新輸入!"<<endl;
  345. cin>>makesure;
  346. }
  347. }
  348. cout<<"再見!"<<endl;
  349. system("pause");
  350. }

Copyright © Linux教程網 All Rights Reserved