C语言实战:2048小游戏

发布时间:2026/8/7 10:11:58
C语言实战:2048小游戏
周末写了个2048小游戏也是没想到自己成功做出来了成就感满满下面跟大家分享一下是怎么制作的。这个函数是老师提供的就是可以让终端不显示输入内容以及不用按回车就可以输入的函数。下面将从主函数开始讲起。首先这里用到了一个之前说过的随机种子以时间作为参数用来生成随机数之前说过可以对生成的随机数做一些处理就可以将随机值固定在一个范围内今天做的2048用到的是4*4的棋盘所以我们需要生成的随机位置是0-3,2048最开始会生成两个随机数在后面每次棋盘有变化后又会生成一个数这个数一般是2或4但是2出现的概率比4高所以当生成的随机数是0-2时返回2是3时才返回4。starGame函数为游戏的开始界面打印后延时3秒这里我是让豆包给我生成了一个界面大家想要什么样的可以告诉自己的豆包。下面是循环过程直到用户选择退出才结束。首先打印菜单供用户选择。选项2效果选项3效果下面进入最主要的部分游戏实现部分。这里简单介绍这个函数的内容首先先清屏然后定义了两个数组第一个数组用于存放当前棋盘上的内容第二个数组等后面用到再讲解。先生成两个随机位置在数组中包括ij以及两个随机数调用复制的函数将a数组的值复制到p数组然后调用打印数组的函数。这里当数组中的数为0时就打印 ,将位置空出来。其他就照常打印。然后开始判断用户输入时WSAD还是上下左右提示上下左右计算机读到的是\033[A,\033[B,\033[C,\033[D所以需要先读取是不是\033也就是escascii码值为27然后再吞掉一个字符再来判断第三个字符。通过不同的输入调用向不同方向合并和移动的函数。在移动完后再打印一次移动过后的棋盘此时来判断数组a和数组p有没有区别因为只有在元素有变化的时候才生成新数据。如果没变化也生成新数据的话再后面数组被填满但你按了一个没有合成数据的方向就会卡死在后面我while循环因为一直找不到一个空位置来放这个数据所以要在有变化时才生成新数据。生成完新数据后来判断游戏赢了没出现2048就算赢。如果成功了就返回成功如果没成功就来判断一下是不是失败了。失败的条件是棋盘中没有空位置且相邻两元素没有相等的数据所以这里先判断棋盘中有没有0有0就代表还有空位就直接返回1相邻元素相等用的是先判断这个元素的右侧元素和它是否相等在判断他下方的元素是否相等一行的最后一个数据不用判断和右边是否相等一列的最后一个数据不用判断是不是和下面的数据相等所以if里面有两个条件。在这里我写的是数组指针形式大家可以改为数组形式就是p[i][j]。如果没失败就继续读取输入如果失败了就打印失败界面等待用户退出。下面讲解合并函数和移动函数。合并函数因为向左和向右的函数只是起始位置不同所以这里只展示向左和向上合并就是先找到第一个不为0的数然后再找下一个不为0的数判断两者是否相等如果相等就将第一个数变为他的2倍第二个数变为0如果不相等就将第二个数当做第一个数再继续找下一个不为0的数继续判断是否相等。思想与向左相同但是移动的是行。移动函数这里只展示向左和向上我们用now来记录要放数据的位置如果第一个位置有值的话now就然后将数据移动到now的位置原位置清0now其实就相当于一个指针指向现在能放数据的位置。向上与向左不同的地方就是向左动列向上动行如果不理解可以将的写的指针形式转化为数组形式。游戏展示初始界面可优化部分上面的代码只是可以做到完成整游戏但是这个代码其实还有很多可以继续优化的地方在这里我举两个例子1.给数字增加颜色VT100是一个古老的终端定义,后面出现的终端几乎都兼容这种终端。VT100控制码是用来在终端扩展显示的代码。以下的宏定义即可完成对颜色的控制。通过判断数字来选择不同的颜色记得在打印完数字以后一定要将颜色恢复。2.生成随机数原来我使用的是生成一个随机位置判断它是不是0如果是0,就给这个位置生成一个随机数但是这么写在前期空格很多的情况下很容易实现但是在后期空格很少的时候就会比之前需要更多的时间。所以这里给出一个优化的方法。定义一个16行2列的数组来记录为0的位置然后我们在这个位置中随机选择一个位置rand( )%t就是生成一个0-t的数然后通过这个数组中存的位置再给随机数这样在后期空位非常少的情况下非常好用。这个小游戏我就说这么多大家有什么其他的意见可以告诉我噢