1 回答
TA贡献1799条经验 获得超9个赞
首先你的合并问题
目前你总是从上到下和从左到右扫描你的瓷砖,与玩家的移动无关。然而,对于 2048,最好在玩家移动的相反方向上扫描,因为瓷砖只会在那个方向合并。例如,让我们考虑以下场景:
0 0 2 0 |
0 0 2 2 | Player move
0 2 4 8 v
2 32 4 2
让我们假设玩家的移动方向是朝向底部,所以我们开始从底部向上扫描。在第三列中,我们需要先合并 4+4,然后再合并 2+2,即自下而上。朝那个方向前进,您可以合并 4+4,然后将列的最底部字段标记为已合并,从而不允许进一步合并(由数字周围的括号表示):
0 0 0 0 |
0 0 2 2 | Player move
0 2 2 8 v
2 32 (8) 2
合并最底部的单元格(如果可能)后,我们继续处理上面的单元格,依此类推……
0 0 0 0 |
0 0 0 2 | Player move
0 2 (4) 8 v
2 32 (8) 2
[...]
0 0 (0) 0 |
0 0 (0) 2 | Player move
0 2 (4) 8 v
2 32 (8) 2
当不再有可能合并时,移动结束,所有“合并”标记都被删除,我们等待下一轮。这种方法解决了您的多重合并问题。
扫描方向的另一个示例(数字现在表示循环将如何通过字段):
Player move
---->
4 3 2 1
8 7 6 5
12 11 10 9
16 15 14 13
关于你的代码
查看代码,您会注意到关于您的循环有很多代码重复。对于每个case你做一个单独的嵌套for循环,这不是真正的最佳。相反,您可以执行以下操作:
for i := 1; i < height; i++ {
for j := 0; j < width; j++ {
if board[i][j] == 0 {
continue
}
switch input {
case "d":
updateBoardDown(board, i, j)
case "u":
updateBoardUp(board, i, j)
[...]
}
}
}
- 1 回答
- 0 关注
- 233 浏览
添加回答
举报