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()