分享好友 最新资讯首页 最新资讯分类 切换频道
C语言实现游戏2048(超详细!!!超易懂!!!)手机h游戏「C语言实现游戏2048(超详细!!!超易懂!!!)」
2025-02-12 23:37

2048是众所周知的一款经典游戏,在曾经没有智能电脑和手机的年代,也陪伴了我们许多年。那今天就让我们用C语言来回顾一下这款游戏吧~

2048游戏的玩法是在初始的时候,给玩家一个4*4格子,其中内容全为空的棋盘。每过一回合,棋盘上就会在随机位置生成一个数字2,而2就是2048游戏中最小的数字。在每一回合中玩家需要输入W,S,A,D移动棋盘中现有的数字(W代表上移,S代表下移,A代表左移,D代表右移)。而在数字的移动过程中,如果有两个数字大小相同,并且在移动过程中发生了碰撞,那么就会将两个数字合成为一个值为两数之和的数字当棋盘中所有格子都被装满时,则游戏结束

以上就是游戏2048的规则啦,那么让我们把这些规则一条条理清顺序,再对各个规则逐一击破吧~

1.打印游戏菜单

首先我们需要创造一个可以选择开始游戏和退出游戏的菜单。打印游戏菜单就没什么过多的要求,符合自己的审美,自己喜欢就好啦~

2.将4*4格内数据初始化

想要在每一个格子中填充数据,需要对每一个格子内的值进行初始化

3.在棋盘随机位置生成一个2

想要游戏正常运行,通过使用生成随机数的rand()函数,使棋盘每一回合生成一个2是不可或缺的条件。

4.打印游戏棋盘

我们需要创造一个能够容纳4*4格子内所有数值,并且又不失美观的棋盘。

5.实现WSAD移动数字功能

我们需要构建一个能够使输入WSAD时使棋盘中的数字进行相应的移动

6.判断游戏是否结束

创造一个判断游戏结束的函数。

实现游戏2048,需要分成头文件game.h源文件game.c源文件test.c三个文件。

他们的作用分别是

  • game.h:作为头文件,它用来存放创造游戏所需要的各种类型的全局变量,并且也用来实现编写代码使所必需的函数说明
  • game.c: 存放各种实现游戏功能所需要的函数。
  • test.c:作为编译的主程序,存放主函数,编写实现游戏功能的主要思想。

①打印游戏菜单

 

我们需要将菜单函数GameInte在源文件game.c中进行创建和定义,然后再在头文件game.h中对函数进行声明。就像这个样子

