为什么我的pygame.group处于循环状态时具有空值?

时间:2019-02-16 14:53:44

标签: python python-3.x pygame

我目前正在编程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()

注意:flip变量包含x,y的翻转方向,然后包含所需的翻转次数。可能需要了解其他知识才能理解该解释。

1 个答案:

答案 0 :(得分:0)

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对象。正是该对象创建了错误消息。

根据奥赛罗(Othello)的规则(以及对代码功能的一些理解),我相信您的函数应该看起来像这样:

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()是可变对象。这意味着,当您在piece_list的{​​{1}}中进行添加或删除时,该变量已经在flip_piece()中进行了更新。因此,您可以通过不返回任何内容来简化代码。

这是您代码的完整版本。

main()