所以我开始制作一个简单的刽子手游戏,一切正常,整个代码都有效,但是当游戏结束时,它缺乏允许用户重放的能力。因此,我开始将我编写的所有代码放在各种函数中。这样我就可以在需要时调用这些函数(我认为这是允许重放能力的最合理的方式)。随之而来的是各种问题,但其中一个突出。
主要罪魁祸首(我认为)是我无法成功获得值全局更新。我在网站上看过类似的问题,但无法成功地适应我的情况。我有一个示例代码来说明我的意思:
def GameMode():
choice = input('Play alone or play with friends? A F : ')
choice = choice.upper()
if choice == 'A':
wordslotmachine = ['stand','emerald','splash']
word = random.choice(wordslotmachine)
word = word.upper()
Rules()
elif choice == 'F':
word = input('Enter your word for your friends to guess: ')
word = word.upper()
Rules()
else:
choice = input('Please enter A or F: ')
choice = choice.upper()
我需要程序记住“单词”的值是什么,并在另一个方法中使用此单词(此方法由“Rules()”下面显示的另一种方法运行):
def MainGame():
guesses = ''
turns = 10
underscore = 0
seconds = 1
checker = 0
cheaterchance = 5
while turns > 0: #check if the turns are more than zero
for char in word: # for every character in secret_word
if char in guesses: # see if the character is in the players guess
print(char+' ', end='')
else:
print('_ ', end='')# if not found, print a dash
underscore += 1
if underscore == 0:
print(': You got it!')
Wait()
NewGame()
break
#A block of if's to check for cheating
if guess not in word:
print('Your guesses so far: '+guesses)
turns -= 1
if turns == 0:
break
else:
print('')
print('Try again. You have',turns,'more guesses')
print('Delayed chance to answer by',seconds,'seconds')
counter = 1
print(0,'.. ', end='')
while counter < seconds:
time.sleep(1)
print(counter,'.. ', end='')
counter += 1
if counter == seconds:
time.sleep(1)
print(counter,'.. done!', end='')
print('')
print('')
seconds += 1
underscore = 0
else:
print('Your guesses so far: '+guesses)
underscore = 0
#The else portion of the code to check for cheating
我尝试在函数之外定义“word”。这样做不能解决问题,GameMode()不会成功更新“word”的值。无论函数外部定义的“word”值是由MainGame()调用和使用的。然而,这样做表明了另一个问题。
就是这样,以前工作的代码(它成功读取输入并正确更新游戏状态)现在不起作用。即使用户输入了正确的字母,程序也会将输入读取为错误。
这是我到目前为止遇到的两个问题,还没有找到克服它们的方法。
注意:我已经成功地创建了一种方法,通过将整个原始代码(没有函数)放在while循环中来使游戏可以重放。但是我仍然非常想知道如何使用函数来使代码工作。
编辑:这是Rules()的功能:
def Rules():
#Bunch of prints to explain the rules
MainGame()
print('Start guessing...')
Wait()只是一个带倒计时的延迟功能。
答案 0 :(得分:2)
全局与局部变量。
您可以在函数中引用和使用全局变量,但不能更改它。
这是一种不好的做法,但是您可以在函数中声明一个变量为全局变量,然后在函数内部对其进行更改将全局应用于同名变量。
但是,我的建议是在你的功能结束时返回这个词。
def whatever_function(thisword):
do some stuff
return word
new_word = whatever_function(thisword)
答案 1 :(得分:0)
函数可以并且通常应该返回值。让GameMode()
将单词返回给调用者;
def GameMode():
choice = input('Play alone or play with friends? A F : ')
choice = choice.upper()
if choice == 'A':
wordslotmachine = ['stand','emerald','splash']
word = random.choice(wordslotmachine)
word = word.upper()
Rules() #ignore this
elif choice == 'F':
word = input('Enter your word for your friends to guess: ')
word = word.upper()
Rules() #ignore this
else:
choice = input('Please enter A or F: ')
choice = choice.upper()
return word
从main
来电GameMode
并保存字词
def MainGame():
guesses = ''
turns = 10
underscore = 0
seconds = 1
checker = 0
cheaterchance = 5
word = GameMode() # add this here
答案 2 :(得分:0)
您几乎肯定想使用class with instance variables
受挫的例子:
class Hangman:
def __init__(self):
print("Starting hangman")
def mode(self):
# ...
self.word = 'whatever'
def play(self):
print("Look i have access to word", self.word)
if __name__ == '__main__':
hm = Hangman()
hm.mode()
hm.play() # may be what you want to put in a while loop
答案 3 :(得分:-1)
要从函数内部访问全局变量,必须告诉python它是全局变量:
my_global_var = 1
def some_func():
global my_global_var
答案 4 :(得分:-1)
你必须在使用全局变量的每个方法中使用global关键字,否则python会认为你正在定义/使用局部变量
话虽如此,你应该避免使用全局作为编码实践。
onSubmit
答案 5 :(得分:-2)
使用代码
global word
在def之上或让def返回word的值,使其存储在def
之外的变量中