如何深层复制pygame sprite组?

时间:2019-08-14 18:46:00

标签: python pygame copy sprite deep-copy

我正在尝试使用蒙特卡洛树搜索来实现国际象棋AI。这需要从每个位置玩800个随机游戏来评估每个动作的价值。但是,我使用的是pygame精灵组来保存碎片的实例,然后循环遍历以查找该位置中每一碎片的可能移动。 当我拿一块时,我使用.kill()函数,否则我将以我的legal_moves()函数结束,从已拿出的块中返回动作。但是,当在搜索中使用它时,它也会杀死游戏中的棋子,我不希望这样做。

我尝试使用内置复制功能,但这只是一个浅表复制。我尝试了copy.deepcopy(piece_list),但这给出了一条错误消息:

File "C:\Users\Sean\PycharmProjects\Chess\Monte_Carlo_Tree_Search.py", line 339, in run_mcts
exploration_game = copy.deepcopy(game)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py",  line 180, in deepcopy
y = _reconstruct(x, memo, *rv)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py",  line 280, in _reconstruct
state = deepcopy(state, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py",  line 150, in deepcopy
y = copier(x, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py",  line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py",  line 180, in deepcopy
y = _reconstruct(x, memo, *rv)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 180, in deepcopy
y = _reconstruct(x, memo, *rv)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 280, in _reconstruct
state = deepcopy(state, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 150, in deepcopy
y = copier(x, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 240, in _deepcopy_dict
y[deepcopy(key, memo)] = deepcopy(value, memo)

File "C:\Users\Sean\AppData\Local\Programs\Python\Python37-32\lib\copy.py", line 169, in deepcopy
rv = reductor(4)

TypeError: can't pickle pygame.Surface objects

我已经在网上浏览了一下,但是没有一个回应似乎提供了一种替代方法。

import pygame

knight = pygame.sprite.Sprite()
piece_list = pygame.sprite.Group()
piece_list.add(knight)

piece_list_copy = piece_list.copy()

for piece in piece_list_copy:
    piece.kill()

print(piece_list)

我想要一些更改此代码的方法,以使其返回“ Group(1 sprites)”,而不是“ Group(0 sprites)”

1 个答案:

答案 0 :(得分:2)

.copy()创建一个新组,该组包含与该组相同的sprite,但是sprite不被(深层)复制。

您可以使用.remove()从单个pygame.sprite.Group删除Sprite:

for piece in piece_list_copy:
    piece_list.remove(piece)
相关问题