如何创建对象,然后在循环中将方法应用于它们

Geo*_*cox 3 python variables pygame object python-3.x

我使用pygame在python中创建了一个noughts和crosses的版本,完成的游戏结果比预期好得多,我对它很满意.但是,代码似乎非常混乱,我想稍微清理一下.为了使代码工作,我创建了9个我编写的精灵类的对象.但是每当我需要对它们应用一个方法时,我必须将相同的行写出九次,只有一个数字不同.为了解决这个问题,我想知道我是否可以为九个对象中的每个对象运行相同的脚本.该程序首先创建对象:

board_0 = classes.sprite.Sprite(x = 250, y = 200)
board_0.set_image('board.png')
board_1 = classes.sprite.Sprite(x = 350, y = 200)
board_1.set_image('board.png')
board_2 = classes.sprite.Sprite(x = 450, y = 200)
board_2.set_image('board.png')
board_3 = classes.sprite.Sprite(x = 250, y = 300)
board_3.set_image('board.png')
board_4 = classes.sprite.Sprite(x = 350, y = 300)
board_4.set_image('board.png')
board_5 = classes.sprite.Sprite(x = 450, y = 300)
board_5.set_image('board.png')
board_6 = classes.sprite.Sprite(x = 250, y = 400)
board_6.set_image('board.png')
board_7 = classes.sprite.Sprite(x = 350, y = 400)
board_7.set_image('board.png')
board_8 = classes.sprite.Sprite(x = 450, y = 400)
board_8.set_image('board.png')
Run Code Online (Sandbox Code Playgroud)

是否可以使用for循环来创建这些只需几行而不是这里需要的十八行.同样的解决方案有望在代码的其他地方工作,我有两个部分,每个对象重复九次:

if board_0.mouse_hover() and grid[0] == 0:
        if   turn == 0: board_0.set_image('cross.png')
        elif turn == 1: board_0.set_image('nought.png')
    else:
        if grid[0] == 0:  board_0.set_image('board.png')

if board_0.mouse_click() and grid[0] == 0:
    if  turn == 0:
        board_0.set_image('cross.png')
        grid[0] = 'X'
        turn = 1
    elif turn == 1:
        board_0.set_image('nought.png')
        grid[0] = 'O'
        turn = 0
Run Code Online (Sandbox Code Playgroud)

对于那些想知道我grid在代码开头设置的人:grid = [0, 0, 0, 0, 0, 0, 0, 0, 0]那么可以做些什么来实现我想要的结果,我相信我过去曾经遇到过这个问题,但我不知道Stack Overflow那么所以如果实际上有解决方案的话,我也会更新其他一些程序.

Ohj*_*eah 5

您可以使用列表推导并迭代您的参数来创建Sprite的所有实例.

from itertools import product

x_coords = [250, 350, 450]
y_coords = [200, 300, 400]

boards = [classes.sprite.Sprite(x=x, y=y) for x, y in product(x_coords, y_coords)]

for board in boards:
    board.set_image('board.png')
Run Code Online (Sandbox Code Playgroud)

board_0因此成为boards[0].使用itertools.product只是写出你的示例中的x,y对的简短.

  • 你也必须改变'y`坐标. (2认同)