如何将我在文本冒险(函数)中的位置保存到文件中?
How do I save my place in a text adventure (a function) to a file?
我正在开始一个初级的文字冒险游戏。我有一个原型可以工作,但是因为每个选择都是一个函数,所以我不知道如何安全地将我的位置保存在文件中。
我考虑过将函数的名称保存到文件中,但在读取文件后,我想不出一个从函数名称中获取函数的好方法 str
。 eval
在任意 str
上是出了名的不安全。我考虑过 dict
将每个函数映射到它的名称作为 str
,但似乎随着更多选择的堆积,这个 dict
会使我的脚本膨胀。
def choice1():
while True:
text = input("A or B?: ")
if text == "A":
return False, choice2
elif text == "B":
saygameover()
return True, None
elif askedforsave(text):
return True, choice1
else:
saytryagain()
def choice2():
while True:
text = input("C or D?: ")
if text == "C":
print("you win!")
return True, None
elif text == "D":
saygameover()
return True, None
elif askedforsave(text):
return True, choice2
else:
saytryagain()
def askedforsave(text):
if text == "save":
return True
else:
return False
def saytryagain():
print("try again...")
def saygameover():
print("game over.")
def play(choice = choice1):
done = False
while not done:
done, choice = choice()
if choice != None:
save(choice)
def save(choice):
pass
def load(file):
pass
return choice
这就是我到目前为止所得到的。当我已经在 globals()
中检查名称时,isidentifier
可能是不必要的,但这是确保您使用有效的 Python 名称而不是表达式的好技巧。
import types
def load(string):
# if string is valid Python name
if (string.isidentifier() and
# if string in this global scope's symbol table
string in (thisglobal := globals()) and
# if object is a non-builtin function
isinstance(something := thisglobal[string], types.FunctionType)):
return something
else:
return nogame
def nogame():
return True, None
我正在开始一个初级的文字冒险游戏。我有一个原型可以工作,但是因为每个选择都是一个函数,所以我不知道如何安全地将我的位置保存在文件中。
我考虑过将函数的名称保存到文件中,但在读取文件后,我想不出一个从函数名称中获取函数的好方法 str
。 eval
在任意 str
上是出了名的不安全。我考虑过 dict
将每个函数映射到它的名称作为 str
,但似乎随着更多选择的堆积,这个 dict
会使我的脚本膨胀。
def choice1():
while True:
text = input("A or B?: ")
if text == "A":
return False, choice2
elif text == "B":
saygameover()
return True, None
elif askedforsave(text):
return True, choice1
else:
saytryagain()
def choice2():
while True:
text = input("C or D?: ")
if text == "C":
print("you win!")
return True, None
elif text == "D":
saygameover()
return True, None
elif askedforsave(text):
return True, choice2
else:
saytryagain()
def askedforsave(text):
if text == "save":
return True
else:
return False
def saytryagain():
print("try again...")
def saygameover():
print("game over.")
def play(choice = choice1):
done = False
while not done:
done, choice = choice()
if choice != None:
save(choice)
def save(choice):
pass
def load(file):
pass
return choice
这就是我到目前为止所得到的。当我已经在 globals()
中检查名称时,isidentifier
可能是不必要的,但这是确保您使用有效的 Python 名称而不是表达式的好技巧。
import types
def load(string):
# if string is valid Python name
if (string.isidentifier() and
# if string in this global scope's symbol table
string in (thisglobal := globals()) and
# if object is a non-builtin function
isinstance(something := thisglobal[string], types.FunctionType)):
return something
else:
return nogame
def nogame():
return True, None