代码如下:

  1 #define _CRT_SECURE_NO_WARNINGS//去掉编译器内部扩增问题
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<math.h>
  5 #include<graphics.h>//需要下载图形库
  6 #include<conio.h>
  7 #include<time.h>
  8 #include<string>
  9 #include<fstream>
 10 #include<iostream>
 11 #include<sstream>
 12 using namespace std;
 13
 14 namespace
 15 {
 16 IMAGE image[12];
 17 int imageIndex[12];
 18 int map[4][4] = { 2 };
 19 bool isOver = true;
 20 bool gameOver = false;
 21 enum direction
 22 {
 23 Up, Down, Left, Right
 24 };
 25 };
 26
 27 void SetImageIndex();//设置图片编号
 28 void loadResource();
 29 void drawMap();
 30 void randIntNum();
 31 void keyDownAndDraw();
 32 bool TurnLeft(int s[4][4]);
 33 void ChangeOnKeyDown(direction Direction);
 34
 35
 36
 37 int main()
 38 {
 39 SetImageIndex();
 40 loadResource();
 41 initgraph(60*4,60*4+120);//游戏界面大小
 42 drawMap();
 43 keyDownAndDraw();
 44 system("pause");//防止闪屏
 45 //closegraph();
 46 //system("pause");
 47 return 0;
 48 }
 49 void SetImageIndex()
 50 {
 51 imageIndex[0] = 0;
 52 for (int i = 1; i < 12; i++)
 53 {
 54 imageIndex[i] = int(pow(2, i));
 55 }
 56 }
 57 void loadResource()//加载图片
 58 {
 59 for (int i = 0; i < 12; i++)
 60 {
 61 char fileName[20] = "";
 62 sprintf(fileName, "%d.bmp", imageIndex[i]);//拼接
 63 loadimage(image + i, fileName,60,60);
 64 }
 65 }
 66
 67 //画地图
 68 void drawMap()
 69 {
 70 string out;
 71 int HistryHighlyScore = 0;
 72 ifstream IScore("Score.txt");//创建文件读取历史最高分
 73 if (!IScore)
 74 {
 75 ofstream OScore("Score.txt");
 76 IScore.open("Score.txt");
 77 }
 78 getline(IScore, out);
 79 char Score[10];
 80 char HighlyScore[100];
 81 int Sum=0;
 82 setbkcolor(RGB(244, 215, 215));
 83 cleardevice();
 84 settextcolor(WHITE);//设置文字颜色
 85 settextstyle(35, 0, "楷体");//设置文字格式
 86 outtextxy(50, 10, "2048游戏");
 87 settextcolor(YELLOW);//设置文字颜色
 88 settextstyle(25, 0, "楷体");//设置文字格式
 89 for (int i = 0; i < 4; i++)//计算分数
 90 {
 91 for (int j = 0; j < 4; j++)
 92 {
 93 if (map[i][j]>4)
 94 {
 95 Sum += map[i][j] * sqrt(map[i][j]);
 96 }
 97 }
 98 }
 99 sprintf(Score, "分数:%d", Sum);
100 outtextxy(10, 300,Score);
101 for (int i = 0; i < out.length(); i++)
102 {
103 HighlyScore[i] = out[i];
104 }
105 stringstream mid;
106 mid << out;
107 mid >> HistryHighlyScore;
108 if (HistryHighlyScore>Sum)
109 {
110 HighlyScore[out.length()] = '\0';
111 settextcolor(RED);//设置文字颜色
112 settextstyle(25, 0, "楷体");//设置文字格式
113 outtextxy(10, 330, "历史最高:");
114 outtextxy(130, 330, HighlyScore);
115 }
116 else
117 {
118 char Score1[20];
119 settextcolor(RED);//设置文字颜色
120 settextstyle(25, 0, "楷体");//设置文字格式
121 sprintf(Score1, "历史最高:%d", Sum);
122 outtextxy(10, 330,Score1);
123 ofstream OScore1;
124 OScore1.open("Score.txt");
125 OScore1<<Sum;
126 OScore1.close();
127 }
128 IScore.close();
129 //根据二维数组去画图
130 int x, y, k;
131 for (int i = 0; i < 4; i++)
132 {
133 for (int j = 0; j < 4; j++)
134 {
135 x = 60 * j;
136 y = 60 * i + 55;
137 for ( k = 0; k < 12; k++)
138 {
139 if (imageIndex[k] == map[i][j])
140 {
141 break;
142 }
143 }
144 putimage(x,y,image+k);
145 }
146 }
147 isOver = true;
148 }
149
150 //随机产生2或者4;
151 void randIntNum()
152 {
153 bool haszero = false;
154 bool isOk=false;
155 srand((unsigned)time(NULL)); //随机函数种子
156 for (int i = 0; i < 4; i++)
157 {
158 for (int j = 0; j < 4; j++)
159 {
160 if (map[i][j] == 0)
161 {
162 haszero = true;
163 map[i][j] = (rand() % 3) * 2;
164 if (map[i][j] == 0)
165 {
166 continue;
167 }
168 isOk = true;
169 break;
170 }
171 }
172 if (isOk)
173 {
174 break;
175 }
176 }
177 if (!isOk)
178 {
179 isOk = false;
180 if (haszero)
181 {
182 for (int i = 0; i < 4; i++)
183 {
184 for (int j = 0; j < 4; j++)
185 {
186 if (map[i][j] == 0)
187 {
188 map[i][j] = 2;
189 isOk = true;
190 break;
191 }
192 }
193 if (isOk)
194 {
195 break;
196 }
197 }
198 }
199 }
200 for (int i = 0; i < 4; i++)//检测最后一步是否留有空位,若全满游戏结束
201 {
202 for (int j = 0; j < 4; j++)
203 {
204 if (map[i][j] == 0)
205 {
206 drawMap();
207 return;
208 }
209 }
210 }
211 for (int i = 0; i < 4; i++)//游戏失败则重置
212 {
213 for (int j = 0; j < 4; j++)
214 {
215 if (i==0&&j==0)
216 {
217 map[i][j] = 2;
218 continue;
219 }
220 map[i][j] = 0;
221 }
222 }
223 drawMap();
224 }
225
226 //按键响应
227 void keyDownAndDraw()
228 {
229 while (true)
230 {
231 char key = _getch();//接收用户按键
232 if (isOver)
233 {
234 isOver = false;
235 switch (key)
236 {
237 case 'W':
238 case'w':
239 case 72:
240 ChangeOnKeyDown(Up);
241 break;
242 case 'S':
243 case's':
244 case 80:
245 ChangeOnKeyDown(Down);
246 break;
247 case 'a':
248 case'A':
249 case 75:
250 ChangeOnKeyDown(Left);
251 break;
252 case 'D':
253 case'd':
254 case 77:
255 ChangeOnKeyDown(Right);
256 break;
257 default:
258 isOver = true;
259 break;
260 }
261 }
262 }
263 }
264 void ChangeOnKeyDown(direction Direction)
265 {
266 int Map[4][4] = { 0 };
267 bool CanMove;
268 switch (Direction)//将所有方向改为向左方向,并利用向左算法计算各个方向
269 {
270 case Up:
271 for (int i = 0; i < 4; i++)
272 {
273 for (int j = 0; j < 4; j++)
274 {
275 Map[j][i] = map[i][j];
276 }
277 }
278 break;
279 case Down:
280 for (int i = 0; i < 4; i++)
281 {
282 for (int j = 0; j < 4; j++)
283 {
284 Map[j][3-i] = map[i][j];
285 }
286 }
287 break;
288 case Left:
289 for (int i = 0; i < 4; i++)
290 {
291 for (int j = 0; j < 4; j++)
292 {
293 Map[i][j] = map[i][j];
294 }
295 }
296 break;
297 case Right:
298 for (int i = 0; i < 4; i++)
299 {
300 for (int j = 0; j < 4; j++)
301 {
302 Map[i][3-j] = map[i][j];
303 }
304 }
305 break;
306 default:
307 break;
308 }
309 //向左算法
310 CanMove=TurnLeft(Map);
311 //将向左改回各自方向
312 switch (Direction)
313 {
314 case Up:
315 for (int i = 0; i < 4; i++)
316 {
317 for (int j = 0; j < 4; j++)
318 {
319 map[j][i] =Map[i][j];
320 }
321 }
322 break;
323 case Down:
324 for (int i = 0; i < 4; i++)
325 {
326 for (int j = 0; j < 4; j++)
327 {
328 map[3-j][i] = Map[i][j];
329 }
330 }
331 break;
332 case Left:
333 for (int i = 0; i < 4; i++)
334 {
335 for (int j = 0; j < 4; j++)
336 {
337 map[i][j] = Map[i][j];
338 }
339 }
340 break;
341 case Right:
342 for (int i = 0; i < 4; i++)
343 {
344 for (int j = 0; j < 4; j++)
345 {
346 map[i][3-j] = Map[i][j];
347 }
348 }
349 break;
350 default:
351 break;
352 }
353 if (CanMove)
354 {
355 randIntNum();
356 drawMap();
357 }
358 else
359 {
360 isOver = true;
361 }
362 };
363 //算法
364 bool TurnLeft(int Map[4][4])//按向左键进行合并
365 {
366 int k;
367 int len;
368 int Save[4];
369 int Move[4][4];
370 bool CanMove = false;
371
372 for (int i = 0; i < 4; i++)
373 {
374 for (int j = 0; j < 4; j++)
375 {
376 Move[i][j] = Map[i][j];
377 }
378 }
379 for (int i = 0; i < 4; i++)
380 {
381 k = 0;
382 len = 0;
383 for (int j = 0; j < 4; j++)
384 {
385 if (Map[i][j]==0)
386 {
387 continue;
388 }
389 for (k = j+1; k < 4; k++)
390 {
391 if (Map[i][k] != 0 )
392 {
393 if (Map[i][j] == Map[i][k])
394 {
395 Map[i][j] *= 2;
396 Map[i][k] = 0;
397 }
398 break;
399 }
400 }
401 }
402 for (int j = 0; j < 4; j++)
403 {
404 if (Map[i][j]!=0)
405 {
406 Save[len]=Map[i][j];
407 len++;
408 }
409 }
410 for (int j = 0; j < 4; j++)
411 {
412 if (j<len)
413 {
414 Map[i][j] = Save[j];
415 }
416 else
417 {
418 Map[i][j] = 0;
419 }
420 }
421 }
422 for (int i = 0; i < 4; i++)
423 {
424 for (int j = 0; j < 4; j++)
425 {
426 if (Move[i][j] != Map[i][j])
427 {
428 CanMove = true;
429 };
430 }
431 }
432 return CanMove;
433 }

