1

我正在尝试构建一个简单的 tilemap thingy,作为一个更大项目的一部分,我提出的解决方案之一是使用这样的函数:

def tile((value, X, Y)):
    if value == 1:
        pygame.draw.rect(screen, (0, 0, 0) (X, Y, 64, 64), 0)

我的想法是我将级别设置为一个元组列表,其中包含一个值,该值表示要在此处绘制的图块,然后是该图块的坐标。

当然,这不起作用,因为您不能使用元组作为参数。

我对此的解决方案是从列表中的元组中获取值:

def tile(value, X, Y):
    if value == 1:
        pygame.draw.rect(screen, (0, 0, 0) (X, Y, 64, 64), 0)


level = [(1, 0, 0), (rest of list)]
tile(level[0[0]], level[0[1]], level[0[2]])

哪个没用,给了我

Traceback (most recent call last):
tile(level[0[0]], level[0[1]], level[0[2]])
TypeError: 'int' object has no attribute '__getitem__'

有没有人有解决方法?我可以通过某种方式将元组作为一系列参数输入函数?或者我只是在使用一种永远不会奏效的完全特殊的方法?我猜这只是由于我的盲目无能,尽管我想被告知其他情况。

Python 2.7,pygame 1.9

4

4 回答 4

1

您对处理任务的最佳方式有一个答案,但是您执行此操作方式的具体问题是您需要做level[0][0]等,而不是level[0[0]].

于 2013-08-28T17:31:39.967 回答
1

您遇到的错误可以通过更改来解决:

tile(level[0[0]], level[0[1]], level[0[2]])

对此:

tile(level[0][0], level[0][1], level[0][2])

你只是把括号放在错误的地方。

另一个注意事项:您可以使用元组作为函数的参数,如下所示:

def tile((value, X, Y)):
    if value == 1:
        pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0)

就像您在原始示例中所做的那样。然后将其余代码简化为:

level = [(1, 0, 0), (rest of list)]
tile(level[0])
于 2013-08-28T17:35:03.280 回答
0

当你这样调用时,你需要解压你的元组:

tile(*level[0])
于 2013-08-28T17:28:39.247 回答
0

你当然可以将一个元组传递给一个函数,你的第一次尝试应该工作得很好:

def tile((value, X, Y)):
  if value == 1:
    pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0) # Note typo: missing comma
level = [(1, 0, 0), (1, 10, 10), (1, 42, 99)]
for x in level:
    tile(x)

如果你想同时通过所有的瓷砖,你也可以这样做。只需将for循环移动到您的函数中:

def tile(l):
  for value, X, Y in l:
    if value == 1:
      pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0)
level = [(1, 0, 0), (1, 10, 10), (1, 42, 99)]
tile(level)

最后,如果您不想在函数中接受元组,但希望将数据保存在元组中,这也是一种选择。使用*运算符:

def tile(value, X, Y):
    if value == 1:
      pygame.draw.rect(screen, (0, 0, 0), (X, Y, 64, 64), 0)
level = [(1, 0, 0), (1, 10, 10), (1, 42, 99)]
for x in level:
    tile(*x)
于 2013-08-28T17:57:13.957 回答