如何在执行while循环(或类似循环)时输入

时间:2014-08-22 21:12:12

标签: python multithreading while-loop

我确实认为线程可能会实现这一点,尽管我不确定。解决此问题的大多数线程都没有解决它与我的问题相匹配。我创造了一个简单的泥状战斗系统,当你“打”一个NPC时执行。我有一个在while循环下运行的代码,它检查你和NPC之间的健康状况,如果你们中的一个死了,那么循环结束。

然而

在循环过程中,我想让用户可以输入命令,而不是在看不到循环代码块而无法做任何事情。从我在网上看到的,看起来线程模块可能对我有所帮助?此外,如果有人有PyGame经验,也许可以考虑这将是一个解决方案?请让我知道你的想法。

以下是我想要完成的一个非常简单的例子。

import time

fighting = True
while fighting:
    # do the magic here
    time.sleep(4)       # to give it a nice even pace between loop intervals

虽然在任何时候我都希望能够输入技能或法术等命令。 有什么想法或建议吗?

3 个答案:

答案 0 :(得分:2)

您可以将人机界面与游戏区分开来。战斗游戏使用队列进行输入,使用超时继续。这是一个非常简单的队列结构,应该最低限度地做你想要的。

import time
import threading
import Queue


def fighter(input_queue):
    while True:
        start = time.time()
        # do stuff
        wait = time.time() - start()
        if wait <= 0.0:
            wait = 0
        try:
            msg = input_queue.get(wait, wait)
            if msg == 'done':
                return
            # do something else with message
        except Queue.Empty:
            pass

def main():
    input_queue = Queue.Queue()
    fight_thread = threading.Thread(target=fighter, args=(input_queue,))
    fight_thread.start()
    while True:
        msg = raw_input('hello ')  # py 2.x
        input_queue.put(msg)
        if msg == 'done':
            break
    fight_thread.join()

答案 1 :(得分:1)

如果您只想在Windows上使用它,并且希望保持简单的事件循环:

fighting = True
inputbuf = ''
while fighting:
    # do the magic here
    while msvcrt.khbit():
        newkey = msvcrt.getwche()
        inputbuf += newkey
        if newkey == '\r':
            process_command(inputbuf)
            inputbuf = ''
    time.sleep(4)       # to give it a nice even pace between loop intervals

另一方面,如果你想使用后台线程,那会更简单:

def background():
    for line in sys.stdin:
        process_command(line)
bt = threading.Thread(target=background)
bt.start

fighting = True
while fighting:
    # do the magic here
    time.sleep(4)       # to give it a nice even pace between loop intervals

这可以跨平台工作,它提供了普通的行缓冲输入(包括完整的readline支持),人们可能会喜欢。

但是,我假设您希望process_command# do the magic here代码共享信息,甚至可能设置fighting = False。如果您在没有任何线程同步的情况下执行此操作,它将不再跨平台工作。 (可能可以在Windows CPython和Unix CPython上工作,但可能在IronPython或Jython上工作 - 或者更糟糕的是,它会在大部分时间工作但随机失败经常足以让你不得不修复它,但经常不能调试它......)

答案 2 :(得分:-1)

您可能正在寻找的是非阻塞的raw_input实现。这将允许循环继续运行,同时允许用户输入命令。

有一个此herehere的实施示例。也许你可以根据自己的目的调整其中一个。

修改

或者,如果您正在处理Windows ...