图形库地址:

https://easyx.cn/downloads/

转载于:https://www.cnblogs.com/hixingchen/p/11463268.html

C++实现2048小游戏相关推荐

  1. python游戏代码五子棋_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  2. python秒表游戏代码_用20行Python代码实现2048小游戏,你会吗?

    前些天在b站上看到有个大佬用c写了一个2048小游戏,我便一下来了兴趣.心想着,我貌似也能用Python来整一波,话不多说,直接开搞. 2048的游戏规则: 2048游戏总共有16个格子,初始时会有两 ...

  3. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

  4. python里graphics的使用_使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN ...

  5. html css js实现快递单打印_JS与HTML、CSS实现2048小游戏(六)

    在前面的五篇文章中,小编带大家完成了网页版2048小游戏的基本游戏逻辑.但是在游戏结束的gameover()方法中咱们只是简单的通过alert来弹出一些信息,这样的话只能出现下图的效果.这样的游戏,不 ...

  6. C语言编写2048小游戏

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/104992424 2 ...

  7. 使用JS实现2048小游戏

    JS实现2048小游戏源码 效果图: 代码如下,复制即可使用: (适用浏览器:360.FireFox.Chrome.Opera.傲游.搜狗.世界之窗. 不支持Safari.IE8及以下浏览器.) &l ...

  8. C语言 2048小游戏

    C语言之前写的2048小游戏,全是函数.数组 #include<stdio.h> #include<stdlib.h> #include<time.h> #incl ...

  9. ​.NET手撸2048小游戏

    前言 2048是一款益智小游戏,得益于其规则简单,又和 2的倍数有关,因此广为人知,特别是广受程序员的喜爱. 本文将再次使用我自制的"准游戏引擎" FlysEngine,从空白窗口 ...

  10. Pygame实战:升级后的2048小游戏—解锁新花样 根本停不下来

    导语 "嗨嗨嗨!别睡了,醒醒醒醒!该干活儿了~" by--梦雅! ​ "刚睡醒,大佬你有什么事儿吖?" by--全体成员! 上期给大家分享的超详细--简易版本的 ...

