C语言实现2048游戏(ege图形库版)
更新时间:2020年4月25日 17:27 点击:1396
这几天看到我们班上一个大神写了一个2048出来,我自己也想尝试一下,经过几天自己尝试努力下,自己终于写出来了。现在和大家分享一下,也希望能得到大神的指点。
实现的效果如图
先来讲一下我的思路吧
1.首先肯定是要一个4X4的二维数组来存放数字存放0、2、4……
2.游戏开始与过程中需要随机出现2或者4,所以需要调用time.h这个库
3.游戏开始时,假如当获取字符为‘w'则先用循环判定这个数字的下方有无和它相等的数字。如无则跳过,如有相加。然后在判定是否可以向上移动
下面是我的代码
(我本来是还要写一个撤回的函数 可惜写出来却不能运行。求大神指教)
#include<stdio.h> //#include<conio.h> #include<graphics.h> #include<Windows.h> #include<time.h> int _back[4][4] = {}; void draw();//绘图 void play(); void init();//初始化数字 void _up();//向上移动 void _down();//向下移动 void _left();//像左移动 void _right();//向右移动 void add_number();//增加一个数字 int a[4][4] = { 0 }; int emtpy; //空格的数量 void draw() { int i, j; for (i = 0; i < 4; i++) { for (j = 0; j < 4; j++) { _back[i][j] = a[i][j]; PIMAGE img; img = newimage(); switch (a[i][j]) { case 0: { getimage(img, "2048\\0.png"); putimage(j * 180, i * 180, img); break; } case 2: { getimage(img, "2048\\2.png"); putimage(j * 180, i * 180, img); break; } case 4: { getimage(img, "2048\\4.png"); putimage(j * 180, i * 180, img); break; } case 8: { getimage(img, "2048\\8.png"); putimage(j * 180, i * 180, img); break; } case 16: { getimage(img, "2048\\16.png"); putimage(j * 180, i * 180, img); break; } case 32: { getimage(img, "2048\\32.png"); putimage(j * 180, i * 180, img); break; } case 64: { getimage(img, "2048\\64.png"); putimage(j * 180, i * 180, img); break; } case 128: { getimage(img, "2048\\128.png"); putimage(j * 180, i * 180, img); break; } case 256: { getimage(img, "2048\\256.png"); putimage(j * 180, i * 180, img); break; } case 512: { getimage(img, "2048\\512.png"); putimage(j * 180, i * 180, img); break; } case 1024: { getimage(img, "2048\\1024.png"); putimage(j * 180, i * 180, img); break; } case 2048: { getimage(img, "2048\\2048.png"); putimage(j * 180, i * 180, img); break; } } } } } void init() { int x, y; srand(time(0)); x = rand() % 4; y = rand() % 4; a[x][y] = 2; emtpy = 15; } void _up() { int x, y, i; for (y = 0; y < 4; ++y) { // 从上向下合并相同的方块 for (x = 0; x < 4; ++x) { if (a[x][y] == 0) ; else { for (i = x + 1; i < 4; ++i) { if (a[i][y] == 0) ; else if (a[x][y] == a[i][y]) { a[x][y] += a[i][y]; a[i][y] = 0; ++emtpy; x = i; break; } else { break; } } } } } for (y = 0; y < 4; ++y) // 向上移动箱子 for (x = 0; x < 4; ++x) { if (a[x][y] == 0) ; else { for (i = x; (i > 0) && (a[i - 1][y] == 0); --i) { a[i - 1][y] = a[i][y]; a[i][y] = 0; } } } } void _down() { int x, y, i; for (y = 0; y < 4; ++y) // 向下合并相同的方格 for (x = 3; x >= 0; --x) { if (a[x][y] == 0) ; else { for (i = x - 1; i >= 0; --i) { if (a[i][y] == 0) ; else if (a[x][y] == a[i][y]) { a[x][y] += a[i][y]; a[i][y] = 0; ++emtpy; x = i; break; } else break; } } } for (y = 0; y < 4; ++y) // 向下移动方格 for (x = 3; x >= 0; --x) { if (a[x][y] == 0) ; else { for (i = x; (i < 3) && (a[i + 1][y] == 0); ++i) { a[i + 1][y] = a[i][y]; a[i][y] = 0; } } } } void _left() { int x, y, i; for (x = 0; x < 4; ++x) // 向左合并相同的方格 for (y = 0; y < 4; ++y) { if (a[x][y] == 0) ; else { for (i = y + 1; i < 4; ++i) { if (a[x][i] == 0) ; else if (a[x][y] == a[x][i]) { a[x][y] += a[x][i]; a[x][i] = 0; emtpy++; y = i; break; } else break; } } } for (x = 0; x < 4; ++x) // 向左移动方格 for (y = 0; y < 4; ++y) { if (a[x][y] == 0) ; else { for (i = y; (i > 0) && (a[x][i - 1] == 0); --i) { a[x][i - 1] = a[x][i]; a[x][i] = 0; } } } } void _right() { int x, y, i; for (x = 0; x < 4; ++x) // 向右合并相同的方格 for (y = 3; y >= 0; --y) { if (a[x][y] == 0) ; else { for (i = y - 1; i >= 0; --i) { if (a[x][i] == 0) ; else if (a[x][y] == a[x][i]) { a[x][y] += a[x][i]; a[x][i] = 0; ++emtpy; y = i; break; } else break; } } } for (x = 0; x < 4; ++x) // 向右移动方格 for (y = 3; y >= 0; --y) { if (a[x][y] == 0) ; else { for (i = y; (i < 3) && (a[x][i + 1] == 0); ++i) { a[x][i + 1] = a[x][i]; a[x][i] = 0; } } } } void add_number() { srand(time(0)); if (emtpy > 0) { int x, y, temp; do { x = rand() % 4; y = rand() % 4; } while (a[x][y] != 0); temp = rand(); int i = temp % 2; if (i == 1) { a[x][y] = 2; emtpy--; } else { a[x][y] = 4; emtpy--; } } } void play() { char c = getch(); switch (c) { case 'w': case'W': { _up(); add_number(); draw(); break; } case 's': case'S': { _down(); add_number(); draw(); break; } case 'a': case'A': { _left(); add_number(); draw(); break; }case 'd': case'D': { _right(); add_number(); draw(); break; } case 'q': case 'Q': { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { a[i][j] = _back[i][j]; draw(); } } } } } int main() { init(); int i, j; initgraph(724, 724);//初始化 PIMAGE img; img = newimage(); getimage(img, "2048/背景.jpg"); putimage(0, 0, img); draw(); for (; is_run(); delay_fps(30)) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { _back[i][j] = a[i][j]; } } play(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
- 本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
- 这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
- free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
- 这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
详解C语言中的rename()函数和remove()函数的使用方法
这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25- 这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
- 本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18
- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
- 今天小编就为大家分享一篇C语言实现从文件读入一个3*3数组,并计算每行的平均值,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了使用C语言操作文件的基本函数整理,包括创建和打开以及关闭文件的操作方法,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中memcpy 函数的用法详解的相关资料,需要的朋友可以参考下...2020-04-25
- 这篇文章主要介绍了C语言中查找字符在字符串中出现的位置的方法,分别是strchr()函数和strrchr()函数的使用,需要的朋友可以参考下...2020-04-25
- 很多同学在学习c语言的时候是不是会碰到a++和++a都有甚么作用啊。今天我们就来探讨下...2020-04-25
- 这篇文章主要对C语言中const关键字的用法进行了详细的分析介绍,需要的朋友可以参考下...2020-04-25
- 下面小编就为大家带来一篇C语言实现时间戳转日期的算法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-04-25
- 这篇文章主要介绍了python基于tkinter制作图形界面的2048游戏的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-04-06
- 这篇文章主要介绍了C语言之整数划分问题(递归法)实例代码的相关资料,需要的朋友可以参考下...2020-04-25
- 本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。...2020-04-25
C语言正则表达式详解 regcomp() regexec() regfree()用法详解
C语言处理正则表达式常用的函数有regcomp()、regexec()、regfree()和regerror(),这里就为大家介绍一下,需要的朋友可以参考一下啊...2020-04-25