Maison > développement back-end > Tutoriel Python > Comment lier plusieurs pressions de touches dans Turtle Graphics pour des actions complexes ?

Comment lier plusieurs pressions de touches dans Turtle Graphics pour des actions complexes ?

Linda Hamilton
Libérer: 2024-11-02 21:19:30
original
266 Les gens l'ont consulté

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

Liaison de plusieurs pressions de touches dans Turtle Graphics

Dans le développement de jeux, la coordination des entrées utilisateur nécessite des techniques de liaison de touches fiables. Cet article explique comment lier plusieurs pressions de touches ensemble dans des graphiques de tortue, permettant ainsi des actions complexes lorsque certaines combinaisons sont enfoncées.

Énoncé du problème :

Créer une connexion Jeu Dot Python où :

  • Appuyer vers le haut déplace la tortue vers le haut.
  • Appuyer sur la droite déplace la tortue vers la droite.
  • Appuyer sur le haut et la droite déplace la tortue de 45 degrés vers le nord. -est.

Approche initiale :

Le code suivant représente une première tentative :

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")
Copier après la connexion

Défis :

Le code ci-dessus n'enregistrera pas plusieurs pressions de touches simultanément. Par exemple, appuyer sur Haut et Droite n'exécutera l'action que pour la deuxième touche enfoncée.

Solution alternative :

En raison des limitations de onkeypress(), une alternative une approche est nécessaire. Dans cette solution, les pressions sur les touches sont enregistrées dans une liste et un minuteur vérifie périodiquement les combinaisons enregistrées et exécute les actions appropriées.

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()
Copier après la connexion

Cette solution résout efficacement le problème, permettant d'enregistrer simultanément plusieurs pressions sur des touches. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal