【问题标题】:How can I deepcopy a pygame sprite group?如何深度复制 pygame 精灵组?
【发布时间】:2019-08-14 18:46:00
【问题描述】:

我正在尝试使用蒙特卡罗树搜索来实现国际象棋 AI。这需要从每个位置玩 800 场随机游戏来评估每一步的价值。但是,我使用 pygame sprite 组来保存棋子的实例,然后我循环遍历以查找该位置中每个棋子的可能移动。 当我拿一块时,我会使用 .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)”

【问题讨论】:

  • 刚刚意识到,在错误示例中,我试图对整个游戏对象进行深度复制...单独进行操作我得到了相同的结果。

标签: python pygame copy sprite deep-copy


【解决方案1】:

.copy() 创建一个新组,其中包含与组相同的精灵,但精灵不会(深度)复制。

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

for piece in piece_list_copy:
    piece_list.remove(piece)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多