2016-09-23 108 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