Python 函数重复十次而不是一次-Pygame Zero

Python 函数重复十次而不是一次-Pygame Zero,python,python-3.x,pygame,pgzero,Python,Python 3.x,Pygame,Pgzero,我用Pygame Zero编写了一个简单的赛车游戏。这来自MagPi的《树莓皮复古游戏》一书。我是一个初学者程序员,所以我可能会问一个明显的问题。我想做水平测试。每100分,级别+1分。在10级比赛中获胜 感兴趣的领域可能是我的draw()函数: global gameStatus, level screen.fill((128, 128, 128)) if gameStatus == 0: car.draw() b = 0

我用Pygame Zero编写了一个简单的赛车游戏。这来自MagPi的《树莓皮复古游戏》一书。我是一个初学者程序员,所以我可能会问一个明显的问题。我想做水平测试。每100分,
级别
+1分。在10级比赛中获胜

感兴趣的领域可能是我的
draw()
函数:

    global gameStatus, level
    screen.fill((128, 128, 128))
    if gameStatus == 0:
        car.draw()
        b = 0
        while b < len(trackLeft):
            trackLeft[b].draw()
            trackRight[b].draw()
            b += 1
        screen.draw.text("Score: " + str(score), (50, 30), color="black")
        if score % 100 == 0:
            check_levels()
        screen.draw.text("Level: " + str(level), (50, 50), color="black")
    if gameStatus == 1:
        screen.blit('rflag', (318, 268))
    if gameStatus == 2:
        screen.blit('cflag', (318, 268))
    global level
    if level <= 10:
        level += 1
    if level == 10:
        gameStatus == 2
分数是计算每一个轨道有一个更高的分数

我的问题:当我的分数达到100分时,等级增加10,而不是1。我不知道发生了什么事。可能是因为每个分数都有一些FPS/刻度,并且随着级别在每个刻度上更新,似乎当分数在100上挂起大约10个刻度时,级别会在每个刻度上更新

由于我的程序很短,我将继续发布所有代码:

import time
from random import randint
import pygame
import pgzrun


WIDTH = 700
HEIGHT = 800


car = Actor("racecar")
car.pos = 250, 700
SPEED = 4
trackLeft = []
trackRight = []
trackCount = 0
trackPosition = 250
trackWidth = 120
trackDirection = False
gameStatus = 0
score = 0
level = 1


def draw():
    global gameStatus, level
    screen.fill((128, 128, 128))
    if gameStatus == 0:
        car.draw()
        b = 0
        while b < len(trackLeft):
            trackLeft[b].draw()
            trackRight[b].draw()
            b += 1
        screen.draw.text("Score: " + str(score), (50, 30), color="black")
        if score % 100 == 0:
            check_levels()
        screen.draw.text("Level: " + str(level), (50, 50), color="black")
    if gameStatus == 1:
        screen.blit('rflag', (318, 268))
    if gameStatus == 2:
        screen.blit('cflag', (318, 268))


def update():
    global gameStatus, trackCount
    if gameStatus == 0:
        if keyboard.left: car.x -= 2
        if keyboard.right: car.x += 2
        update_track()


def make_track():
    global trackCount, trackLeft, trackRight, trackPosition, trackWidth, score
    trackLeft.append(Actor("barrier", pos=(trackPosition - trackWidth, 0)))
    trackRight.append(Actor("barrier", pos=(trackPosition + trackWidth, 0)))
    trackCount += 1
    score += 1


def update_track():
    global trackCount, trackPosition, trackDirection, trackWidth, gameStatus
    b = 0
    while b < len(trackLeft):
        if car.colliderect(trackLeft[b]) or car.colliderect(trackRight[b]):
            gameStatus = 1
        trackLeft[b].y += SPEED
        trackRight[b].y += SPEED
        b += 1
    if trackLeft[len(trackLeft) - 1].y > 32:
        if trackDirection == False: trackPosition += 16
        if trackDirection == True: trackPosition -= 16
        if randint(0, 4) == 1: trackDirection = not trackDirection
        if trackPosition > 700 - trackWidth: trackDirection = True
        if trackPosition < trackWidth: trackDirection = False
        make_track()


def check_levels():
    global level
    if level <= 10:
        level += 1
    if level == 10:
        gameStatus = 2


make_track()


pgzrun.go()
导入时间
从随机导入randint
导入pygame
导入pgzrun
宽度=700
高度=800
汽车=演员(“赛车”)
car.pos=250700
速度=4
trackLeft=[]
trackRight=[]
trackCount=0
轨道位置=250
轨道宽度=120
trackDirection=False
游戏状态=0
分数=0
级别=1
def draw():
全球游戏状态、级别
屏幕填充((128、128、128))
如果gameStatus==0:
car.draw()
b=0
当b32:
如果trackDirection==False:trackPosition+=16
如果trackDirection==True:trackPosition-=16
如果randint(0,4)=1:trackDirection=非trackDirection
如果trackPosition>700-trackWidth:trackDirection=True
如果trackPosition如果级别,则必须在更新分数时进行级别检查。注意,
draw
的执行频率高于分数的更新频率,因此
如果分数%100==0:
会多次完成,并且级别会增加一次以上:

def draw():
全球游戏状态、级别
屏幕填充((128、128、128))
如果gameStatus==0:
# [...]
screen.draw.text(“分数:+str(分数),(50,30),color=“黑色”)
#删除=高度:
del trackRight[0]
trackCount+=1
分数+=1
如果分数%100==0:
检查_级别()

gameStatus==2
-应该是
gameStatus=2
?是的,对不起!我会编辑的!谢谢你的回复,很有效。而且几乎没有更多的滞后!但现在我感兴趣的是——在程序的末尾,make_track()运行。draw()也会运行。这是否意味着draw()在帧之间运行?@PolarBear123否。并且每帧调用一次。但是如果trackLeft[len(trackLeft)-1].y>32:
,则调用
make\u track
。因此,它不会在每一帧中调用,并且分数不会在每一帧中递增。代码末尾的
make_track
调用在启动时执行,并将第一个元素添加到
trackLeft
trackRight