我正在为一个类编写基于文本的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循环中有效地对需要响应的内容进行编码?
答案 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
...