所以我想用python重新创建一个SpaceInvaders游戏。这里是我的外星人的存储位置。
aliens = dict()
每当我们增加游戏等级,就会增加一个新的外星人,以它的ID为键,以它的位置和健康值(每个外星人有2个健康值,在两次射击后死亡,每次造成一个伤害)为值,所以外星人的字典看起来是这样的。
aliens = {
0: [(100, 50), 2],
1: [(50, 200), 1],
etc...
}
现在每当一个异形死亡,我就把它的健康值设置为: -1
并把他的立场设定为 (-100, -100)
把他排除在视野之外,现在问题发生在我调用一个 cleanAlien()
函数,该函数在异形数组中遍历,并弹出每个健康值等于的异形。-1
或一个越界的位置,这里是该函数。
def cleanAliens():
global aliens
for i in range(len(aliens)):
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
aliens.pop(i);
i -= i
但是当我尝试运行这个函数时,我得到了一个错误。
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
KeyError: 0
有什么办法吗?
先谢谢你了。
我不知道为什么会出现这个错误,但似乎这个结构的 aliens
并不是预期的那样。
然而,你可以在字典的键上迭代,而不是像这样在字典的大小上迭代。
for i in list(aliens.keys()):
if aliens[i][0] == (-100, -100) or aliens[i][1] < 0:
aliens.pop(i)
这样你就不会遇到这个键的麻烦。
这个 list(aliens.keys())
返回字典中的键的副本,这样你就可以遍历它,从字典中删除一个键后,你只需继续下一个键。
(顺便说一下,这个 i -= i
行是没有意义的,因为 i
将根据它的迭代器设置下一次迭代,所以你实际上不能改变它的值)
而不是
for i in range(len(aliens)):
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
aliens.pop(i);
i -= i
你应该用 "理解"。
aliens = { k:v for k,v in aliens.items() if v[0] != (-100,100) and v[1] >= 0 }
在收到 "同样的错误 "的评论后进行测试。
>>> aliens = {
... 0: [(100, 50), 2],
... 1: [(50, 200), 1],
... }
>>> aliens = { k:v for k,v in aliens.items() if v[0] != (-100,100) and v[1] >= 0 }
>>>
没有错误。
EDIT:修复了我的错误,通过创建一个列表,其中附加每个键被删除,然后传递给这个函数。
def Aliens():
global aliens
clean = list()
for i in aliens.keys():
if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
clean.append(i)
cleanAliens(clean)
然后传递给这个函数:
def cleanAliens(cleanList):
global aliens
for i in range(len(cleanList)):
aliens.pop(cleanList[i]);