我正在为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))
答案 0 :(得分: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
答案 1 :(得分: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])