Глубокое копирование 2-мерного архива (доски) со спрайтами на нем - PullRequest
2 голосов
/ 09 мая 2020

В настоящее время я работаю над своим последним проектом в школе, поэтому я делаю игру с помощью pygame. В игре есть доска с базами, колониями и обороной, все это спрайтовые объекты. В проекте нас попросили добавить 2 алгоритма машинного обучения, чтобы один из них был минимаксным. как вы, наверное, знаете, чтобы использовать минимакс, вам нужно copy.deepcopy доску пару раз и вычислить значение huristi c каждой платы и найти лучшие доски при максимальном значении и худшие при минимальном.

Проблема, с которой я столкнулся, заключается в том, что copy.deepcopy, вероятно, не может работать с объектом, имеющим атрибуты спрайта. Это сообщение об ошибке, которое появляется:

TypeError: не удается обработать объекты pygame.Surface

, и он обращается к этой строке в моем коде:

b = copy.deepcopy (Board)

Я действительно не знаю, что делать в этой ситуации, я не могу go вернуться и заменить плату, потому что У меня около 1700 строк кода + готовая графика, и изменение всех объектов на объекты без спрайтов - это слишком много. так что мне очень нужна ваша помощь, нужно понять это, чтобы продолжить

вот пример одной строки на доске в начале игры; просто чтобы помочь вам понять, о чем я говорю:

[Нет, «<» Спрайт колонии (в 2 группах) «>», Нет, Нет, Нет, Нет, Нет, Нет, None, None, None, None, None, None, None, None, None, None, "<" спрайт колонии (в 2 группах) ">", 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)

1 Ответ

0 голосов
/ 09 мая 2020

Если вы не хотите или не можете отделить необходимое игровое состояние от кода рисования (он же спрайты), простое решение - сохранить путь к изображению в ваших спрайтах:

...
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__, чтобы предотвратить функцию deepcopy от попытки скопировать атрибут image; вы читали об этом, например, здесь и здесь (но вам нужно будет загрузить изображение после копирования).

Используйте все, что вам подходит.

...