(给大家看一下game.h头文件中宏定义的数值和定义的全局变量,这样方便后期对数值修改,并且修改代码时也比较方便

②棋盘的数据初始化

因为是4*4的数据,所以我们在上面定义了一个全局变量board[Row][Col]用来存放这4*4个的数值定义成int型方便后续接收整形数据也方便数值的打印。在这里我们将棋盘数据的初始值都设置成0

 

③打印游戏棋盘

因为在上面我们定义的,用于记录数据的二维数组中存放的数据为int型所以没办法像创造其他棋盘一样也用'来代表'空格子' ,所以在打印游戏棋盘的时候,我们可以使用一个if...else选择语句,使当格子中数值为0时,不打印格子中的数据。

 

游戏棋盘可以按照自己的意愿随意更改,我这只是一个参考,打印出来是这个样子的

④在棋盘随机位置生成一个2

在棋盘的随机位置生成2就需要用到生成随机数的函数rand(),和使rand()变成"真正随机数"的srand()了。我们需要在test.c文件的主函数中输入srand((unsigned int)time(NULL))其作用是使生成随机数的rand()随时间变化而时刻变化。然后我们再在生成随机数的函数中,使用int a = rand() % row; int b = rand() % col来创造两个随机的坐标,再将对应坐标中的值改变为2。(如果坐标已经有数字,则使用goto语句跳转回去,重新生成坐标)

 

我们调试两次代码可以发现2生成的位置并不相同,这就代表功能的实现成功了。

⑤实现通过WSAD选择上下左右

我们通过使用for循环嵌套的方式,来遍历数组中的全部元素,通过W,S,A,D对应的上下左右移动判断要移动的元素的上,下,左,右是否为0如果为0,则将元素向着对应的位置移动如果不为0则判断两元素是否相等,如果两元素相等,则将靠近此次移动方向的元素加倍,另一个元素则减少成0,如果两元素不相等则不对两元素进行移动处理

1.实现按W向上移动
 

或许有人会问为什么for循环的遍历要逆向遍历呢其实我最开始也是按照从头到尾的顺序遍历的,但是写完代码却发现每一次只能够将元素移动一个格子,后来我才发现

比如,此时我们想把第三行的元素挪到第一行,如果是从前往后依次遍历数组,当我们把第三行的挪到第二行之后,紧接着就去遍历第四行了,不能再找到已经上移的元素所以就只能够实现一次移动。但如果我逆向遍历的话,当我将第三行的元素挪到了第二行,紧接着我就会遍历第二行,然后找到这个元素,再把它挪到第一行,这样就实现了按W上移的功能了。

通过这两张图来进行解释,可能会更加的一目了然。

之后我们进行W,S,A,D四种方向的移动时,也需要对照遍历的四种方向来选取正序遍历和逆序遍历。看了这两张图你应该就能明白我的意思啦~那么接下来让我们看看是否成功实现了W向上移动的功能看来成功实现了移动的功能~再让我们看看将元素数值合并,和不相同的元素堆叠的功能是否实现吧看来也成功实现啦~

2.实现按S向下移动

和上面Wup的代码其实大同小异,只是向上移动时是当前元素与头顶的元素进行判断是否为0和比较大小,而向下移动则是当前元素与下方的元素进行判断是否为0和比较大小。

通过刚才的两张图,想必大家应该知道实现按S向下移动是正序遍历还是逆序遍历了吧~没错!就是正序遍历

 

看来向下移动功能也实现啦~

3.实现按A向左移动

接下来的按A向左移动和按D向右移动跟上面的W向上移动和S向下移动,基本上是相同的东西,只要懂了上面两个代码,这两个自然也就懂了。那么我就不多废话,直接将代码奉上啦~

 
4.实现按D向右移动
 
5.选择上下左右

这个函数就是我们前四个函数的总和,我们需要利用switch语句来判断键盘上输入的W,S,A,D从而来通过case充当下一步函数的调用的过程。(在switch语句中可以添加一些其他的功能,比如说你想退出游戏,就加一个case 0的按键,然后写出对应功能的代码就可以啦,这里我只适配了退出游戏的case 0,其余的就交给小伙伴们自行探索啦~)

 

到了这里,我们的2048游戏基本上就能够进行游玩啦~

⑥判断游戏是否结束

判断游戏结束,我们只需要创造一个计数器,统计4*4棋盘中非零元素的数量,当非零元素的数量正好等于4*4时,那么游戏也就结束啦。

 

好啦~至此我们的C语言游戏2048就基本完成啦~这个也是比较初阶版,适合刚入门的小伙伴们来刷题用~那么废话不多说,这就将完整代码双手奉上

1.game.h

 

2.game.c

 

3.test.c


最新文章
内行帮你选:小巧只为手感?小屏5G旗舰大盘点!小巧手机「内行帮你选:小巧只为手感?小屏5G旗舰大盘点!」
  自从全面屏流行之后,手机的屏幕尺寸似乎都以大为荣,而且还有越来越大的趋势。那问题来了!选购手机到底是大屏好、还是小屏
足球——欧冠1/4决赛首回合:巴黎圣日耳曼胜阿斯顿维拉
当日,在法国巴黎举行的2024-2025赛季欧洲足球冠军联赛四分之一决赛首回合比赛中,法甲巴黎圣日耳曼主场3比1战胜英超阿斯顿维拉
实力均衡同价位值得选 优质中端手机推荐低端手机「实力均衡同价位值得选 优质中端手机推荐」
很多消费者在选购手机时,会先设定价格区间,其中中端产品成为很多人的购机目标。近段时间,市面上发布了不少优质中端产品,2000
按键失灵是什么原因导致的手机按键失灵「按键失灵是什么原因导致的」
手机按键失灵常见原因有以下几种 一是手机壳问题。一些粗制滥造的手机壳尺寸不规整会压住侧面按键使其一直处于按压状态最终导致
明日方舟【主线11章】新机制,新敌人,新干员|即将登场夜神模拟器手机版安卓「明日方舟【主线11章】新机制,新敌人,新干员|即将登场」
新机制全新的机制汲营枯枝,其会释放一个单位,让其在周围的我方持续掉血,而其生命降低到半血的时候会造成凋亡损伤,而这个损伤
突然爆火!3万人涌入
傍晚时分,华灯初上天门北湖公园夜市区小吃摊主纷纷出动四面八方的食客相继赶来细细品味这缕人间烟火气2023年投入使用的北湖夜市
AI成招商工具,全屋定制也玩“一键生成”,消费者:我要的不止是
人工智能技术正在改变甚至颠覆多个行业的运营逻辑,家居行业也不例外。除了天然亲近AI的智能家居赛道,众多传统家居品牌也在积极
最懂生命的人,用另一种方式诠释大爱
潮新闻客户端 记者 杨茜 通讯员 周泽楷 王屹峰 叶蒙蒙 王晨 黄慧远“站在病床边的医者”和“躺在病床上的病人”是两种完全不同的
解码“幸福密钥”:“旅游+”的跨界共融
旅游业是具有显著时代特征的幸福产业。纵观历史,旅游从“少数人的特权”到大众化探索,再到个性化体验,最后与技术、环保、健康
购买游泳课后孩子拒绝上课,家长有权要求退费吗?
家长为孩子购买游泳课,孩子因恐惧拒绝上课,预付的课时费能否退还?近日,北京市第三中级人民法院审结一起涉未成年人游泳培训的