【问题标题】:Why doesn't Python perform a function each time it goes through a loop?为什么 Python 在每次循环时都不执行一个函数?
【发布时间】:2018-08-16 23:11:18
【问题描述】:

我编写了这个脚本,它创建了向左移动并停在某个点的灰色方块,并创建了无限向右移动的红色方块。目前每个方格只制作 1 个。

在我看来(我是初学者)下面的脚本部分处于循环中,因此每次计算机通过循环时,它都应该创建一个新的灰色方块,直到总共有 15 个方块。为什么不呢?

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

if germancount<15:
    spawn_soldier(german_startx, german_starty, german_width, german_height, grey)

我的完整代码如下:

import pygame
import time
import random


pygame.init()

display_width = 1000
display_height= 800

black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
green = (0,255,0)
blue = (0,0,255)
grey=(169,169,169)

gameDisplay= pygame.display.set_mode((800,600))

pygame.display.set_caption('stalingrad')

clock = pygame.time.Clock()



def spawn_soldier(thingx,thingy, thingw, thingh, colour):
    pygame.draw.rect(gameDisplay, colour,[thingx, thingy, thingw, thingh])


def game_loop():

    russian_width= 20
    russian_height= 20
    russian_speed = 2
    russian_startx=-30
    russian_starty=random.randrange(0, display_height)

    german_width=20
    german_height=20
    german_speed=-1
    german_startx=780
    german_starty=random.randrange(0, display_height)

    germancount=0
    russiancount=0

    game_exit=False

    while not game_exit:
        gameDisplay.fill(white)



        if germancount<15:
            spawn_soldier(german_startx, german_starty, german_width, german_height, grey)

        if german_startx > 700:
            german_startx += german_speed

        if russiancount<100:
            spawn_soldier(russian_startx, russian_starty, russian_width, russian_height, red)


            russian_startx += russian_speed

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


game_loop()
pygame.quit()
quit()

编辑,我想我想出了一种更好地定义我的问题的方法。

我需要 15 个这样的“spawn_soldier”函数,这些函数仅适用于德国人。

            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,

有没有什么方法可以让它做 115 个不同版本的这个函数,其中 y 的值不同,而不需要复制和粘贴 115 次?因为那将是一场噩梦。

【问题讨论】:

  • 德国人是灰色方块?我想不是。毕竟,他们中的许多人都很时髦,如果真的是灰色的,那么最糟糕的是,他们是灰色超酷的人,而不是灰色方块。
  • 它是否有可能像你想要的那样创建,但每次循环开始时你都用白色填充gameDisplay,因此看不到其他的?顺便说一句,您永远不会增加您的germancount. 尝试在spawn_soldier 中添加print 语句以进行调试。
  • 每次循环,你都会产生一个新士兵。事实上,你会永远这样做。你用白雪覆盖所有现有的士兵,然后永远生成一个新的德国人和一个新的俄罗斯人(尽管最终他们会离开屏幕边缘,所以你不会看到他们)。
  • 臭虫。是的,我刚刚意识到。如果我加上士兵的数量,它会在 15 帧后消失。因为它只是重绘它。这不会按我想要的方式工作。我将不得不为每个方块使用不同的代码行,但我想要数百万个不同的方块。有什么帮助吗?像我可以让它以某种方式迭代我的生成士兵功能吗?
  • @tgmjack PyGame 的诀窍是你必须考虑每一帧你做了什么。如果每帧都将整个屏幕绘制成白色,那么您必须在显示帧之前绘制每个人和所有内容。无论您做什么(例如添加上次不存在的新士兵)都在“绘制所有内容”代码之上。

标签: python loops pygame


【解决方案1】:

每次循环,你都会产生一个新士兵。事实上,因为您永远不会更改 germancountrussiancount,所以您不仅要这样做 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)

【讨论】:

  • 我不确定这部分该怎么做我正在挣扎。对不起
  • @tgmjack 我有点猜测你想要做什么,但是......这个想法是你在开始时创建germans = []russians = [],然后进入主循环。然后,每帧一次。你添加另一个德国人和另一个俄罗斯人,直到你有足够的每一个。 (在那之后......循环不会做任何有用的事情,你只会看到它们面对面,一动不动,直到你感到无聊并退出程序。但如果你在模拟第一次世界大战,那不是一个非常逼真的模拟......)我将编辑答案以使其更清晰。
猜你喜欢
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多