Асинхронный захват пользовательского ввода и передача в цикл обработки событий в python.

Я создаю однопользовательскую MUD, которая представляет собой текстовую боевую игру. Он не сетевой.

Я не понимаю, как собирать пользовательские команды и асинхронно передавать их в мой цикл обработки событий. Игрок должен иметь возможность вводить команды в любое время, когда запускаются игровые события. Поэтому приостановка процесса с помощью raw_input не сработает. Я думаю, мне нужно сделать что-то вроде select.select и использовать потоки.

В приведенном ниже примере у меня есть макет функции userInputListener(), в которой мне нравится получать команды и добавлять их в очередь команд, если есть ввод.

Если есть цикл обработки событий, такой как:

from threading import Timer
import time

#Main game loop, runs and outputs continuously
def gameLoop(tickrate):

    #Asynchronously get some user input and add it to a command que 
    commandQue.append(userInputListener())
    curCommand = commandQue(0)
    commandQue.pop(0)

    #Evaluate input of current command with regular expressions
    if re.match('move *', curCommand):
        movePlayer(curCommand)
    elif re.match('attack *', curCommand):
        attackMonster(curCommand)
    elif re.match('quit', curCommand):
        runGame.stop()
    #... etc    

    #Run various game functions...
    doStuff()

    #All Done with loop, sleep
    time.sleep(tickrate)

#Thread that runs the game loop
runGame = Timer(0.1, gameLoop(1))
runGame.start()

Как я могу ввести туда пользовательский ввод?

Или, проще говоря, может ли кто-нибудь показать мне какой-нибудь пример сохранения пользовательского ввода, когда в это же время выполняется другой цикл? Я могу выяснить остальное, если мы сможем зайти так далеко.

8
задан msystems 24 February 2016 в 11:13
поделиться