Как вы нажимаете последнюю клавишу со стрелкой, используя curses?

Я пишу игру в змейку на Python с использованием проклятий, но у меня возникли проблемы с управлением змеей, мой текущий код для управления змейкой находится внутри основного цикла и выглядит так:

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)

Однако код, похоже, обрабатывает нажатые клавиши как очередь (поэтому змея остановится, когда у нее закончатся нажатия стрелок), тогда как я действительно хочу, чтобы она извлекала последнюю нажатую клавишу со стрелкой.

Как я могу получить последнюю нажатую клавишу со стрелкой?


person Zaz    schedule 06.09.2010    source источник
comment
Переосмыслите свой дизайн (подойдет переменная direction), и эта проблема исчезнет.   -  person You    schedule 06.09.2010
comment
@You: Насколько я понимаю, это не решит мою проблему.   -  person Zaz    schedule 07.09.2010
comment
Это полностью зависит от того, как вы компонуете свою программу. Как сейчас, похоже, что движение зависит от ввода — более подходящей зависимостью было бы, чтобы движение зависело только от времени, и опрашивал (не блокировал) ключевые события, изменяя переменную direction, когда они происходят. Во всяком случае, я так это вижу.   -  person You    schedule 07.09.2010
comment
Добавлена ​​недостающая строка else snake.update().   -  person Zaz    schedule 07.09.2010
comment
Это неблокирующая часть опроса, с которой я борюсь, curses.halfdelay(), похоже, решает эту проблему.   -  person Zaz    schedule 07.09.2010


Ответы (1)


Установить 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)
person Zaz    schedule 06.09.2010
comment
Я обнаружил, что curses.halfdelay() может вызывать некоторые странные ошибки, screen.nodelay() + time.sleep() работает лучше. - person Zaz; 08.09.2010