无法弄清楚如何从 Pygame 中的列表中选择随机图像及其矩形

Cannot figure out how to choose a random image AND its rect from a list in Pygame

希望就 Pygame 中的某个问题获得一些帮助。我试图用随机遭遇填充网格,由他们的图像(暴徒、陷阱、战利品等)显示,但是我不知道如何在列表中列出图像及其矩形。

当我按下一个按钮时,我设法显示并用随机图像填充网格,但是我需要这些图像的矩形,以便我可以检测与我的 player_img 的碰撞。当我预先设置一个遇到的 Rect 并从 'itself' 列表中选择它时,当这个 Rect 与我的 player_img Rect 发生碰撞时,我可以打印 'collision'。对于网格的特定正方形,图像将始终具有相同的 Rect,但是如果网格始终以相同的方式填充,则它显然违背了 'random encounters' 的目的。

这是选择随机图像并将其显示在网格正方形内的代码,但是该图像没有矩形。

display_surface.blit(random.choice(square2_list), (416, 592))

这段代码仅从其本身的列表中选择一个图像,这样我就可以拥有那个特定遭遇的 Rect,因此可以检查碰撞。但是正如我之前所说,我希望这些遭遇随机出现在网格上,而不是每次都出现在同一个位置。

display_surface.blit(random.choice(square2_list), mob1Rect)

我的方格 2 的遭遇列表如下所示:

square2_list = [mob1_img, event_img, blank_img, trap_img, loot_img]

我尝试在定义每个 Rect 后像这样格式化列表,但遇到错误:

square2_list = [(mob1_img, mob1Rect), (event_img, eventRect), (blank_img, blankRect), (trap_img, trapRect), (loot_img, lootRect)]

我希望我说得有点道理,如果有人能提供任何帮助,我们将不胜感激!

如果您有一个元组列表,random.choice 将 return 一个元组。可以使用 built-in zip 函数创建元组列表:

images = [mob1_img, event_img, blank_img, trap_img, loot_img]
rects = [mob1Rect, eventRect, blankRect, trapRect, lootRect]
square2_list = zip(images, rects)
random_image, random_rect = random.choice(square2_list)
display_surface.blit(random_image, random_rect)  

元组也可以使用 asterisk (*) operator:

解压缩
display_surface.blit(*random.choice(zip(images, rects)))

或者,您也可以通过其索引 select 随机元素:

random_index = random.randrange(len(images))
display_surface.blit(images[random_index], rects[random_index])