Python 2048游戏

时间:2014-12-03 17:50:00

标签: 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, 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场比赛中完成,而不是几场比赛。

有人可以帮助我吗?

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

我会把这作为读者练习。我想最简单的解决方法是在成功进行累积时突破迭代。

还有一些最后的想法:

如果我自己实施,我会采用略有不同的策略。这里的关键是将问题分解为几个步骤。让我们继续谈论北方。

步骤:

  1. 让我们删除数字上方的所有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
    
  2. 接下来,让我们看看邻居,如果可以的话,合并他们。所以:

    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
    
  3. 第三步是再次删除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
    
  4. 现在。我们如何在代码中实现这样的东西?

    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列。