2016-09-23 104 views
0

我正在编写一个程序来模拟我的compSci类的Bunko游戏,但我遇到的问题得到函数scoreCalc来修改全局变量playerScore。游戏让玩家对着计算机,所以我希望能够使用一个函数来确定分数,并且只是通过一个参数来分别增加正确的分数。但是,该功能不会在多次播放中保存playerScore的值,每轮都重置为0。我对功能很陌生,所以我确信这个问题可能是微不足道的,但我非常感谢所有帮助!函数没有更新全局变量

dieList = [] 
sixCount = 0 
playerScore = 0 


def rollDice():  
    global sixCount 
    sixCount = 0 
    dieList.clear() 

    die1 = random.randint(1,6) 
    die2 = random.randint(1,6) 
    die3 = random.randint(1,6) 

    dieList.append(die1) 
    dieList.append(die2) 
    dieList.append(die3) 

    print(dieList) 

    for x in dieList: 
     if x == 6: 
      sixCount += 1 
    print("sixCount:", sixCount) 
    return 


def scoreCalc(x): 
    if sixCount == 1: 
     x += 1 
    elif sixCount == 2: 
     x += 5 
    elif sixCount == 3: 
     x += 21 
    return x 


print() 
print("Player's turn!") 
print('*' * 30) 
input("Press ENTER to roll the dice") 
print() 
rollDice() 
print("Score:", scoreCalc(playerScore)) 

回答

1

你清楚的知道如何修改了一个全局变量,你为sixCount。你可能曾经用playerScore来做这件事,但是当试图使这个功能对计算任何人的分数有用时(在OP中陈述的目标)就改变了它。

为了使功能像一个功能一样工作,它需要是一个功能。这意味着它需要一个输入并给出一个输出,而没有其他问题。然后你只需要使用那个输出。

def scoreCalc(sixCount): 
    x = 0 
    if sixCount == 1: 
     x += 1 
    elif sixCount == 2: 
     x += 5 
    elif sixCount == 3: 
     x += 21 
    return x 

# now use it 
playerScore += scoreCalc(sixCount) 

请注意scoreCalc如何不关心任何全局变量。它只是给出了它的输入分数。然后,您将该分数应用于其所属的位置。

这些功能也可能有用。最好不要给他们任何全局变量。处理他们关心的结果,并让这些功能完成他们的工作,而不是别的。

# return a list of d6 outputs 
def rollDice(number_of_dice): 
    return [random.randint(1,6) for _ in range(number_of_dice)] 

# takes a list of d6 outputs and returns the count of sixes  
def countSixes(dieList): 
    return sum([1 for x in dieList if x==6]) 
+0

谢谢!这正是我一直在寻找的:) – npburns224

5

如果传递playerScore作为参数,然后做的操作就可以了函数内,全局变量playerScore不会改变

为什么? Python中的数字是immutable

等等,什么?是的,当您对数字进行任何操作并使用结果填充某个变量(例如i += 2),时,会创建一个新的数字对象。所以,当你通过playerScore函数,一个全新的对象正在通过,所以,scoreCalc得到的不是实际的playerScore,而是它的副本。不用说,更改副本不会更改原始内容。

下面将做的伎俩:

def scoreCalc(): 
    global playerScore 

    if sixCount == 1: 
     playerScore += 1 
    elif sixCount == 2: 
     playerScore += 5 
    elif sixCount == 3: 
     playerScore += 21 

    return playerScore 
+0

谢谢你的提示!我不知道数字的属性。你让我有点接近目标,但我仍然想用同样的功能修改计算机得分 – npburns224