如何在按下"w, a, s, d"按钮时使正方形改变方向并朝正确的方向移动



如何在按下"w、 a,s,d";按钮(这样他就可以在按下设定方向的按钮后移动自己(不使用类

from tkinter import *
root = Tk()
root.title('Snake')
root["width"] = 400
root["height"] = 400
field = Canvas(root)
rectangle = field.create_rectangle(10, 20, 30, 40)
field.grid(row=0, column=0)
def w(y):
field.move(rectangle, 0, y)
y += 1
root.after(5)
def s(y):
field.move(rectangle, 0, y)
y -= 1
root.after(5)

def a(x):
field.move(rectangle, x, 0)
x -= 1
root.after(5)
def d(x):
field.move(rectangle, x, 0)
x += 10
root.after(5)
x=0
y=0
def snake(event):
if event.char == 'w':
w(y)
elif event.char == 'a':
a(x)
elif event.char == 's':
s(y)
elif event.char == 'd':
d(x)
field.move(rectangle, x, y)
root.bind("<Key>", snake)
root.mainloop()

您需要为x和y方向声明两个全局变量,例如dxdy

然后,如果你想让矩形继续移动,你需要使用.after()循环。

from tkinter import *
root = Tk()
root.title('Snake')
root["width"] = 400
root["height"] = 400
field = Canvas(root)
rectangle = field.create_rectangle(10, 20, 30, 40)
field.grid(row=0, column=0)
def move_snake():
field.move(rectangle, dx, dy)
# change the delay value 30 (ms) to other value to suit your case
root.after(30, move_snake)
# initial directions for x and y
dx = 0
dy = 0
def change_direction(event):
global dx, dy
if event.char in 'wasd':
dx = dy = 0
if event.char == 'w':
dy = -1    # move up
elif event.char == 'a':
dx = -1    # move left
elif event.char == 's':
dy = 1     # move down
elif event.char == 'd':
dx = 1     # move right
root.bind("<Key>", change_direction)
move_snake()  # start the moving loop
root.mainloop()

不是递增和递减x,y,而是有一个默认值,您可以根据方向更改该值-

from tkinter import *
root = Tk()
root.title('Snake')
root["width"] = 400
root["height"] = 400
field = Canvas(root)
rectangle = field.create_rectangle(10, 20, 30, 40)
field.grid(row=0, column=0)
x = 0 # Default
y = 0
speed = 10 # Set your speed. The lesser the value, the more fast 
def pos(event):
global x, y
x = 0
y = 0
if event.char == 'w': 
y = -1   # Changes the default values
elif event.char == 'a':
x = -1   
elif event.char == 's':
y = 1   
elif event.char == 'd':
x = 1
def snake():
field.move(rectangle, x, y)
root.after(speed, snake)
root.bind("<Key>", pos)
snake()
root.mainloop()

最新更新