Как заставить квадрат менять направление и двигаться в правильном направлении, когда вы нажимаете кнопки «w, a, s, d»

#python #tkinter

#питон #tkinter

Вопрос:

Как заставить квадрат менять направление и двигаться в правильном направлении при нажатии кнопок «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("lt;Keygt;", snake) root.mainloop()  

Ответ №1:

Вам нужно объявить две глобальные переменные для направлений x и y, например dx , и dy .

Затем, если вы хотите, чтобы прямоугольник продолжал двигаться, вам нужно использовать .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("lt;Keygt;", change_direction) move_snake() # start the moving loop root.mainloop()  

Ответ №2:

Вместо увеличения и уменьшения 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("lt;Keygt;", pos) snake() root.mainloop()