2010-09-06 22 views
7

J'écris un Python snake game using curses, mais ai quelques difficultés à contrôler le serpent, mon code de courant pour commander le serpent est placé dans la boucle principale et ressemble à ceci:Comment obtenez-vous la dernière touche fléchée en utilisant des malédictions?

while True: 
    char = screen.getch() 
    if char == 113: exit() # q 
    elif char == curses.KEY_RIGHT: snake.update(RIGHT) 
    elif char == curses.KEY_LEFT: snake.update(LEFT) 
    elif char == curses.KEY_UP: snake.update(UP) 
    elif char == curses.KEY_DOWN: snake.update(DOWN) 
    else snake.update() 
    time.sleep(0.1) 

Cependant, le code semble traiter la les touches pressées en tant que que (de sorte que le serpent va s'arrêter quand il n'y a plus de flèches), alors que je veux en fait récupérer la dernière touche fléchée qui a été enfoncée.

Comment puis-je récupérer la dernière flèche qui a été pressé?

+1

Repensez votre conception (une variable 'direction' serait approprié) et ce problème disparaît. – You

+0

@You: Si je comprends bien, cela ne résoudra pas mon problème. – Zaz

+0

Cela dépend complètement de la façon dont vous configurez votre programme. Comme il est maintenant, on dirait que le mouvement dépend de l'entrée - une dépendance plus appropriée serait de faire dépendre le mouvement du temps seulement, et d'interroger (non-bloquant) les événements clés, changeant une variable 'direction' quand cela se produit. C'est comme ça que je le vois, de toute façon. – You

Répondre

3

Set screen.nodelay(1):

screen.nodelay(1) 
while True: 
    char = screen.getch() 
    if char == 113: break # q 
    elif char == curses.KEY_RIGHT: snake.update(RIGHT) 
    elif char == curses.KEY_LEFT: snake.update(LEFT) 
    elif char == curses.KEY_UP: snake.update(UP) 
    elif char == curses.KEY_DOWN: snake.update(DOWN) 
    else: snake.update() 
    time.sleep(0.1) 
+1

J'ai découvert que 'curses.halfdelay()' peut causer des bogues bizarres, 'screen.nodelay()' + 'time.sleep()' semble mieux fonctionner. – Zaz