首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 2048游戏

Python 2048游戏
EN

Stack Overflow用户
提问于 2014-12-03 17:49:59
回答 1查看 6.6K关注 0票数 1

我有一个项目,在其中我必须做一个2048年的游戏。

现在,我讨论的函数是,如果数字相等,它也应该把它们拉上来,如果数字之间有0。

基本上这就是我所做的:

代码语言:javascript
复制
'''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

例如,如果我有:

代码语言:javascript
复制
(1,1) = 4
(1,2) = 4
(1,3) = 8
(1,4) = 4

当我运行"tab_reduc(t,'N')“时,游戏应该会上升,我确实得到了

代码语言:javascript
复制
(1,1) = 8
(1,2) = 8
(1,3) = 4
(1,4) = 0

但如果我有

代码语言:javascript
复制
(1,1) = 4
(1,2) = 0
(1,3) = 0
(1,4) = 4

我做北戏,我得到

代码语言:javascript
复制
(1,1) = 4
(1,2) = 0
(1,3) = 4
(1,4) = 0

如果我再做一次,我会得到:

代码语言:javascript
复制
(1,1) = 4
(1,2) = 4
(1,3) = 0
(1,4) = 0

又一次:

代码语言:javascript
复制
(1,1) = 8
(1,2) = 0
(1,3) = 0
(1,4) = 0

问题是,这应该是在一个游戏,而不是几个剧本。

有人能帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2014-12-03 17:57:34

思想..。

在移动N时,您可能想要向后迭代。

代码语言:javascript
复制
for i in range(1, 4):
    for c in reversed(range(1, 4)):
        ...

所以..。

如果你这样做了,你就会更接近你的解决方案。但是,在本例中仍然会有一个bug:

代码语言:javascript
复制
0 0 0 0
4 0 0 0
2 0 0 0
2 0 0 0

然后,您的改进代码将生成:

代码语言:javascript
复制
8 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

当它应产生:

代码语言:javascript
复制
4 0 0 0
4 0 0 0
0 0 0 0
0 0 0 0

我会把修正作为读者的练习。我想,解决这个问题的最简单的方法是,当您成功地完成一个积累时,就可以摆脱迭代。

还有一些最后的想法:

如果我要自己实现这一点,我会使用稍微不同的策略。这里的关键是把问题分解成几个步骤。让我们继续只谈北方。

步骤:

  1. 让我们移除数字以上的所有0。那就是,让我们把桌子向北摊平。所以这个: 0 0 0 1 1 0 1 0 0 0变成..。0 0 0 1 0 1 0 1 0 0 0
  2. 接下来,让我们看看邻居,如果可以的话,将他们合并。所以: 0 0 0 1 0 0 0 1变成..。0 0 0 1 0 0 0
  3. 第三步是再次删除0。我们需要这样做,因为我们在前一步中插入了一些额外的。 0 0 0 1 0 0 0 1变成..。0 0 0 1 0 0 0 1 0 0 0

现在。我们如何在代码中实现这样的东西呢?

代码语言:javascript
复制
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)

运行时输出:

代码语言:javascript
复制
 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列在右边。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27278332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档