为什么';Python每次通过循环时是否执行函数?

为什么';Python每次通过循环时是否执行函数?,python,loops,pygame,Python,Loops,Pygame,我写了这个脚本,创建了一个灰色的方块,它向左移动并在某个点停止,创建了一个红色的方块,它无限期地向右移动。目前它只制作一个正方形 在我看来(我是一个乞丐),下面的脚本部分是在一个循环中,所以每次计算机通过循环时,它都应该创建一个新的灰色正方形,直到总共有15个正方形。为什么不呢 (顺便说一句,德国人是灰色正方形) 有没有办法让它在不复制和粘贴115次的情况下,用不同的y值执行115个不同版本的函数?因为这将是一场噩梦。每次通过循环,你都会产生一个新的士兵。事实上,因为您从未更改德国帐户或俄罗斯帐

我写了这个脚本,创建了一个灰色的方块,它向左移动并在某个点停止,创建了一个红色的方块,它无限期地向右移动。目前它只制作一个正方形

在我看来(我是一个乞丐),下面的脚本部分是在一个循环中,所以每次计算机通过循环时,它都应该创建一个新的灰色正方形,直到总共有15个正方形。为什么不呢

(顺便说一句,德国人是灰色正方形)


有没有办法让它在不复制和粘贴115次的情况下,用不同的y值执行115个不同版本的函数?因为这将是一场噩梦。

每次通过循环,你都会产生一个新的士兵。事实上,因为您从未更改德国帐户或俄罗斯帐户,所以您不仅更改了15次,而且永远都不会更改。每一次,你都会用白色覆盖现有的士兵,抹掉他们,然后永远产生一个新的德国人和一个新的俄罗斯人(尽管最终他们会离开屏幕边缘,所以你看不到他们)

我想你想写一个函数来画士兵:

def draw_soldier(rect, colour):
    pygame.draw.rect(gameDisplay, colour, rect)
然后,在您的帧循环中,在用一片像斯大林格勒冬天一样的白雪擦除整个屏幕后,每次添加一个新的矩形,然后重新绘制所有矩形:

# When the game starts, there are no soldiers
germans = []
russians = []

while not game_exit:
    gameDisplay.fill(white)

    # Each time through the loop, add another soldier to each
    # side until they're full
    if len(germans) < germancount:
        germans.append([german_startx, german_starty, german_width, german_height])
        german_startx += german_speed
    if len(russians) < russiancount:
        russians.append([russian_startx, russian_starty, russian_width, russian_height])
        russian_startx += russian_speed

    # Now draw all the soldiers in front of that white fill
    for german in germans:
        draw_soldier(german, grey)
    for russian in russians:
        draw_soldier(russian, red)

    pygame.display.update()
    clock.tick(60)
#游戏开始时,没有士兵
德国人=[]
俄罗斯人=[]
不退出游戏时:
游戏显示。填充(白色)
#每次通过循环时,在每个循环中添加另一名士兵
#边吃边吃,直到吃饱为止
如果len(德国人)
德国人是灰色正方形吗?我想不是。毕竟,他们中的许多人都很时髦,如果真的是灰色的话,那么最糟糕的情况是,他们是灰色的超级酷人,而不是灰色的正方形。有没有可能,他们创造的是你想要的,但每次循环开始时,你都用白色填充
游戏显示屏,因此看不到其他人?顺便说一句,你永远不会增加你的
germancount。
尝试在
spawn\u soldier
中添加
print
语句以进行调试。每次通过循环,你都会产生一个新士兵。事实上,你永远都在这样做。你用白雪覆盖现有的士兵,抹掉他们,然后产生一个新的德国人和一个新的俄罗斯人,直到永远(尽管最终他们离开了屏幕的边缘,所以你看不到他们)。是的,我刚刚意识到。如果我加上士兵的数量,15帧后就消失了。因为它只是重新画出来的。这不是我想要的方式。我将不得不有一个不同的代码行每平方米,但我想要数百万不同的平方米。有什么帮助吗?我可以让它以某种方式在我的“繁殖士兵”函数上迭代吗?@tgmjack PyGame的诀窍是,你必须从每一帧的角度来思考你所做的事情。如果每帧都将整个屏幕绘制为白色,则必须在显示帧之前绘制所有人和所有内容。无论你做什么(比如添加上次没有的新士兵)都是在“绘制所有内容”代码的基础上。我不确定这部分该怎么办35;如果是len(德国人)#我想我需要将列表1到15,然后以某种方式为列表中的每个元素指定不同的德语,但我很挣扎。sorry@tgmjack我有点猜测你想做什么,但是…想法是你在开始时,在进入主循环之前,创建
德国人=[]
俄罗斯人=[]
。然后,每帧一次。你再加上一个德语和一个俄语,直到每一个都够了为止。(在那之后…循环将不会做任何有用的事情,你只会看到他们面对面,一动不动,直到你感到厌烦并退出程序。但是如果你模拟的是第一次世界大战,那不是一个非常真实的模拟…)我将编辑答案以使其更清楚。
            spawn_soldier_1(german_startx, german_starty, german_width, 
            spawn_soldier_2(german_startx, german_starty, german_width, 
            spawn_soldier_3(german_startx, german_starty, german_width,
def draw_soldier(rect, colour):
    pygame.draw.rect(gameDisplay, colour, rect)
# When the game starts, there are no soldiers
germans = []
russians = []

while not game_exit:
    gameDisplay.fill(white)

    # Each time through the loop, add another soldier to each
    # side until they're full
    if len(germans) < germancount:
        germans.append([german_startx, german_starty, german_width, german_height])
        german_startx += german_speed
    if len(russians) < russiancount:
        russians.append([russian_startx, russian_starty, russian_width, russian_height])
        russian_startx += russian_speed

    # Now draw all the soldiers in front of that white fill
    for german in germans:
        draw_soldier(german, grey)
    for russian in russians:
        draw_soldier(russian, red)

    pygame.display.update()
    clock.tick(60)