使用Python将定时函数编码为基于文本的游戏

时间:2013-03-29 00:54:26

标签: python

我正在用Python编写一个简单的基于文本的冒险游戏。我希望无论用户做什么,都会定期发生某些过程,大约每2分钟一次。例如:让NPC在房间里移动,让人们感到饥饿和口渴,让人们痊愈,在战斗中,让战斗继续下去。现在,我正在使用'raw_input'来获取用户的命令,但这实际上会暂停代码。即使用户只是坐在那里并且没有输入任何内容,我怎样才能让游戏继续进行?

4 个答案:

答案 0 :(得分:1)

我认为通常在这种情况下你不会有后台进程或线程进行计算。相反,当用户键入一些响应时,做一个时间增量并根据输入之间的经过时间计算一个玩家将愈合多少以及战斗事件将会是什么等等。这就是你不想要控制台更新而游戏正在等待用户回复。

编辑: 或尝试这样的事情:

import time
import sys

win32 = True
try:
    from msvcrt import kbhit, getch
    print "[+] Running on windows, using msvcrt."
except ImportError:
    print "[+] Not running on windows, attempting unix-like."
    win32 = False

    import termios, fcntl, sys, os
    import select
    fd = sys.stdin.fileno()

    oldterm = termios.tcgetattr(fd)
    newattr = termios.tcgetattr(fd)
    newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
    termios.tcsetattr(fd, termios.TCSANOW, newattr)

    oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
    fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)


POLLTIME = 5
done = False
command = ""
while not done:

    sys.stdout.write("\r")
    print("Something happened (polling)%s" % (" " * command.__len__() ))
    sys.stdout.write("Enter command: %s" % command)
    sys.stdout.flush()

    t = time.time()
    if win32:
        while time.time() - t < POLLTIME:
            if kbhit():
                c = getch()
                if ord(c) < 127 and ord(c) > 31:
                    command += c
                    message = "\rEnter command: " + command
                    sys.stdout.write("\r%s" % message)
                if "\r" == c:
                    if "quit\r" == command:
                        done = True
                        break
                    sys.stdout.write("\rThe command was: %s\n" % command)
                    command = ""
                    sys.stdout.write("\rEnter command: %s \b" %command)
                elif "\b" == c:
                    command = command[:-1]
                    sys.stdout.write("\rEnter command: %s \b" %command)
                sys.stdout.flush()
    else:
        while time.time() - t < POLLTIME:
            try:
                c = '\0'                
                if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
                    c = sys.stdin.readline(1)
                    if ord(c) < 127 and ord(c) > 31:
                        command += c
                        message = "\rEnter command: " + command
                        sys.stdout.write("\r%s" % message)
                if c == "\n":
                    if "quit" == command:
                        done = True
                        break
                    print("\rThe command was: %s" % command)
                    command = ""
                    message = "\rEnter command: " + command
                    sys.stdout.write("\r%s" % message)
                if 127 == ord(c):
                    command = command[:-1]
                    sys.stdout.write("\rEnter command: %s \b" % command)
                sys.stdout.flush()

            except IOError:
                    pass

答案 1 :(得分:0)

答案是 - 不要为控制台写实时!如果您想要基于文本进行此操作,您可能希望切换到Tkinter。这将允许您单独执行这些操作 - 并且还在这些定期事件期间显示文本,使用简单的.after()调用来执行它们。

答案 2 :(得分:0)

  1. 对每次输入后的时间进行采样(由您决定是仅对成功命令执行还是选择包含无效命令)。

  2. 将此时间与之前的样本进行比较,并除以某个世界时间间隔。

  3. 迭代每个tick(for npc in npcs: npc.move_to_adjacent_posn(),例如)发生的活动列表。

答案 3 :(得分:0)

我不确定如何在不使用单独的线程的情况下执行此操作(并且很容易使用单独的线程)。

但我的观点是:看起来你的基于文本的功能是一个基于事件/命令的应用程序?即如果用户没有进一步的命令/事件,客户端状态将不会改变?不确定您要使用定时功能监视什么,但如果您的应用程序不是基于事件的,即从用户执行/发送的事件集合聚合状态,那么您可能希望使您的应用程序成为事件基于,然后你可以摆脱定时功能。希望有所帮助。