2012-06-08 5 views
6

Estoy construyendo un solo jugador MUD, que es básicamente un juego de combate basado en texto. No está conectado a la red.Capture la entrada del usuario de forma asincrónica y pase a un bucle de evento en python

No entiendo cómo reunir comandos de usuario y pasarlos a mi ciclo de eventos de forma asincrónica. El jugador debe poder ingresar comandos en cualquier momento a medida que los eventos del juego se disparan. Así que pausar el proceso usando raw_input no funcionará. Creo que necesito hacer algo como select.select y usar threads.

En el ejemplo siguiente, tengo una función de maqueta de userInputListener() que es donde me gusta recibir comandos, y los anexo al comando Que si hay entradas.

Si tienen un ciclo de eventos tales como:

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() 

¿Cómo hago para que mi entrada del usuario en ese país?

O más simplemente, ¿alguien puede mostrarme algún ejemplo de almacenamiento de la entrada del usuario mientras otro ciclo se ejecuta al mismo tiempo? Puedo averiguar el resto si podemos llegar tan lejos.

+0

Es [Twisted] (http://twistedmatrix.com/) es una opción? – sarnold

+2

En lugar de rodar el suyo, puede intentar usar PyGame o curses para manejar su entrada. –

+0

¿No es MUD la mazmorra multiusuario? Estoy de acuerdo con @AndrewGorcester de todos modos, probablemente sería más fácil evitar reinventar la rueda. –

Respuesta

2

De hecho necesitará dos hilos. Uno para estar preocupado con el bucle principal del juego y otro para manejar la entrada del usuario. Los dos estarían comunicándose a través de un Queue.

Puede hacer que su proceso principal inicie la secuencia de bucles del juego y luego obtener una línea de texto del usuario y "ponerla" en la cola (es decir, ejecutar runGame.start()). Esto puede ser tan simple como: hilo de bucle

while not gameFinished: 
    myQueue.put(raw_input()). 

El juego será simplemente "que consigue" una línea de texto de la cola, interpert y ejecutarlo.

Python tiene un hilo seguro queue implementation que puede utilizar (incluido un ejemplo muy básico para el uso de subprocesos múltiples que puede utilizar como una guía).

También hay un módulo interperter de línea de comando simple (cmd module y here para una buena descripción práctica) que también puede ser útil para este tipo de proyecto.

1

hice un pygame Hanoi-visualizador que lee la entrada asíncrona here

Las líneas importantes son:

#creates an input buffer for stdin 
bufferLock=threading.Lock() 
inputBuffer=[] 

class StdinParser(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
    def run(self): 
     global inputBuffer 
     running = True 
     while running: 
      try: 
       instruction=raw_input() 
       bufferLock.acquire() 
       if inputBuffer == False: 
        running = False 
       else: 
        inputBuffer.insert(0,instruction) 
       bufferLock.release() 
      except EOFError: 
       running = False 
     pyglet.app.exit() 

def check_for_input(dt): 
    bufferLock.acquire() 
    if len(inputBuffer)>0: 
     instruction = inputBuffer.pop() 
     parseLine(instruction,board) 
    bufferLock.release() 
Cuestiones relacionadas