辖瑁地 发表于 2026-2-2 11:40:04

C语言版2048小游戏

一、游戏特点

2048是一款数字益智类游戏,玩家需要使用键盘控制数字方块的移动,合并相同数字的方块,最终达到数字方块上出现“2048”的目标。
为用C语言实现2048的小游戏项目,我们需先观察2048小游戏的特点和我们需要实现的一些功能:
1.需要一个棋盘来储存数字,用什么来表示棋盘?
2.需要控制数字的移动,怎样控制数字的移动?
3.需要在数字移动的过程中产生新的随机数,怎么生成新的随机数?
4.需要控制数字是否需要合成,怎么判断数字是否需要合成和怎么合成?
5.需要判断判定游戏是否成功,怎么判断游戏是否结束?
6.需要丰富游戏的界面,怎样使游戏界面好看一点?
二、游戏运行示意图


三、工具准备

1.代码运行平台:Visual Studio 2022
官网地址:https://visualstudio.microsoft.com/zh-hans/
2.图形库:Easyx
官网地址:https://easyx.cn/
四、代码实现流程

一、核心逻辑

1、棋盘制作
用二维数组来存储数字,制作与显示棋盘
//用整型数组表示矩阵方格
int arr = { 0 };
//打印矩阵方格的数据
void PrintArr()
{
        for (int row = 0; row < 4; row++)
        {
                for (int column = 0; column < 4; column++)
                {
                        printf("%d\t", arr);
                }
                printf("\n");
        }
}2、控制数字的移动与合成
//向左边移动
void Left()
{
        //遍历行
        for (int row = 0; row < 4; row++)
        {
                for (int column = 0; column < 4; column++)
                {
            //如果当前格子为空,则向右移动
                        if (arr == 0)
                        {
                                //从后面找一个不为空的格子,如果找到,则交换位置
                                for (int i = column + 1; i < 4; i++)
                                {
                                        if (arr!= 0)
                                        {
                                                arr = arr;
                                                arr = 0;
                                                //处理一个非空位置后,条件不成立,不能往后走了
                                                break;
                                        }
                                }
                        }
                        //如果不为0,表示要合并
                        if (arr != 0)
                        {
                                //从后面找一个和当前数据相同的数据,遇到0就跳过,遇到不同的,退出
                                for (int i = column + 1; i < 4; i++)
                                {
                                        if (arr == arr)
                                        {
                                                //数据合并
                                                arr *= 2;
                                                arr = 0;
                                                //合并完成就结束查找
                                                break;
                                        }
                                        else if (arr == 0)
                                                continue;

                                        else
                                                break;
                                }
                        }
                }
        }
        CreateRandData(1);
}
//向右边移动
void Right()
{
        for (int row = 0; row < 4; row++)
        {
                for (int column = 3; column >= 0; column--)
                {
                        //如果当前格子为空,则向左移动
                        if (arr == 0)
                        {
                                //从后面找一个不为空的格子,如果找到,则交换位置
                                for (int i = column - 1; i >= 0; i--)
                                {
                                        if (arr != 0)
                                        {
                                                arr = arr;
                                                arr = 0;
                                                //处理一个非空位置后,条件不成立,不能往后走了
                                                break;
                                        }
                                }
                        }
                        //如果不为0,表示要合并
                        if (arr != 0)
                        {
                                //从后面找一个和当前数据相同的数据,遇到0就跳过,遇到不同的,退出
                                for (int i = column - 1; i >=0; i--)
                                {
                                        if (arr == arr)
                                        {
                                                //数据合并
                                                arr *= 2;
                                                arr = 0;
                                                //合并完成就结束查找
                                                break;
                                        }
                                        else if (arr == 0)
                                                continue;

                                        else
                                                break;
                                }
                        }
                }
        }
        CreateRandData(1);
}
//向上边移动
void Up()
{
        for (int column = 0; column < 4; column++)
        {
                for (int row = 0; row < 4; row++)
                {
                        //如果当前格子为空,则向下移动
                        if (arr == 0)
                        {
                                //从后面找一个不为空的格子,如果找到,则交换位置
                                for (int i = row + 1; i < 4; i++)
                                {
                                        if (arr != 0)
                                        {
                                                arr = arr;
                                                arr = 0;
                                                //处理一个非空位置后,条件不成立,不能往后走了
                                                break;
                                        }
                                }
                        }
                        //如果不为0,表示要合并
                        if (arr != 0)
                        {
                                //从后面找一个和当前数据相同的数据,遇到0就跳过,遇到不同的,退出
                                for (int i = row + 1; i < 4; i++)
                                {
                                        if (arr == arr)
                                        {
                                                //数据合并
                                                arr *= 2;
                                                arr = 0;
                                                //合并完成就结束查找
                                                break;
                                        }
                                        else if (arr == 0)
                                                continue;

                                        else
                                                break;
                                }
                        }
                }
        }
        CreateRandData(1);
}
//向下边移动
void Down()
{
        for (int column = 0; column < 4; column++)
        {
                for (int row = 3; row >= 0; row--)
                {
                        //如果当前格子为空,则向上移动
                        if (arr == 0)
                        {
                                //从后面找一个不为空的格子,如果找到,则交换位置
                                for (int i = row - 1; i >= 0; i--)
                                {
                                        if (arr != 0)
                                        {
                                                arr = arr;
                                                arr = 0;
                                                //处理一个非空位置后,条件不成立,不能往后走了
                                                break;
                                        }
                                }
                        }
                        //如果不为0,表示要合并
                        if (arr != 0)
                        {
                                //从后面找一个和当前数据相同的数据,遇到0就跳过,遇到不同的,退出
                                for (int i = row - 1; i >= 0; i--)
                                {
                                        if (arr == arr)
                                        {
                                                //数据合并
                                                arr *= 2;
                                                arr = 0;
                                                //合并完成就结束查找
                                                break;
                                        }
                                        else if (arr == 0)
                                                continue;

                                        else
                                                break;
                                }
                        }
                }
        }
        CreateRandData(1);
}3、判断是否可以合成
//是否可以合成int CamMerge(){        for (int row = 0; row < 4; row++)        {                for (int column = 0; column < 4; column++)                {                        if (column+1