最新文章

  1. 猪八戒网CI/CD最佳实践之路
  2. mysql jdbc 表结构_JavaEE_day09_MySQL多表JDBC
  3. C# ckeditor+ckfinder的图片上传配置
  4. Python 程序员最常犯的十个错误,作为小白的你是不是也经常犯?
  5. 给定一个32位有符号整数,将整数中的数字进行翻转
  6. Linux虚拟机的替代品:Docker与WSL2上手笔记
  7. 第十一届蓝桥杯省赛C++组试题 第3题 求阴影面积
  8. Nmap流量特征修改(NTA、IDS、IPS、流量审计)
  9. 42.angularJS自定义服务
  10. 【论文写作】精品课程教学网站中系统内核设计如何写
  11. C++bitset二进制有序集
  12. IdentityServer4学习及简单使用
  13. mysql数据恢复某一时间点_mysql时间点数据恢复
  14. 渗透测试专业人员使用的11种工具
  15. Sketch颜色替换更改插件 PasteDirect v1.0破解版
  16. 在你的 Android 手机上「云养猫」:Android 11 Beta 3 具透
  17. IDEA插件系列(105):IDEA Mind Map插件——IDEA思维导图
  18. pytest测试框架学习笔记
  19. 【电脑办公软件有哪些】万彩办公大师教程丨PDF分割帮助文档
  20. 解决2019款macbookpro -16寸 外接显示器风扇不停的转,温度特别高

热门文章

  1. 美国项目管理协会宣布从Net Objectives手中收购FLEX
  2. 基于k3s部署KubeSphere
  3. 并发编程--线程同步之 synchronized关键字(一)
  4. TopCoder SRM 574
  5. 屡禁不止:一个敢于将自己注入到杀毒软件中的斗士
  6. 5G RRC信令流程
  7. devDependencies 和 dependencies
  8. reshape(1,-1)与reshape(-1,1)的理解
  9. python import 找不到指定模块_Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法...
  10. go的nil map有什么卵用?