让我向您展示可能有助于使这个问题更有意义的代码。
import pygame, classes, random
pygame.init()
screen = pygame.display.set_mode((640, 480))
def game():
pygame.display.set_caption("GOLOGO")
laser = classes.Laser(screen)
player = classes.Player(laser, screen)
bad = classes.BadGuy(screen, 320, 0)
bad1 = classes.BadGuy(screen, 260, 0)
bad2 = classes.BadGuy(screen, 200, 0)
bad3 = classes.BadGuy(screen, 140, 0)
bad4 = classes.BadGuy(screen, 80, 0)
bad5 = classes.BadGuy(screen, 20, 0)
bad6 = classes.BadGuy(screen, 380, 0)
bad7 = classes.BadGuy(screen, 440, 0)
bad8 = classes.BadGuy(screen, 440, 60)
bad9 = classes.BadGuy(screen, 320, 60)
bad10 = classes.BadGuy(screen, 260, 60)
bad11 = classes.BadGuy(screen, 200, 60)
bad12 = classes.BadGuy(screen, 140, 60)
bad13 = classes.BadGuy(screen, 80, 60)
bad14 = classes.BadGuy(screen, 20, 60)
bad15 = classes.BadGuy(screen, 380, 60)
space = classes.Space(screen)
scoreboard = classes.Scoreboard()
allSprites = pygame.sprite.OrderedUpdates(space, laser, player)
badSprites = pygame.sprite.Group(bad, bad1, bad2, bad3, bad4, \
bad5, bad6, bad7, bad8, bad9, bad10, bad11, bad12, \
bad13, bad14, bad15)
scoreSprite = pygame.sprite.Group(scoreboard)
正如你所看到的,有许多BadGuy精灵。他们只是在不同的位置。我不介意继续这样做,但我希望有一个更简单的方法来做到这一点。我可能会在增加屏幕大小的同时添加更多。我正在使用 python 3和pygame
答案 0 :(得分:1)
这是一个经典案例,列表可以提供帮助。
例如:
bad_guys = []
bad_guys.append(classes.BadGuy(screen, 320, 0))
bad_guys.append(classes.BadGuy(screen, 260, 0))
bad_guys.append(classes.BadGuy(screen, 200, 0))
# ... and so on ...
现在你可以通过索引来引用一个特定的坏人:
bad_guys[0] # looks up the first bad guy, the one at (320, 0)
但请注意,我们在这里有很多重复。我们总是使用BadGuy
类来制作一个坏人,我们总是将screen
作为参数传递。
我们可以拉出那些坐标值,列出它们,然后循环制作坏人:
coords = [
(320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0), (440, 0),
(440, 0), (320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0),
]
bad_guys = []
for x, y in coords:
bad_guys.append(classes.BadGuy(screen, x, y))
我们必须构建的坐标列表,但现在可以通过for
循环构建坏人列表。
但是Python提供了一个我们可以用来构建bad_guys
列表的捷径。我们可以使用“列表理解”来构建没有明确for
循环的坏人列表:
coords = [
(320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0), (440, 0),
(440, 0), (320, 0), (260, 0), (200, 0), (140, 0), (80, 0), (20, 0), (380, 0),
]
bad_guys = [classes.BadGuy(screen, x, y) for x, y in coords]
处理创建坏人名单。
现在我们有了这个列表,我们需要和所有坏人一起调用pygame.sprite.Group()
。我们可以手工完成:
badSprites = pygame.sprite.Group(bad_guys[0], bad_guys[1], ... and so on ...)
但有更好的方法。在Python中,我们可以使用*
运算符来“粘贴”列表或元组中的值:
badSprites = pygame.sprite.Group(*bad_guys)
现在bad_guys
列表中有多少坏人并不重要;无论有多少,它们都将作为pygame.sprite.Group()
的参数传递。
编辑:更改代码以将值存储为坐标(x
和y
)。我不确定“坏人数”是什么,但我很确定@alKid是正确的,他们是坐标。目前,所有y
值均为0但可能会更改,因此请同时存储x
和y
值。
答案 1 :(得分:1)
您可以将值存储在列表中:
coordinates = [(320, 0), (260, 0), (200, 0), ...]
在创建它时循环遍历它们。您可以将实例放在字典中:
badGuys = {}
for i, v in enumerate(coordinates):
badGuys["bad%d"%i] = classes.BadGuy(screen, *v)
希望这有帮助!