gpt4 book ai didi

python - 为什么我的 pygame.group 在循环中具有空值?

转载 作者:行者123 更新时间:2023-12-01 08:19:46 25 4
gpt4 key购买 nike

我目前正在编写 othello 的 pygame 版本。我尝试实现一个函数“flip_piece”,它将单个片段从白色翻转为黑色,反之亦然。然而,它涉及到找到要翻转的棋子,在这样做时,我必须循环遍历我的棋子列表,然后尽管我已经填充了它,但它返回一个空值。

这是为什么?我可以采取什么措施来解决它?

import pygame

white = (255, 255, 255)
black = (0, 0, 0)


class Piece(pygame.sprite.Sprite):
def __init__(self, colour, x, y):
super().__init__()
self.colour = colour
self.x = x
self.y = y


def set_up_pieces(piece_list):
s = Piece(white, 4, 4)
piece_list.add(s)
s = Piece(black, 5, 4)
piece_list.add(s)
s = Piece(white, 5, 5)
piece_list.add(s)
s = Piece(black, 4, 5)
piece_list.add(s)
return piece_list


def flip_piece(piece_list, move, i, flip, player):
for p in piece_list:
if p.x == move[0] + (i + 1) * flip[0] and p.y == move[1] + (i + 1) * flip[1]:
new_piece = Piece(player, p.x, p.y)
piece_list.add(new_piece)
piece_list.remove(p)
return piece_list


def main():
piece_list = pygame.sprite.Group()
piece_list = set_up_pieces(piece_list)
player_to_move = white
# this simulates a move
move = [5, 3]
new_piece = Piece(player_to_move, move[0], move[1])
piece_list.add(new_piece)
flip = [-1, 0, 2]
for i in range(flip[2]):
piece_list = flip_piece(piece_list, move, i, flip, player_to_move)


main()

注意:翻转变量包含 x、y 的翻转方向,以及所需的翻转次数。可能需要了解奥赛罗知识才能理解该解释。

最佳答案

piece_list 正在变为 None,因为它被设置为 flip_piece() 的输出:

...
def flip_piece(piece_list, move, i, flip, player):
for p in piece_list:
if p.x == move[0] + (i + 1) * flip[0] and p.y == move[1] + (i + 1) * flip[1]:
new_piece = Piece(player, p.x, p.y)
piece_list.add(new_piece)
piece_list.remove(p)
return piece_list
...
def main():
...
for i in range(flip[2]):
piece_list = flip_piece(piece_list, move, i, flip, player_to_move)
...

问题是flip_piece()返回列表piece_list()如果至少有一项被修改。这是因为 return 语句位于 if 语句内部,因此调用 Flip_piece 时最多只能修改一个片段。

但是,如果没有翻转棋子,则不会返回piece_list。在Python中,如果没有return语句,函数将返回一个None对象。正是这个对象创建了错误消息。

根据黑白棋规则(以及对代码功能的一些理解),我相信您的函数应该如下所示:

def flip_piece(piece_list, move, i, flip, player):
for p in piece_list:
if p.x == move[0] + (i + 1) * flip[0] and p.y == move[1] + (i + 1) * flip[1]:
new_piece = Piece(player, p.x, p.y)
piece_list.add(new_piece)
piece_list.remove(p)
return piece_list
return piece_list

这将使始终存在返回列表,并解决问题。

但是 pygame.sprite.Group() 是一个可变对象。这意味着当您在 flip_piece() 中向 piece_list 添加或删除时,该变量已在 main() 中更新。因此,您可以通过不返回任何内容来简化代码。

这是您的代码的完整版本。

import pygame

white = (255, 255, 255)
black = (0, 0, 0)


class Piece(pygame.sprite.Sprite):
def __init__(self, colour, x, y):
super().__init__()
self.colour = colour
self.x = x
self.y = y


def set_up_pieces(piece_list):
s = Piece(white, 4, 4)
piece_list.add(s)
s = Piece(black, 5, 4)
piece_list.add(s)
s = Piece(white, 5, 5)
piece_list.add(s)
s = Piece(black, 4, 5)
piece_list.add(s)
return piece_list


def flip_piece(piece_list, move, i, flip, player):
for p in piece_list:
if p.x == move[0] + (i + 1) * flip[0] and p.y == move[1] + (i + 1) * flip[1]:
new_piece = Piece(player, p.x, p.y)
piece_list.add(new_piece)
piece_list.remove(p)
return

def main():
piece_list = pygame.sprite.Group()
piece_list = set_up_pieces(piece_list)
player_to_move = white
# this simulates a move
move = [5, 3]
new_piece = Piece(player_to_move, move[0], move[1])
piece_list.add(new_piece)
flip = [-1, 0, 2]
for i in range(flip[2]):
flip_piece(piece_list, move, i, flip, player_to_move)


main()

关于python - 为什么我的 pygame.group 在循环中具有空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54724303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com