如何深度复制 pygame 精灵组?
How can I deepcopy a pygame sprite group?
我正在尝试使用 monte carlo 树搜索来实现国际象棋 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
我在网上浏览了一下,但是 none 的回复似乎提供了一种方法,而不是替代方法。
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)
我想要一些方法来更改此代码,使其 returns "Group(1 sprites)",而不是 "Group(0 sprites)"
.copy()
创建一个新组,其中包含与该组相同的精灵,但精灵未(深度)复制。
您可以使用 .remove()
to remove a Sprite from a single pygame.sprite.Group
:
for piece in piece_list_copy:
piece_list.remove(piece)
我正在尝试使用 monte carlo 树搜索来实现国际象棋 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
我在网上浏览了一下,但是 none 的回复似乎提供了一种方法,而不是替代方法。
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)
我想要一些方法来更改此代码,使其 returns "Group(1 sprites)",而不是 "Group(0 sprites)"
.copy()
创建一个新组,其中包含与该组相同的精灵,但精灵未(深度)复制。
您可以使用 .remove()
to remove a Sprite from a single pygame.sprite.Group
:
for piece in piece_list_copy:
piece_list.remove(piece)