我正在尝试构建一个简单的tilemap,作为一个更大的项目的一部分,我提出的解决方案之一是使用这样的函数:
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
答案 0 :(得分:1)
您对处理任务的最佳方式有一个答案,但您执行此操作的具体问题是您需要执行level[0][0]
等,而不是level[0[0]]
。< / p>
答案 1 :(得分: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])
答案 2 :(得分:0)
当你这样打电话时,你需要打开你的元组:
tile(*level[0])
答案 3 :(得分: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)