java2048移动算法_平铺合并算法2048游戏

博主尝试在C语言中实现2048游戏的移动和合并算法,使用字符代替数字,但遇到了算法无法正常工作的难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我试图在C中重新创建游戏2048,但是我无法将算法移动或合并到一起以正常运行 . 在最初的2048游戏中,您可以像这样将瓷砖移动到一起:

2 | 2 | 4 | 4 4 | 8 | |

---+---+---+--- *swipes to the left* -> ---+---+---+---

8 | | 8 | 16| | |

因此,两个相同的图块可以合并为一个尺寸为两倍的图块 . 我的版本几乎相同,但不是使用数字,而是使用在合并时递增1的字符,因此 [A|A] 将合并到 [B] ,等等 . 我这样做只是为了不必处理不同大小的图块 .

所以我的电路板存储为一个4 * 4字符数组存在一个结构我称为网格(我知道可能有点多余)

typedef struct grid {

char tiles[4][4];

} Grid;

我试图使算法移动和合并向上,向下,向左和向右,但它们无法正常工作 .

void pushLeft(Grid * grid)

{

int i, j, k;

for(i = 0; i < 4; i++) //Row number i

{

for(j = 1; j < 4; j++) //Column number j

{

if(grid->tiles[i][j] != ' ') //tile is not empty

{

int flag = 1; //flag to prevent merging more than one level at a time

//Starting on column k, push tile as far to the left as possible

for(k = j; k > 0; k--)

{

if(grid->tiles[i][k-1] == ' ') //neighbor tile is empty

{

grid->tiles[i][k-1] = grid->tiles[i][k];

grid->tiles[i][k] = ' ';

}

else if(grid->tiles[i][k-1] == grid->tiles[i][k] && flag) //neighbor equals

{

grid->tiles[i][k-1]++;

grid->tiles[i][k] = ' ';

flag = 0;

}

else //Can't push or merge

{

flag = 1;

break;

}

}

}

} // Done with row

}

}

void pushRight(Grid * grid)

{

int i, j, k;

for(i = 0; i < 4; i++) //Row number i

{

for(j = 2; j >= 0; j--) //Column number j

{

if(grid->tiles[i][j] != ' ') //tile is not empty

{

int flag = 1; //flag to prevent merging more than one level at a time

//Starting on column k, push tile as far to the right as possible

for(k = j; k < 3; k++)

{

if(grid->tiles[i][k+1] == ' ') //neighbor tile is empty

{

grid->tiles[i][k+1] = grid->tiles[i][k];

grid->tiles[i][k] = ' ';

}

else if(grid->tiles[i][k+1] == grid->tiles[i][k] && flag) //neighbor equals

{

grid->tiles[i][k+1]++;

grid->tiles[i][k] = ' ';

flag = 0;

}

else //Can't push or merge

{

flag = 1;

break;

}

}

}

} // Done with row

}

}

void pushUp(Grid * grid)

{

int i, j, k;

for(i = 0; i < 4; i++) //Column number i

{

for(j = 1; j < 4; j++) //Row number j

{

if(grid->tiles[j][i] != ' ') //tile is not empty

{

int flag = 1; //flag to prevent merging more than one level at a time

//Starting on row k, push tile as far upwards as possible

for(k = j; k > 0; k--)

{

if(grid->tiles[k-1][i] == ' ') //neighbor tile is empty

{

grid->tiles[k-1][i] = grid->tiles[i][k];

grid->tiles[k][i] = ' ';

}

else if(grid->tiles[k-1][i] == grid->tiles[i][k] && flag) //neighbor equals

{

grid->tiles[k-1][i]++;

grid->tiles[k][i] = ' ';

flag = 0;

}

else //Can't push or merge

{

flag = 1;

break;

}

}

}

} // Done with column

}

}

void pushDown(Grid * grid)

{

int i, j, k;

for(i = 0; i < 4; i++) //Column number i

{

for(j = 2; j >= 0; j--) //Row number j

{

if(grid->tiles[j][i] != ' ') //tile is not empty

{

int flag = 1; //flag to prevent merging more than one level at a time

//Starting on row k, push tile as far down as possible

for(k = j; k < 3; k++)

{

if(grid->tiles[k+1][i] == ' ') //neighbor tile is empty

{

grid->tiles[k+1][i] = grid->tiles[i][k];

grid->tiles[k][i] = ' ';

}

else if(grid->tiles[k+1][i] == grid->tiles[i][k] && flag) //neighbor equals

{

grid->tiles[k+1][i]++;

grid->tiles[k][i] = ' ';

flag = 0;

}

else //Can't push or merge

{

flag = 1;

break;

}

}

}

} // Done with column

}

}

我用一些硬编码的测试数据测试了这些算法 . 将磁贴推向左侧的算法似乎正常工作 . pushRight几乎可以工作,但它同时合并两个级别,所以 [B|A|A] 合并到 [C] 但应该合并到 [B|B] .

pushUp似乎几乎总是用空的瓷砖(空格)擦拭整个电路板 . pushDows似乎正在移除一些瓷砖 .

有没有人看到问题或知道这样做的方法?我曾考虑使用递归算法,但我无法绕过它 .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值