首页 > 解决方案 > 尝试在不使用全局变量的情况下让代码通过并保留统计信息

问题描述

编码新手,尝试简单的石头、纸、剪刀游戏。需要在用户退出时显示统计信息,而不使用全局方差。目前,无论循环运行多少次,它都只会打印 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)

标签: pythonpython-3.x

解决方案


您想根据代码的功能将代码分成函数 不要处理实际游戏的函数中包含用于跟踪统计信息的代码。相反,让游戏返回结果并在游戏函数之外增加正确的计数器。例如,

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

推荐阅读