Python 巨蟒2048小游戏
我有一个项目,我必须做一个2048游戏 现在,我在做一个函数,如果数相等,求和,如果数之间有一个0,它也应该把它们向上拉 基本上我就是这么做的:Python 巨蟒2048小游戏,python,project,Python,Project,我有一个项目,我必须做一个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
'''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_reduce(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
问题是,这应该在一场比赛中完成,而不是几场比赛
有人能帮我吗?我想。。。
移动N
时,可能需要向后迭代
for i in range(1, 4):
for c in reversed(range(1, 4)):
...
因此。。。
如果您进行修复,您将更接近您的解决方案。但是,在这种情况下,您仍然会有一个bug:
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
s。也就是说,让我们把桌子往北展平。因此:
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 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)
运行时输出:
为了自己的理智,我改变了一些内在的东西。在这段代码中,
(i,j)
在i-1
行的下方,在j-1
列的右侧。那么你的问题是什么呢?你需要有特殊的逻辑来将0
计算为空白并允许移动继续。我很想知道是什么导致我的代码失败。因为,在3次中完成的事情应该在1次中完成。@PlatinumAzure我怎么能这样做呢?在你修复缩进和tab()
中的错误之前,不可能对你的代码进行推理,这将导致发布的代码甚至无法通过语法检查。这不是,它与我所说的第1个for(对于范围(1,4)中的I)一致,这是由于堆栈溢出所采用的格式,这是我第一次在这里发布,谁知道呢,我无法发布它,所以我尝试了一切,直到我可以发布它。谢谢你,这对我帮助很大。我已经想过了,但是我必须找到一种方法来修复这个bug。谢谢是的,我知道!但是我的代码是+1到l的,所以如果l从1到4==[1,2,3],那么在代码中它将运行到4,因为我是+1。如果我做1到5,它将超出范围。@AndréSoares:是的。那是我的错误。我已经从我的答案中删去了。我认为您在这里寻找的关键是反向迭代。我还使用内置的reversed
将其编辑得更干净。
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