我正在使用pygame,尝试创建一个蛇游戏。当蛇已经“吃掉”(在食物之上)时,我无法得到我的代码。
我在课堂上设置了我的蛇,以及食物。
class Snake():
def draw():
for k in Snake.positionList:
pygame.draw.rect(gameDisplay, BLACK, [k[0], k[1], block_size, block_size])
positionList = []
length = 1
direction = 0
class Food():
position = [round(random.randrange(0, display_width - block_size), -1), round(random.randrange(0, display_height - block_size), -1)]
def draw():
pygame.draw.rect(gameDisplay, GREEN, [Food.position[0], Food.position[1], block_size, block_size])
我蛇的第一个“方形”定义如下。它导致浮动。
Snake.positionList.append([display_width / 2, display_height / 2])
我检测蛇是否超出食物的功能是引起错误的代码行TypeError: 'int' object is not subscriptable
def isEating(Snake, Food):
if Snake.positionList[0][0] == Food.position[0][0] and Snake.positionList[0][1] == Food.position[0][1]:
return True
else:
return False
我的困惑如下:Snake.positionList
或Food.position
都没有将数字存储为整数(大概是浮点数)。此外,IDLE中类似的代码片段没有错误。
someList = [[2.5,5.7],[5.8,5.1],[1.0,2.5]]
print(someList[0][0] == someList[2][1])
#prints True
总而言之......我的错误意味着什么(特别是术语'可订阅')以及为什么当没有一个元素是整数时它会发生?
答案 0 :(得分:3)
Subscriptable
表示框中显示的内容:您可以将[0]
这样的下标应用于其中。请注意,这与IndexError不同,在IndexError中,索引将超出范围(例如,在[1,2,3][4]
的情况下)。
您应该打印Snake.positionList
和Food.position
;你会发现他们不会成为一个列表列表(或者外部列表中至少有一个元素是Int,而不是列表)。
(提示:Food.position
是1维)
备注强>
通过直接使用类而不是实例,您似乎有点滥用类作为命名空间的方式。这可能会在以后导致混淆。
您对类的定义也是关闭的:在Python 2中,它将是
class Snake(object):
继承自object
。在Python 3中,它将是
class Snake:
没有括号,因为object
的继承是隐式的(但如果你需要兼容Python 2,Python 2语法是有效且合理的。)