在2d数组python中移动项目

时间:2015-08-20 14:29:43

标签: python multidimensional-array

我试图将游戏2048重新创建为项目,并且我在操作2D阵列时遇到了麻烦。我试图移动2d阵列中的元素,而不让它们离开屏幕。

def move(self, direction):

    if (self.d == UP):
        for i in range(3):
            for j in range(3):
                if(self.line[i][j]!= self.line[0][0]):
                    self.line[i][j] = self.line[i + 1][j]
                    self.line[i + 1][j] = self.line[i + 2][j] 
                    self.line[i + 2][j] = self.line[i + 3][j]

这是我目前刚刚让他们向上移动的东西,他们似乎总是消失或失败。

1 个答案:

答案 0 :(得分:0)

我认为这可能是你想要的,它是在JavaScript中,因为我目前不在我自己的计算机上,但它是:

function up(tbl) {
    var x = 0;
    while (x < tbl[0].length) {
        do {
            var move = 0;
            var y = 0;
            while (y < tbl.length - 1) {
                if (tbl[y][x] == 0 && tbl[y + 1][x] != 0) {
                    tbl[y][x] = tbl[y + 1][x];
                    tbl[y + 1][x] = 0;
                    move = 1;
                }
                else if (tbl[y][x] != 0 && tbl[y][x] == tbl[y + 1][x]) {
                    tbl[y][x] += tbl[y + 1][x];
                    tbl[y + 1][x] = 0;
                    move = 1;
                }
                y++;
            }
        } while (move == 1)
        x++;
    }
    return tbl;
}

/* Just a testing table */
var t = [[1,   1,   0,   1],
         [0,   2,   2,   8],
         [0,   128, 1,   1],
         [2,   0,   1,   4]];

up(t);

它的作用是逐列,从上到下,并检查:

  • 如果有间隙,而其下面的单元格没有,则向上移动单元格
  • 如果两个单元格的编号相同,则如果没有
  • ,则将它们相加
  • 如果经过一个循环(从上到下),上述两种情况均未发生,则移至下一栏

此外,如果您想将其应用于其他三个方向,我建议旋转表格,而不是再做3个以上的功能。如果您无法将其转录为Python,我今晚可以帮助您。

编辑:

在这里,同样的事情,但在Python中:

def up(tbl):
    x = 0
    while (x < len(tbl[0])):
        while True:
            move = 0
            y = 0
            while (y < (len(tbl) - 1)):
                if (tbl[y][x] == 0 and tbl[y + 1][x] != 0):
                    tbl[y][x] = tbl[y + 1][x]
                    tbl[y + 1][x] = 0
                    move = 1
                elif (tbl[y][x] != 0 and tbl[y][x] == tbl[y + 1][x]):
                    tbl[y][x] += tbl[y + 1][x]
                    tbl[y + 1][x] = 0
                    move = 1
                y = y + 1
            if (move == 0):
                break
        x = x + 1
    return tbl

t = [[1,   1,   0,   1],
     [0,   2,   2,   8],
     [0,   128, 1,   1],
     [2,   0,   1,   4]];

up(t)

print('\n'.join([''.join(['{:5}'.format(item) for item in row]) for row in t]))

哦,原来的2048不允许磁贴在同一回合中合并两次,所以你可能想要调整elif以适应它,因为它将它们合并直到它不再存在。