我目前正在编程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的翻转方向,然后包含所需的翻转次数。可能需要了解其他知识才能理解该解释。
答案 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()