Python tkinter蛇游戏绘图滞后

Python tkinter蛇游戏绘图滞后,python,python-3.x,tkinter,tkinter-canvas,Python,Python 3.x,Tkinter,Tkinter Canvas,我已经用tkinter在python中创建了一个简单的蛇游戏,但是当蛇数组包含30多个矩形时,移动速度会迅速减慢,所以我想知道有没有更好的方法来绘制对象,使其工作得更快,而不是不断调用这个绘制函数 另一个可能的问题是移动功能效率低下: #example snake snake = [[1, 2], [1, 3], [2, 3]] def draw(): canvas.delete('all') for segment in snake: y = segment[0] * 10 x

我已经用tkinter在python中创建了一个简单的蛇游戏,但是当蛇数组包含30多个矩形时,移动速度会迅速减慢,所以我想知道有没有更好的方法来绘制对象,使其工作得更快,而不是不断调用这个绘制函数

另一个可能的问题是移动功能效率低下:

#example snake snake = [[1, 2], [1, 3], [2, 3]]
def draw():
canvas.delete('all')
for segment in snake:
    y = segment[0] * 10
    x = segment[1] * 10
    canvas.create_rectangle(x, y, x + 10, y + 10, fill="red")
    canvas.update()

这是我第一次真正玩游戏,所以别杀了我:(。

你不必从画布上删除所有矩形。你只需删除最后一个矩形,然后添加新的头部矩形

要在snake列表中添加新的x,y,您不必移动所有元素-只需
snake.insert(0[new\ux,new\uy])

您可以使用
root.after
而不是
while
循环和
睡眠

示例-不检查碰撞

def move_right(event):

global left, right, up, down
if right != True:
    left, right, up, down = False, True, False, False
    while right == True:
        if snake[0][1] >= snake[1][1]:
            for x in range(len(snake) - 1, 0, -1):
                snake[x] = snake[x - 1]
            snake[0] = [snake[0][0], snake[0][1] + 1]
            draw()
        time.sleep(0.05)
将tkinter作为tk导入
#==常数===
块大小=10
时间=50
#==函数===
#在画布上创建所有矩形
def创建_蛇(画布、蛇):
snake_rect=[]
对于snake中的x,y:
x1=x*块大小
y1=y*块大小
x2=x1+块大小
y2=y1+块大小
rect=canvas。创建_矩形(x1,y1,x2,y2,fill='red')
snake_rect.append(rect)
回蛇
#移动蛇-添加第一个矩形并删除最后一个矩形
def move(画布、蛇、蛇、删除最后一个=真):
#头脑清醒
x、 y=蛇[0]
#新的头部位置
如果方向==“向上”:
y=y-1
elif方向==“向下”:
y=y+1
elif方向==“左”:
x=x-1
elif方向==‘右’:
x=x+1
#添加第一个-新的头
snake.insert(0[x,y])
x1=x*块大小
y1=y*块大小
x2=x1+块大小
y2=y1+块大小
rect=canvas。创建_矩形(x1,y1,x2,y2,fill='red')
snake_rect.insert(0,rect)
#去掉最后一条尾巴(如果蛇不吃苹果的话)
如果最后移除_:
德尔斯内克[-1]
canvas.delete(snake_rect[-1])
del snake_rect[-1]
#时间毫秒后再次调用'move'函数
root.after(时间、移动、画布、蛇、蛇)
#转向
def更改方向(新方向):
全球方向
#打印(新方向)
如果新的_方向=='左':
如果方向!=“正确”:
方向=新的方向
elif new_direction==“right”:
如果方向!=“左”:
方向=新的方向
elif new_direction==“向上”:
如果方向!=“向下”:
方向=新的方向
elif new_direction==“down”:
如果方向!=“向上”:
方向=新的方向
#==main===
方向=‘向上’
# ---
root=tk.tk()
canvas=tk.canvas(根)
canvas.pack()
#创建长(弯曲)蛇
snake=[[x,25]表示范围(10,35)]+[[35,y]表示范围(25,1,-1)]+[[x,1]表示范围(35,1,-1)内的x]
snake\u rect=创建蛇(画布,蛇)
#在时间毫秒后调用'move'函数
root.after(时间、移动、画布、蛇、蛇)
#绑定箭头以更改蛇的方向
root.bind(“”,lambda事件:更改方向('left'))
root.bind(“”,lambda事件:更改方向('right'))
root.bind(“”,lambda事件:更改方向('up'))
root.bind(“”,lambda事件:更改方向('down'))
#启动程序
root.mainloop()

您不必从画布中删除所有矩形。您只需删除最后一个矩形,然后添加新的头部矩形

要在snake列表中添加新的x,y,您不必移动所有元素-只需
snake.insert(0[new\ux,new\uy])

您可以使用
root.after
而不是
while
循环和
睡眠

示例-不检查碰撞

def move_right(event):

global left, right, up, down
if right != True:
    left, right, up, down = False, True, False, False
    while right == True:
        if snake[0][1] >= snake[1][1]:
            for x in range(len(snake) - 1, 0, -1):
                snake[x] = snake[x - 1]
            snake[0] = [snake[0][0], snake[0][1] + 1]
            draw()
        time.sleep(0.05)
将tkinter作为tk导入
#==常数===
块大小=10
时间=50
#==函数===
#在画布上创建所有矩形
def创建_蛇(画布、蛇):
snake_rect=[]
对于snake中的x,y:
x1=x*块大小
y1=y*块大小
x2=x1+块大小
y2=y1+块大小
rect=canvas。创建_矩形(x1,y1,x2,y2,fill='red')
snake_rect.append(rect)
回蛇
#移动蛇-添加第一个矩形并删除最后一个矩形
def move(画布、蛇、蛇、删除最后一个=真):
#头脑清醒
x、 y=蛇[0]
#新的头部位置
如果方向==“向上”:
y=y-1
elif方向==“向下”:
y=y+1
elif方向==“左”:
x=x-1
elif方向==‘右’:
x=x+1
#添加第一个-新的头
snake.insert(0[x,y])
x1=x*块大小
y1=y*块大小
x2=x1+块大小
y2=y1+块大小
rect=canvas。创建_矩形(x1,y1,x2,y2,fill='red')
snake_rect.insert(0,rect)
#去掉最后一条尾巴(如果蛇不吃苹果的话)
如果最后移除_:
德尔斯内克[-1]
canvas.delete(snake_rect[-1])
del snake_rect[-1]
#时间毫秒后再次调用'move'函数
root.after(时间、移动、画布、蛇、蛇)
#转向
def更改方向(新方向):
全球方向
#打印(新方向)
如果新的_方向=='左':
如果方向!=“正确”:
方向=新的方向
elif new_direction==“right”:
如果方向!=“左”:
方向=新的方向
elif new_direction==“向上”:
如果方向!=“向下”:
方向=新的方向
elif new_direction==“down”:
如果方向!=“向上”:
方向=新的方向
#==main===
方向=‘向上’
# ---
root=tk.tk()
canvas=tk.canvas(根)
canvas.pack()
#创建长(弯曲)蛇
snake=[[x,25]表示范围(10,35)]+[[35,y]表示范围(25,1,-1)]+[[x,1]表示范围(35,1,-1)内的x]
snake\u rect=创建蛇(画布,蛇)
#在时间毫秒后调用'move'函数
root.after(时间、移动、画布、蛇、蛇)
#绑定箭头以更改snake di