Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 巨蟒2048小游戏_Python_Project - Fatal编程技术网

Python 巨蟒2048小游戏

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

我有一个项目,我必须做一个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_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 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