骆贵 发表于 2026-2-3 04:05:23

喜欢鼓捣这些软件,现在用得少,谢谢分享!

袁勤 发表于 2026-2-3 10:38:16

不错,里面软件多更新就更好了

账暴 发表于 2026-2-4 08:36:40

谢谢分享,试用一下

阙忆然 发表于 2026-2-5 03:23:07

用心讨论,共获提升!

锦惺 发表于 2026-2-7 11:25:27

收藏一下   不知道什么时候能用到

嗣伐 发表于 2026-2-8 06:58:21

前排留名,哈哈哈

荆邦 发表于 2026-2-8 21:00:41

感谢分享

求几少 发表于 2026-2-9 09:28:31

谢谢分享,辛苦了

姚梨素 发表于 2026-2-9 11:45:33

收藏一下   不知道什么时候能用到

曲愍糙 发表于 2026-2-9 21:54:25

热心回复!

姥恫 发表于 2026-2-9 23:46:43

不错,里面软件多更新就更好了

抑卞枯 发表于 2026-2-10 10:10:54

新版吗?好像是停更了吧。

溧久苟 发表于 2026-2-10 13:11:17

感谢分享,学习下。

喜及眩 发表于 2026-2-11 07:30:40

鼓励转贴优秀软件安全工具和文档!

艾曼语 发表于 2026-2-11 14:41:01

谢谢分享,试用一下

恿榫 发表于 2026-2-11 22:04:56

前排留名,哈哈哈

诉称 发表于 2026-2-12 04:53:09

这个有用。

打阗渖 发表于 2026-2-12 08:33:08

不错,里面软件多更新就更好了

喳谍 发表于 2026-2-13 18:50:12

感谢分享
页: [1] 2
查看完整版本: C语言版2048小游戏