python - 尝试在不使用全局变量的情况下让代码通过并保留统计信息
问题描述
编码新手,尝试简单的石头、纸、剪刀游戏。需要在用户退出时显示统计信息,而不使用全局方差。目前,无论循环运行多少次,它都只会打印 win=0,loss=0,tie=0 。寻找一种将胜利、失败和平局作为参数传递并保存它们直到用户退出循环的方法。
def the_game(computer_play,user_play):
win=0
loss=0
tie=0
print('You chose',user_play,',computer chose',computer_play)
if user_play=='Rock':
if computer_play=='Rock':
print("I'ts a tie!")
tie+=1
return tie
elif computer_play=='Paper':
print('Paper covers Rock.\ncomputer wins!')
loss+=1
return loss
elif computer_play=='Scissors':
print('Rock smashes Scissors.\nplayer wins!')
win+=1
return win
elif user_play=='Paper':
if computer_play=='Rock':
print("Paper covers Rock.\nplayer wins!")
win+=1
return win
elif computer_play=='Paper':
print("I'ts a tie!")
tie+=1
return tie
elif computer_play=='Scissors':
print('Scissors cut Paper.\ncomputer wins!')
loss+=1
return loss
else:
if computer_play=='Rock':
print('Rock smashes Scissors.\ncomputer wins!')
loss+=1
return loss
elif computer_play=='Paper':
print('Scissors cut paper.\nplayer wins')
win+=1
return win
elif computer_play=='Scissors':
print("It's a tie!")
tie+=1
return tie
def display_stats(num1,num2,num3):
print('Wins: ',num1,'\nLosses: ',num2,'\nTies: ',num3)
def play_again():
again=input('Want to play again? (y/n): ')
if again=='y':
return True
else:
return False
def main():
win=0
loss=0
tie=0
again=True
displayintro()
while again:
user=get_user_play()
computer=get_computer_play()
the_game(computer,user)
again=play_again()
else:
display_stats(win,loss,tie)
解决方案
您想根据代码的功能将代码分成函数! 不要在处理实际游戏的函数中包含用于跟踪统计信息的代码。相反,让游戏返回结果并在游戏函数之外增加正确的计数器。例如,
def the_game(computer, user):
if <tie condition>:
return 0
elif <win condition>:
return 1
else: # loss
return -1
然后,在你的main()
功能中,
def main():
win=0
loss=0
tie=0
again=True
displayintro()
while again:
user=get_user_play()
computer=get_computer_play()
result = the_game(computer,user)
if result == 1: win += 1
elif result == 0: tie += 1
else: loss += 1
again=play_again()
else:
display_stats(win,loss,tie)
其他轻微改进:
if-elif-else
您可以简单地创建一个字典来定义每个动作会击败哪些动作,而不是编写所有这些嵌套。
winning_moves = { "R": "S", # rock beats scissor
"S": "P", # scissor beats paper
"P": "R" # paper beats rock
}
然后,您有两个条件要检查:
def the_game(computer, user):
if computer == user:
return 0 # this is a tie
elif winning_moves[user] == computer:
return 1 # User's move beats computer's move
else:
return -1
要包含您的单词(“rock scissors”等),您还可以将其添加到您的字典中:
winning_moves = { "R": ("S", "smashes"), # rock smashesscissor
"S": ("P", "cut"), # scissor cuts paper
"P": ("R", "covers") # paper covers rock
}
def the_game(computer, user):
if computer == user:
print("It's a tie!")
return 0 # this is a tie
elif winning_moves[user][0] == computer:
verb = winning_moves[user][1]
message = f"{user} {verb} {computer}.\nYou win!"
print(message)
return 1 # User's move beats computer's move
else:
verb = winning_moves[computer][1]
message = f"{computer} {verb} {user}.\nComputer wins!"
print(message)
return -1