我确实认为线程可能会实现这一点,尽管我不确定。解决此问题的大多数线程都没有解决它与我的问题相匹配。我创造了一个简单的泥状战斗系统,当你“打”一个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
虽然在任何时候我都希望能够输入技能或法术等命令。 有什么想法或建议吗?
答案 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)