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

时间:2017-03-15 19:38:28

标签: python python-3.x variables object pygame

我使用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')

是否可以使用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

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

2 个答案:

答案 0 :(得分: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')

board_0因此变为boards[0]。使用itertools.product只是写出你的例子中的x,y对。

答案 1 :(得分:3)

所以我注意到你说“应用方法”,但你真正在做的是在一个类型的实例上调用一个方法。

您可以尝试这样的事情:

config.extraPlugins = 'uploadimage';
config.imageUploadUrl = '/uploader/upload.php?type=Images';

editor.on( 'fileUploadRequest', function( evt ) {
    var fileLoader = evt.data.fileLoader,
        formData = new FormData(),
        xhr = fileLoader.xhr;

    xhr.open( 'PUT', fileLoader.uploadUrl, true );
    formData.append( 'upload', fileLoader.file, fileLoader.fileName );
    fileLoader.xhr.send( formData );

    // Prevented the default behavior.
    evt.stop();
}, null, null, 4 ); // Listener with a priority 4 will be executed before priority 5.

然后稍后再调用此函数:

def set_my_sprites(x_start, y_start) sprites = [] for y_mx in range(1, 4): for x_mx in range(1, 4): board_x = classes.sprite.Sprite(x = x_start*x_mx, y = y_start*y_mx) board_x.set_image('board.png') sprites.append(board_x) return sprites

你可能会愚弄调用签名,以及更多的灵活性。

在这种情况下,我将返回精灵数组,以防您以后想要对它们执行某些操作,但我认为如果不需要它则不需要。