Почему моя pygame.group имеет нулевое значение, когда она находится в цикле? - PullRequest
0 голосов
/ 16 февраля 2019

Я сейчас программирую версию Ogello для 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, а затем количество требуемых переворотов.Для понимания этого объяснения может потребоваться знание Отелло.

1 Ответ

0 голосов
/ 16 февраля 2019

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 () является изменяемым объектом.Это означает, что когда вы добавляете или удаляете из piece_list в flip_piece(), переменная уже обновляется в 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...