我有一个项目,我必须在其中进行2048游戏。
现在,如果数字相等,我会使用数字求和的函数,如果数字之间有0,它也应该将数字相加。
基本上这就是我所做的:
'''tab creates the 2048 game board'''
def tab():
return ({
(1, 1): 0, (1, 2): 0, (1, 3): 0, (1, 4): 0,
(2, 1): 0, (2, 2): 0, (2, 3): 0, (2, 4): 0,
(3, 1): 0, (3, 2): 0, (3, 3): 0, (3, 4): 0,
(4, 1): 0, (4, 2): 0, (4, 3): 0, (4, 4): 0
})
#tab_reduc(t,d) gets a board(t) and a place to move as a string ('N','S','E','W') and moves the board as ordered
def tab_reduc(t,d):
for i in range(1,4):
for c in range(1,4):
if t[(i,c)] == t[(i,c+1)] and t[(i,c+1)] != 0:
t[(i,c)] = t[(i,c)] + t[(i,c+1)]
t[(i,c+1)] = 0
elif t[(i,c)] != t[(i,c+1)] and t[(i,c)] != 0:
t[(i,c)] = t[(i,c)]
t[(i,c+1)] = t[(i,c+1)]
elif t[(i,c)] == 0 and t[(i,c+1)] != 0:
t[(i,c)] = t[(i,c+1)]
t[(i,c+1)] = 0
return t
例如,如果我有:
(1,1) = 4
(1,2) = 4
(1,3) = 8
(1,4) = 4
当我运行“tab_reduc(t,'N')”游戏应该上升,我确实得到了
(1,1) = 8
(1,2) = 8
(1,3) = 4
(1,4) = 0
但如果我有
(1,1) = 4
(1,2) = 0
(1,3) = 0
(1,4) = 4
我在北方玩,我得到了
(1,1) = 4
(1,2) = 0
(1,3) = 4
(1,4) = 0
如果我再次这样做,我会得到:
(1,1) = 4
(1,2) = 4
(1,3) = 0
(1,4) = 0
再次:
(1,1) = 8
(1,2) = 0
(1,3) = 0
(1,4) = 0
问题是,这应该在1场比赛中完成,而不是几场比赛。
有人可以帮助我吗?
答案 0 :(得分:1)
移动N
时,您可能想要向后迭代。
for i in range(1, 4):
for c in reversed(range(1, 4)):
...
如果你做了那个修复,你会更接近你的解决方案。但是,在这种情况下你仍然会有一个错误:
0 0 0 0
4 0 0 0
2 0 0 0
2 0 0 0
然后您的改进代码会产生:
8 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
什么时候应该产生:
4 0 0 0
4 0 0 0
0 0 0 0
0 0 0 0
我会把这作为读者练习。我想最简单的解决方法是在成功进行累积时突破迭代。
如果我自己实施,我会采用略有不同的策略。这里的关键是将问题分解为几个步骤。让我们继续谈论北方。
步骤:
让我们删除数字上方的所有0
。也就是说,让我们把桌子向北压扁。所以这个:
0 0 0 0 1 1 0 1
1 0 0 0 Becomes.. 0 0 0 1
0 1 0 1 0 0 0 0
0 0 0 1 0 0 0 0
接下来,让我们看看邻居,如果可以的话,合并他们。所以:
0 0 0 1 0 0 0 2
0 0 0 1 Becomes.. 0 0 0 0
0 0 0 1 0 0 0 1
0 0 0 0 0 0 0 0
第三步是再次删除0。我们需要这样做,因为我们在上一步中插入了一些额外的。
0 0 0 1 0 0 0 2
0 0 0 1 Becomes.. 0 0 0 1
0 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0
现在。我们如何在代码中实现这样的东西?
def tab():
return ({
(1, 1): 0, (1, 2): 0, (1, 3): 0, (1, 4): 0,
(2, 1): 0, (2, 2): 0, (2, 3): 0, (2, 4): 0,
(3, 1): 0, (3, 2): 0, (3, 3): 0, (3, 4): 0,
(4, 1): 0, (4, 2): 0, (4, 3): 0, (4, 4): 0
})
def tab_reduc(t,d):
if d in ('n', 'N'):
# Merge whitespace
for _ in range(4): # FIXME: Massive hack...
for i in range(1,4):
for c in range(1,5):
if t[i+0, c] == 0 and t[i+1, c] != 0:
t[i+0, c] = t[i+1, c]
t[i+1, c] = 0
# Merge neighbors
for i in reversed(range(1, 4)):
for c in range(1,5):
if t[i+0, c] == t[i+1, c] and t[i, c] != 0:
t[i+0, c] *= 2
t[i+1, c] = 0
# Merge whitespace
for _ in range(4): # FIXME: Massive hack
for i in range(1,4):
for c in range(1,5):
if t[i+0, c] == 0 and t[i+1, c] != 0:
t[i+0, c] = t[i+1, c]
t[i+1, c] = 0
def tab_print(t):
for i in range(1, 5):
for c in range(1, 5):
print '{:2d}'.format(t[i,c]),
print
print
t = tab()
t[(1,4)] = 2
t[(2,4)] = 2
t[(3,4)] = 2
t[(4,4)] = 2
tab_print(t)
tab_reduc(t, 'N')
tab_print(t)
0 0 0 2
0 0 0 2
0 0 0 2
0 0 0 2
0 0 0 4
0 0 0 4
0 0 0 0
0 0 0 0
为了自己的理智,我改变了一些内部事物。在此代码中,(i, j)
行向下i-1
行,右侧为j-1
列。