我目前正在pygame中为一款游戏制作地图编辑器,使用tile地图。 关卡是由以下结构中的块构建而成的(尽管要大得多):

level1 = (
         (1,1,1,1,1,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,0,0,0,0,1)
         (1,1,1,1,1,1))

其中“1”是一堵墙,“0”是一个空的空气。

下面的代码基本上是处理块类型变化的代码:

clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
    currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1

但由于关卡存储在元组中,我无法更改不同块的值。我如何以简单的方式改变关卡中的不同值?


当前回答

在我的例子中,我想合并行/列表:

a = ['Tom', 'Dick', 'Harry']
b = ['20', '32', '14']
c = ['foo', 'bar', 'blah']
lines = [list(row) for row in zip(a, b, c)]
lines = [['Tom', '20', 'foo'], ...]

其他回答

仅仅使用命令列表对我来说不起作用。

如果你有一个元组,只需迭代,直到你有必要的元素,然后追加到一个列表。如果你进入元素级别,你可以很容易地改变它。

输入:

level1 = (
         (1,1,1,1,1,1),
         (1,0,0,0,0,1),
         (1,0,0,0,0,1),
         (1,0,0,0,0,1),
         (1,0,0,0,0,1),
         (1,1,1,1,1,1))

level1_as_list=[]
for i in level1:
    inside_list=[]
    for j in i:
        inside_list.append(j)
    level1_as_list.append(inside_list)

print(level1_as_list)enter code here

输出:

[[1, 1, 1, 1, 1, 1], [1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1]]

将元组转换为列表

(给定问题中元组之间缺少逗号,是为了防止错误消息而添加的)

方法1:

level1 = (
     (1,1,1,1,1,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,0,0,0,0,1),
     (1,1,1,1,1,1))

level1 = [list(row) for row in level1]

print(level1)

方法2:

level1 = map(list,level1)

print(list(level1))

方法1花费了——0.0019991397857666016秒——

方法2花费了——0.0010001659393310547秒——

如果您只使用一个列表而不是列表的列表,您可以极大地加快您的工作速度。当然,这只有在所有内部列表都具有相同大小的情况下才有可能(在您的示例中确实如此,所以我只是假设)。

WIDTH = 6
level1 = [ 1,1,1,1,1,1,
           1,0,0,0,0,1,
           1,0,0,0,0,1,
           1,0,0,0,0,1,
           1,0,0,0,0,1,
           1,1,1,1,1,1 ]
print level1[x + y*WIDTH]  # print value at (x,y)

如果你使用位域而不是列表,你会更快:

WIDTH = 8  # better align your width to bytes, eases things later
level1 = 0xFC84848484FC  # bit field representation of the level
print "1" if level1 & mask(x, y) else "0"  # print bit at (x, y)
level1 |= mask(x, y)  # set bit at (x, y)
level1 &= ~mask(x, y)  # clear bit at (x, y)

with

def mask(x, y):
  return 1 << (WIDTH-x + y*WIDTH)

但这只适用于字段只包含0或1的情况。如果你需要更多的值,你就必须组合几个比特,这将使问题变得更加复杂。

两个答案都很好,但有一点建议:

元组是不可变的,这意味着它们不能被更改。所以如果需要操作数据,最好将数据存储在列表中,这样会减少不必要的开销。

在您的例子中,提取数据到一个列表中,如eumiro所示,并在修改后创建一个与Schoolboy给出的answer结构相似的类似元组。

另外,根据建议,使用numpy数组是更好的选择

将元组转换为列表:

>>> t = ('my', 'name', 'is', 'mr', 'tuple')
>>> t
('my', 'name', 'is', 'mr', 'tuple')
>>> list(t)
['my', 'name', 'is', 'mr', 'tuple']

将列表转换为元组:

>>> l = ['my', 'name', 'is', 'mr', 'list']
>>> l
['my', 'name', 'is', 'mr', 'list']
>>> tuple(l)
('my', 'name', 'is', 'mr', 'list')