Я создаю однопользовательскую MUD, которая в основном представляет собой текстовую боевую игру. Он не подключен к сети.Асинхронно вставляйте пользовательский ввод и переходите в цикл событий в python
Я не понимаю, как собирать пользовательские команды и передавать их в цикл событий асинхронно. Игрок должен иметь возможность вводить команды в любое время по мере запуска игровых событий. Поэтому приостановка процесса с использованием raw_input не будет работать. Я думаю, мне нужно сделать что-то вроде select.select и использовать потоки.
В приведенном ниже примере у меня есть функция mockup userInputListener(), в которой мне нравится получать команды, и добавьте их в команду Que, если есть вход.
Если есть цикл событий, таких как:
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()
Как я могу получить свой пользовательский ввод там?
Или, проще говоря, может ли кто-нибудь показать мне какой-либо пример хранения пользовательского ввода, пока другой цикл работает одновременно? Я могу разобраться в остальном, если мы сможем это сделать.
Is [Twisted] (http://twistedmatrix.com/) вариант? – sarnold
Вместо того, чтобы кататься самостоятельно, вы можете попробовать использовать PyGame или проклятия для обработки ввода. –
Не подходит ли MUD для многопользовательской подземелья? Я согласен с @AndrewGorcester в любом случае, вероятно, было бы легче избежать повторного использования колеса. –