我如何编写一个可以从另一个def调用变量的程序?

时间:2016-10-28 18:26:30

标签: python

所以我开始制作一个简单的刽子手游戏,一切正常,整个代码都有效,但是当游戏结束时,它缺乏允许用户重放的能力。因此,我开始将我编写的所有代码放在各种函数中。这样我就可以在需要时调用这些函数(我认为这是允许重放能力的最合理的方式)。随之而来的是各种问题,但其中一个突出。

主要罪魁祸首(我认为)是我无法成功获得值全局更新。我在网站上看过类似的问题,但无法成功地适应我的情况。我有一个示例代码来说明我的意思:

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()只是一个带倒计时的延迟功能。

6 个答案:

答案 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

之外的变量中