深度复制带有精灵的二维阵列(板)

2024-06-10 09:34:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在学校做最后一个项目,所以我正在用pygame制作一个游戏。 游戏包括一个带有基地、殖民地和防御的棋盘,所有这些都是精灵对象。 在这个项目中,我们被要求添加两个机器学习算法,其中一个是minimax。 您可能知道,要使用minimax,您需要copy.deepcopy对电路板进行几次操作,计算每个电路板的huristic值,并在max时找到最好的电路板,在min时找到最差的电路板

我面临的问题是一个简单的事实copy.deepcopy可能无法对具有sprite属性的对象进行操作。 这是显示的错误消息:

TypeError: can't pickle pygame.Surface objects

它在我的代码中指向这一行:

b = copy.deepcopy(Board)

我真的不知道在这种情况下该怎么办,我不能回去换板子,因为我有大约1700行代码+完成的图形,把所有对象改成非精灵对象实在是太多了。 所以我真的需要你的帮助,我得想办法继续下去

下面是一个例子,在游戏开始时,棋盘上只有一行;只是想让你明白我在说什么:

[None, "<"Colony sprite(in 2 groups)">", None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, "<"Colony sprite(in 2 groups)">", None]

殖民地类的示例,最后一段与精灵相关的代码:

class Colony(pg.sprite.Sprite):
    def __init__(self, x, y, clan, type):
        self.clan = clan
        if self.clan == 1:
            name = "joogadars"
        else:
            name = "klagars"
        self.type = type
        if type == 1:
            type_name = "doorks"
        else:
            type_name = "gorgs"
        self.lvl = 1
        self.attackable = True

        self.rates = array_from_txt_colonies("Colonies Data.txt", self.type, 'Rates')
        self.prices = array_from_txt_colonies("Colonies Data.txt", self.type, 'Prices')
        self.hps = array_from_txt_colonies("Colonies Data.txt", self.type, 'Hps')
        self.hp = self.hps[self.lvl - 1]
        self.rate = self.rates[self.lvl - 1]

        self.position = (x, y)
        full_name = type_name + '/' + name + '/' + name + " " + type_name + " colony lvl " + str(self.lvl) + " use.png"
        pg.sprite.Sprite.__init__(self)
        img = 'C:/Users/ariel/Desktop/Ariel/12th/Python/final proj/graphics/islands/colonies/' + full_name
        self.image = pg.image.load(img)
        self.rect = self.image.get_rect(center=self.position)

Tags: 对象nameselftxtnone游戏type精灵
1条回答
网友
1楼 · 发布于 2024-06-10 09:34:51

如果您不想或无法将所需的游戏状态与绘图代码(也称为精灵)分离,一个简单的解决方案是将图像路径存储在精灵中:

...
self.position = (x, y)
full_name = type_name + '/' + name + '/' + name + " " + type_name + " colony lvl " + str(self.lvl) + " use.png"
pg.sprite.Sprite.__init__(self)
self.img = 'C:/Users/ariel/Desktop/Ariel/12th/Python/final proj/graphics/islands/colonies/' + full_name
self.image = pg.image.load(self.img)
self.rect = self.image.get_rect(center=self.position)
...

然后在尝试复制精灵之前,移除图像,并在复制后重新加载;大概是这样的:

for sprite in Board.sprites:
    sprite.image = None

b = copy.deepcopy(Board)

for sprite in Board.sprites:
    sprite.image = pygame.load(sprite.img)

for sprite in b.sprites:
    sprite.image = pygame.load(sprite.img)

你会明白的。此外,您可能还应该缓存映像,这样就不必每次都从磁盘加载它们

另一种方法是实现^{},以防止deepcopy函数尝试复制image属性;您阅读了有关它的信息,例如herehere(但您必须在复制后加载图像)

使用任何适合你的东西

相关问题 更多 >