Maison  >  Article  >  développement back-end  >  Comment pouvez-vous implémenter plusieurs combinaisons de touches dans les graphiques Turtle pour un mouvement en diagonale ?

Comment pouvez-vous implémenter plusieurs combinaisons de touches dans les graphiques Turtle pour un mouvement en diagonale ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 21:27:03519parcourir

How can you implement multiple key press combinations in Turtle graphics for diagonal movement?

Combinaison de plusieurs pressions de touches dans Turtle Graphics

Dans les graphiques de tortue, il est possible d'enregistrer plusieurs pressions de touches pour déclencher les actions souhaitées. Un exemple courant consiste à faire bouger la tortue en diagonale lorsque les touches fléchées vers le haut et vers la droite sont enfoncées simultanément.

Considérez l'extrait de code suivant comme point de départ :

<code class="python">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")</code>

Alors que ce code vous permet d'effectuer des actions de touches individuelles, il ne permet pas d'appuyer simultanément sur des touches pour un mouvement en diagonale.

Une alternative Approche

Une approche alternative consiste à utiliser un système d'événements en file d'attente. Au lieu d'exécuter directement des actions en appuyant sur une touche, les événements clés sont stockés dans une file d'attente. Un minuteur vérifie ensuite périodiquement la file d'attente et exécute les actions en file d'attente. Cette approche permet la capture et la combinaison de plusieurs pressions sur des touches.

Le code suivant illustre cette approche alternative :

<code class="python">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()</code>

Avec cette approche, lorsque les touches fléchées haut et droite sont enfoncées simultanément , la fonction move_up_right est déclenchée, conduisant la tortue à se déplacer en diagonale.

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!

Déclaration:
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