2016-09-23 4 views
0

J'écris un programme qui simule un jeu de Bunko pour ma classe compSci, mais j'ai des problèmes pour obtenir la fonction scoreCalc pour modifier la variable globale playerScore. Le jeu oppose un joueur à l'ordinateur, donc je voulais être capable d'utiliser une fonction pour déterminer le score et juste passer un argument pour incrémenter le score correct respectivement. Cependant, la fonction n'enregistre pas la valeur de playerScore sur plusieurs jeux, en la réinitialisant à 0 à chaque tour. Je suis nouveau pour les fonctions, donc je suis sûr que le problème est probablement trivial, mais j'apprécie toute aide!Fonction ne mettant pas à jour la variable globale

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)) 

Répondre

1

Vous savez clairement comment modifier une variable globale, que vous avez fait pour sixCount. Vous avez probablement fait cela avec playerScore, mais vous l'avez changé en essayant de rendre la fonction utile pour calculer le score de n'importe qui (objectif déclaré dans l'OP). Pour que la fonction fonctionne comme une fonction, elle doit être ... une fonction. Ce qui signifie qu'il prend une entrée et donne une sortie, et rien d'autre ne compte. Vous avez juste besoin d'utiliser cette sortie.

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) 

Notez que scoreCalc ne se soucie pas des variables globales. Il donne juste le score pour son entrée. Vous appliquez ensuite ce score là où il appartient.

Ces fonctions peuvent également être utiles. Il vaut mieux ne pas leur donner de variables globales. Gérez les résultats là où ils sont importants, et laissez simplement ces fonctions faire leur travail, et rien d'autre.

# 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

Merci! C'est exactement ce que je cherchais :) – npburns224

5

Si vous passez playerScore comme paramètre, puis effectuer des opérations sur l'intérieur d'une fonction, la playerScore variable globale ne sera pas changé.

Pourquoi? Les nombres en Python sont immutable.

Attendez, quoi? Oui, lorsque vous effectuez une opération sur un nombre et remplissez une variable avec le résultat (par exemple i += 2), un nouvel objet nombre est créé. Ainsi, quand vous passez playerScore à une fonction, un nouvel objet entier est passé, donc, ce que scoreCalc obtient n'est pas le playerScore réel, mais sa copie. Inutile de dire que changer la copie ne change pas l'original.

Ce qui suit fera l'affaire:

def scoreCalc(): 
    global playerScore 

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

    return playerScore 
+0

Merci pour le pourboire! Je n'étais pas au courant de cette propriété des nombres. Vous m'avez un peu plus proche de l'objectif, mais je voudrais toujours utiliser la même fonction pour modifier le score de l'ordinateur – npburns224