微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

每次我完成一行时,俄罗斯方块都会变慢Python、Turtle

如何解决每次我完成一行时,俄罗斯方块都会变慢Python、Turtle

我正在尝试使用乌龟库在 python 中制作俄罗斯方块,但我遇到了不知道如何解决的问题。开始时游戏运行良好,但每次完成行时它都会变慢,并且在 5-6 次后变得无法播放。这是游戏的视频(我还没有完成): https://youtu.be/f8cENc-fP7E

这是完整的代码https://pastebin.com/kS8yGJQ7

但问题可能出在函数检查中:

def check():
    global pen2,pen3
    
    for i in range(len(blocks2)):
        blocksfordelete = []
        k = 0
        
        for j in range(len(blocks2)):
            if blocks2[i][1] == blocks2[j][1]:
                blocksfordelete.append(blocks2[j])
                k += 1
        
        if k == 13:
            for m in range(len(blocksfordelete)):
                pen4 = turtle.Turtle("square")
                pen4.shapesize(squaresize / 20)
                pen4.penup()
                pen4.color("white")
                pen4.goto(blocksfordelete[m][0],blocksfordelete[m][1])
                pen4.stamp()
                
            for n in blocksfordelete:
                if n in blocks2:
                    blocks2.remove(n)
 
            for x in blocks2:
                if x[1] > blocksfordelete[0][1]:
                    pen5 = turtle.Turtle("square")
                    pen5.shapesize(squaresize / 20)
                    pen5.penup()
                    pen5.color("white")
                    pen5.goto(x[0],x[1])
                    pen5.stamp()
 
                    pen6 = turtle.Turtle("square")
                    pen6.shapesize(squaresize / 20)
                    pen6.penup()
                    x[1] -= squaresize
                    pen6.color("black")
                    pen6.goto(x[0],x[1])
                    pen6.stamp()
 
            break

解决方法

我发现您的代码存在一些性能问题。首先,您一遍又一遍地动态创建海龟。虽然文档中不清楚,但海龟本质上是全局实体,除非您重置屏幕或退出海龟,否则它们永远不会消失。只创建您需要的并重复使用它们

其次,您使用戳记和清除来显示下降的海龟横向和向下移动。为此,我们可以简单地使用 海龟,并将海龟堆的标记代码留在屏幕底部。以下是您的代码如上所述重新设计以及大量调整:

from turtle import Screen,Turtle

SQUARE_SIZE = 30
CURSOR_SIZE = 20

WIDTH = 400 + SQUARE_SIZE/2
HEIGHT = 600 + SQUARE_SIZE/2

delay = 300
blocks1 = []
blocks2 = []

def start():
    blocks1.append([0,HEIGHT/2 + SQUARE_SIZE/2])
    pen_falling.showturtle()
    update()

def update():
    blocks1[0][1] -= 30

    if blocks1[0] in blocks2:
        blocks1[0][1] += SQUARE_SIZE
        pen_black.goto(blocks1[0])
        pen_black.stamp()
        blocks2.append(blocks1.pop(0))
        check()
        start()
    elif blocks1[0][1] == -HEIGHT/2 + 30:
        pen_black.goto(blocks1[0])
        pen_black.stamp()
        blocks2.append(blocks1.pop(0))
        check()
        start()
    else:
        pen_falling.goto(blocks1[0])
        screen.update()
        screen.ontimer(update,delay)

def down1():
    global delay
    delay = 50

def down2():
    global delay
    delay = 300

def right():
    if blocks1[0][0] < WIDTH/2 - SQUARE_SIZE:
        blocks1[0][0] += SQUARE_SIZE

        if blocks1[0] not in blocks2:
            pen_falling.goto(blocks1[0])
        else:
            blocks1[0][0] -= SQUARE_SIZE

def left():
    if blocks1[0][0] > -WIDTH/2 + SQUARE_SIZE:
        blocks1[0][0] -= SQUARE_SIZE

        if blocks1[0] not in blocks2:
            pen_falling.goto(blocks1[0])
        else:
            blocks1[0][0] += SQUARE_SIZE

def check():
    for i in range(len(blocks2)):
        blocksfordelete = []
        k = 0

        for block in blocks2:
            if blocks2[i][1] == block[1]:
                blocksfordelete.append(block)
                k += 1

        if k == 13:
            for block in blocksfordelete:
                pen_white.goto(block)
                pen_white.stamp()

            for block in blocksfordelete:
                if block in blocks2:
                    blocks2.remove(block)

            for block in blocks2:
                if block[1] > blocksfordelete[0][1]:
                    pen_white.goto(block)
                    pen_white.stamp()

                    block[1] -= SQUARE_SIZE

                    pen_black.goto(block)
                    pen_black.stamp()

            break

screen = Screen()
screen.setup(WIDTH,HEIGHT)
screen.title("Tetris")
screen.tracer(False)

pen_falling = Turtle('square')
pen_falling.hideturtle()
pen_falling.shapesize(SQUARE_SIZE / CURSOR_SIZE)
pen_falling.penup()
pen_falling.color('black')

pen_black = Turtle('square')
pen_black.hideturtle()
pen_black.shapesize(SQUARE_SIZE / CURSOR_SIZE)
pen_black.penup()
pen_black.color('black')

pen_white = Turtle('square')
pen_white.hideturtle()
pen_white.shapesize(SQUARE_SIZE / CURSOR_SIZE)
pen_white.penup()
pen_white.color('white')

screen.onkeypress(left,'Left')
screen.onkeypress(right,'Right')
screen.onkeypress(down1,'Down')
screen.onkeyrelease(down2,'Down')
screen.onkey(screen.bye,'Escape')

screen.listen()

start()

screen.mainloop()

如果您仍有性能问题,请告诉我,我会深入研究。

要获得更高的性能,请考虑管理您的图章,而不是覆盖它们。如果您跟踪 stamp() 方法返回的 图章 ID,则可以删除单个图章。

很好地使用了 onkeypress()onkeyrelease() 作为向下箭头键!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。