网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月19日
漏签
0
天
c语言吧
关注:
801,960
贴子:
4,377,259
看贴
图片
吧主推荐
视频
游戏
1
2
3
下一页
尾页
96
回复贴,共
3
页
,跳到
页
确定
<<返回c语言吧
>0< 加载中...
2048算法讨论
只看楼主
收藏
回复
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
之前说过要发帖说一下2048算法问题,今天有时间,就试着写写看。
也许有人觉得这个问题太小儿科了,所以请大神勿喷!
先上一张效果图,一年前做的,现在回去看代码觉得不太满意!
墨滨滨
彩虹面包
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
需要加入撤销功能,金币功能,一键变1024功能。好友排行功能
2026-04-19 13:37:20
广告
不感兴趣
开通SVIP免广告
画骨
彩虹面包
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
居然没有充值一键通关功能,差评
Mesoevil
麻婆豆腐
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
抄袭cf差评
cczy54420
团子家族
10
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
奥
✎﹏₯㎕﹏﹏﹏﹏﹏﹏﹏
听弦断,断那三千痴缠。
坠花湮,湮没一朝风涟。
花若怜,落在谁的指尖。 ————————————————————
--那些阻隔目光的花和殇
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
吃完饭了,现在接着写!
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
先将问题隐含的规则提取出来:
1、2048是一个4X4的矩阵(二维数组);
2、矩阵内数字的移动有四个方向,上下左右;
3、数字按某一方向移动时,若前一个数字为0(空格),则后一个数字移动到前者位置;
若前一个数字与后一个数字相同,则前者X2,后者为0;
如前后两个数字不等,且前者不为0,则两者相对位置保持不变;
规则就这三条,重点是第三条规则的实现。
DASDAA
低能力者
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
快更啊
2026-04-19 13:31:20
广告
不感兴趣
开通SVIP免广告
若风丶殇
低能力者
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
挤挤
---贴吧APPX内测版
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
对二维数组的操作,可以看出是对一维数组的分步操作。
二维数组的移动只有两个方向,即左右,或者说逆移,顺移;顺移等效于二维数组的右下,逆移等效于二维数组的左上。顺移和逆移的区别在于,第一个数和递减(增)规律;数的移动方式都是一样的。
顺移时第一个数是a[3],递减(-1);逆移时第一个数是a[0],递增(+1);这里可以定义两个全局变量或者结构体,记录这两个数。
稍后上代码,别急~!
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
typedef enum
{
MOVE_LEFT,
MOVE_UP,
MOVE_RIGHT,
MOVE_DOWN,
MOVE_MAX
}MOVE_TYPE
typedef struct
{
int first_n;
int inc;
}MOVE_PARA;
#define MAX_NUM 4
int array[MAX_NUM][MAX_NUM] = {0};
MOVE_PARA Move_Para(MOVE_TYPE move_fx)
{
MOVE_PARA para;
if(move_fx == MOVE_LEFT || move_fx == MOVE_UP)
{
para.first_n = 0;
para.inc = 1;
}
else
if(move_fx == MOVE_RIGHT || move_fx == MOVE_DOWN)
{
para.first_n = MAX_NUM - 1;
para.inc = -1;
}
return para;
}
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
移动函数:
void Move(MOVE_TYPE move_fx)
{
int i,j,k;
MOVE_PARA para;
para = Move_Para(move_fx);
if(move_fx == MOVE_LEFT || move_fx == MOVE_RIGHT)
{
for(i = 0; i < MAX_NUM; i++)
{
for(k = 0; k < MAX_NUM/2; k++)
{
for(j = para.first_n; j = MAX_NUM - para.first_n; j += para.inc)
{
if(array[i][j] == 0)
{
array[i][j] = array[i][j + para.inc];
array[i][j + para.inc] = 0;
}
else
if(array[i][j] == array[i][j + para.inc])
{
array[i][j] *=2;
array[i][j + para.inc] = 0;
}
}
}
}
}
else
if(move_fx == MOVE_UP || move_fx == MOVE_DOWN)
{
for(j = 0; j < MAX_NUM; j++)
{
for(k = 0; k < MAX_NUM/2; k++)
{
for(i = para.first_n; i = MAX_NUM - para.first_n; i += para.inc)
{
if(array[i][j] == 0)
{
array[i][j] = array[i + para.inc][j];
array[i + para.inc][j] = 0;
}
else
if(array[i][j] == array[i + para.inc][j])
{
array[i][j] *=2;
array[i + para.inc][j] = 0;
}
}
}
}
}
}
4545先生
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
精华帖啊
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
解决了数组的移动,还有几个比较重要的问题要解决:
1、判断数组在某个方向能否移动
2、判断整个数组能否移动,各个方向都不能移动,则游戏结束。
3、数的新增
4、判断某个数是否为2048。
5、得分计算。
加入这几个规则,即可得到一个完整的游戏。
2026-04-19 13:25:20
广告
不感兴趣
开通SVIP免广告
james19791
强能力者
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
先写一个函数,得到数组内为0的个数:
int Empty_N(void)
{
int i,j;
int n = 0;
for(i = 0; i < MAX_NUM; i++)
{
for(j = 0; j < MAX_NUM; j++)
{
if(array[i][j] == 0)
{
n++;
}
}
}
return n;
}
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示