Heim  >  Artikel  >  Backend-Entwicklung  >  Wie binde ich mehrere Tastendrücke in Turtle Graphics für komplexe Aktionen zusammen?

Wie binde ich mehrere Tastendrücke in Turtle Graphics für komplexe Aktionen zusammen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 21:19:30140Durchsuche

How to Bind Multiple Key Presses in Turtle Graphics for Complex Actions?

Verknüpfung mehrerer Tastendrücke in Turtle Graphics

Bei der Spieleentwicklung erfordert die Koordinierung von Benutzereingaben zuverlässige Tastenbindungstechniken. In diesem Artikel geht es darum, wie man mehrere Tastendrücke in Schildkrötengrafiken miteinander verknüpft und so komplexe Aktionen ermöglicht, wenn bestimmte Kombinationen gedrückt werden.

Problemstellung:

Erstellen Sie eine Verbindung-die- Punkt-Python-Spiel, bei dem:

  • Durch Drücken nach oben wird die Schildkröte nach oben bewegt.
  • Durch Drücken nach rechts wird die Schildkröte nach rechts bewegt.
  • Durch Drücken nach oben und nach rechts wird die Schildkröte um 45 Grad nach Norden bewegt -Osten.

Erster Ansatz:

Der folgende Code stellt einen ersten Versuch dar:

import turtle

flynn = turtle.Turtle()
win = turtle.Screen()
win.bgcolor("LightBlue")
flynn.pensize(7)
flynn.pencolor("lightBlue")

win.listen()

def Up():
    flynn.setheading(90)
    flynn.forward(25)

def Down():
    flynn.setheading(270)
    flynn.forward(20)

def Left():
    flynn.setheading(180)
    flynn.forward(20)

def Right():
    flynn.setheading(0)
    flynn.forward(20)

def upright():
    flynn.setheading(45)
    flynn.forward(20)

win.onkey(Up, "Up")
win.onkey(Down,"Down")
win.onkey(Left,"Left")
win.onkey(Right,"Right")

Herausforderungen:

Der obige Code registriert nicht mehrere gleichzeitige Tastendrücke. Wenn Sie beispielsweise nach oben und rechts drücken, wird die Aktion nur für die zweite gedrückte Taste ausgeführt.

Alternative Lösung:

Aufgrund der Einschränkungen von onkeypress() eine Alternative Herangehensweise ist erforderlich. Bei dieser Lösung werden Tastendrücke in einer Liste aufgezeichnet, und ein Timer prüft regelmäßig, ob registrierte Kombinationen vorliegen und führt die entsprechenden Aktionen aus.

from turtle import Turtle, Screen

win = Screen()

flynn = Turtle('turtle')

def process_events():
    events = tuple(sorted(key_events))

    if events and events in key_event_handlers:
        (key_event_handlers[events])()

    key_events.clear()

    win.ontimer(process_events, 200)

def Up():
    key_events.add('UP')

def Down():
    key_events.add('DOWN')

def Left():
    key_events.add('LEFT')

def Right():
    key_events.add('RIGHT')

def move_up():
    flynn.setheading(90)
    flynn.forward(25)

def move_down():
    flynn.setheading(270)
    flynn.forward(20)

def move_left():
    flynn.setheading(180)
    flynn.forward(20)

def move_right():
    flynn.setheading(0)
    flynn.forward(20)

def move_up_right():
    flynn.setheading(45)
    flynn.forward(20)

def move_down_right():
    flynn.setheading(-45)
    flynn.forward(20)

def move_up_left():
    flynn.setheading(135)
    flynn.forward(20)

def move_down_left():
    flynn.setheading(225)
    flynn.forward(20)

key_event_handlers = { \
    ('UP',): move_up, \
    ('DOWN',): move_down, \
    ('LEFT',): move_left, \
    ('RIGHT',): move_right, \
    ('RIGHT', 'UP'): move_up_right, \
    ('DOWN', 'RIGHT'): move_down_right, \
    ('LEFT', 'UP'): move_up_left, \
    ('DOWN', 'LEFT'): move_down_left, \
}

key_events = set()

win.onkey(Up, "Up")
win.onkey(Down, "Down")
win.onkey(Left, "Left")
win.onkey(Right, "Right")

win.listen()

process_events()

win.mainloop()

Diese Lösung geht das Problem effektiv an und ermöglicht die gleichzeitige Registrierung mehrerer Tastendrücke .

Das obige ist der detaillierte Inhalt vonWie binde ich mehrere Tastendrücke in Turtle Graphics für komplexe Aktionen zusammen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn