2011-09-05 2 views
3

Я придумал приключение создания относительно небольшой RPG командной строки, чтобы сгибать мои новоявленные мышцы Питона, но я уже столкнулся с головоломкой. Я использую эту реализацию Геч():Можно ли использовать getch() для получения входов переменной длины?

def getch(): 
    fd = sys.stdin.fileno() 
    old_settings = termios.tcgetattr(fd) 
    tty.setraw(sys.stdin.fileno()) 
    key = sys.stdin.read(3) 
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 

У меня есть key набор для чтения в 3-х символов для захвата клавиш со стрелками. Up, например, считывается как ESC[A; с помощью этого метода я могу использовать key[2], чтобы определить, была ли нажата клавиша со стрелкой и какая. Все хорошо и хорошо, за исключением того, что я также хотел бы захватить всевозможные другие ключи; q для журнала квестов, wasd для перемещения (нажатие стрелок в разных порядках будет методом атаки) и многие другие. Проблема мгновенно понятна; если getch() возвращает только один символ, функциональность стрелки полностью теряется.

Я рассматриваю переосмысление системы стрельбы вообще, если нет простого решения, но я почти уверен, что должно быть. По общему признанию, я мало знаю о том, что происходит в пределах tty, но я где-то читал, что если вы читаете только 1 символ, избыточные символы из стрелки сохраняются в буфере. Как я могу получить доступ к указанному буферу? Альтернативно, есть ли какой-нибудь умный способ сообщить stdin, чтобы ожидать ввода переменной длины?

Заранее благодарю за любую помощь.

ответ

5

не читать три символа. Прочтите один.

Если только один символ, который вы только что прочитали, является ESC, прочитайте другой символ или два, чтобы узнать, была ли это клавиша со стрелкой или что-то еще. Если это был q, сделайте что-нибудь для этого и начните сначала.

+0

Это потребует, чтобы пользователь дважды нажал клавишу со стрелкой, что не очень дружелюбно. –

+0

нет нет. вы заменяете 'read (3)' на 'read (1)', за которым следует инструкция if, ища '\ x1b', а затем' read (2) ', чтобы увидеть, какой ключ был нажат. – SingleNegationElimination

+0

Ах, да. Делает совершенный смысл. Спасибо, токен. –

0

Если вы считаете, что разработка полноценной игры может быть полезна, PyGame (в конечном итоге ncurses).

Фрагмент getch() можно обновить, чтобы прочитать стрелку, но как сделать разницу между первым символом клавиши со стрелкой и ключом ESC? Если пользователь нажмет ESC, описанное решение, вероятно, ждет следующего нажатия клавиши.

Я не нашел решение для работы с этим последним случаем.

 Смежные вопросы

  • Нет связанных вопросов^_^