在while循环中一次运行代码的最佳方法?

时间:2018-11-12 19:39:25

标签: python tkinter while-loop game-loop

我正在为一个类编写基于文本的RPG,并且陷入了代码困境...

from tkinter import *
...
runOnce = False
nextRun = False
"""Main Loop"""

while True:
    #New Game initialize
    if you.rName == None and runOnce == False:
        log("What is your name, adventurer?", eventLog)
        runOnce = True
    if you.rName != None and nextRun == False:
        log(f'What is your profession, {you.rName}?', eventLog)
        nextRun = True

#keypresses
playerInput.bind("<Return>", keyPress)
playerInput.bind("<FocusIn>", focusIn) 

top.update()
top.update_idletasks()

我目前所用的东西,但是还有更多的if语句类型的情况需要在继续下一条语句之前进行响应。循环是在游戏运行时不断更新GUI。

如何在while循环中有效地对需要响应的内容进行编码?

2 个答案:

答案 0 :(得分:0)

看到澄清后,我同意这些动作不应属于循环的评论。这些应该是在主游戏循环之前收集的所有数据。

如果要遍历这些内容以验证输入,则可以使用单独的循环:

while not you.name:
   you.name = input('Enter name: ')
   # some additional validation text if necessary...

while not you.job:
   you.job = input('Enter job: ')
   # some additional validation text if necessary...    
while True:
   # main game loop requiring you.name, you.job

另一种方法有些人为。您可以在主循环之前预定义这些函数,并创建一个RunOnce类以仅执行一次这些函数:

class RunOnce(object):
    def __init__(self, func):
        self.func = func
        self.ran = False

    def __call__(self):
        if not self.ran:
            self.func()
            self.ran = True
    # once the function has been called, 
    # flip self.ran so it won't fire again.

# Decorate your functions with this special class
@RunOnce
def get_name():
    you.name = input('Enter Name: ')

@RunOnce
def get_job():
    you.job = input('Enter Job: ')

然后在主游戏循环中:

while True:
    get_name()    # this will run once
    get_job()     # this too will run once
    get_name()    # this won't run anymore
    get_job()     # this neither.

这种方法的好处是,如果需要,它可以让您灵活地重新运行该功能:

get_name()             # get_name.ran becomes True
get_name.ran = False   # reset the flag
get_name()             # this will run again.

我还是要说,重组代码更好,这样只需要捕获一次的内容就可以保留在主循环之外。

答案 1 :(得分:-1)

在使用参数之前,请尝试检查它们是否为null。如果您正在寻找用户输入,则可以执行以下操作:

userInput = None
while True:     
    userInput = input("Do the thing only once") if userInput is None else userInput
    ...