我使用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,所以如果实际上有解决方案,我也会更新其他程序。
答案 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
你可能会愚弄调用签名,以及更多的灵活性。
在这种情况下,我将返回精灵数组,以防您以后想要对它们执行某些操作,但我认为如果不需要它则不需要。