我目前正在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

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


当前回答

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

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

输入:

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]]

其他回答

你可以有一个列表的列表。将元组的元组转换为列表的列表使用:

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

or

level1 = map(list, level1)

并相应地修改它们。

但是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')

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

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'], ...]

从Python 3.5 (PEP 448—Additional Unpacking Generalizations)开始,可以使用以下文字语法将元组转换为列表:

>>> t = (1,2,3)
>>> lst = [*t]
>>> lst
[1, 2, 3]
>>> *lst,  # back to tuple
(1, 2, 3)

列表推导式可用于将元组的元组转换为列表的列表:

>>> 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]
>>> level1_list
[[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]]
>>> *((*row,) for row in level1_list),
((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
True

你有一个元组的元组。 将每个元组转换为列表:

[list(i) for i in level] # list of lists

——或——

map(list, level)

编辑完成后,只需将它们转换回来:

tuple(tuple(i) for i in edited) # tuple of tuples

- OR -(谢谢@jamylak)

tuple(itertools.imap(tuple, edited))

你也可以使用numpy数组:

>>> a = numpy.array(level1)
>>> a
array([[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]])

操纵:

if clicked[0] == 1:
    x = (mousey + cameraY) // 60 # For readability
    y = (mousex + cameraX) // 60 # For readability
    a[x][y] = 1