【问题标题】:Python3 dice game, how to rank players based on their scores?Python3骰子游戏,如何根据分数对玩家进行排名?
【发布时间】:2020-12-19 05:01:42
【问题描述】:

我在这里创建一个骰子游戏。到目前为止,我已经创建了游戏来询问有多少玩家,并将每个玩家的分数保存在字典中。

现在,我想使用该分数并在玩家之间进行比较,以便在游戏结束时每个玩家都知道他们的排名。

我想要这样的东西会打印出“5th: Mike”、“6th: Steve:”。我真的不知道该怎么做。希望你们能帮帮我,这是代码。

from random import randint


def main():
    player = int(input('How many players> '))
    step = 1
    player += 1
    player_dict = {}
    scores_dict = {}

    for pl in range(1, player, step):
        player_name = input(f'Player {str(pl)} name> ') # Get players name from user input
        player_dict[pl] = player_name

    for x in player_dict:
        score = roll_dice(player_dict[x])
        scores_dict[player_dict[x]] = score


def roll_dice(player_name):
    start_rolling = input(f'{player_name} roll dice? y/n> ')
    if start_rolling == 'y' or start_rolling == 'Y':
        roll = randint(1, 6)
        print(f'{player_name} rolls a {roll}')
        return roll
    return

main()

【问题讨论】:

    标签: python python-3.x dice


    【解决方案1】:

    最简单的方法可能是通过将scores_dict合并到player_dict中来消除scores_dict,并让玩家dict的值成为一个二人列表,如下所示:

        player_dict = {} 
    
        for pl in range(1, player, step):
            player_name = input(f'Player {str(pl)} name> ') 
            player_dict[pl] = [player_name, 0]  #each dict value is a list, initial score = 0
    
        for x in player_dict:
            score = roll_dice(player_dict[x][0]) #the player name is at list index 0
            player_dict[x][1] = score #the player score is at list index 1
        
        results = [x for x in player_dict.items()] #make a sortable list from the dict
        #sort the list in reverse order, using a key function that looks at scores:
        sorted_results = sorted(results, key=lambda x: x[1][1], reverse=True) 
    
        print([x[1] for x in sorted_results]) #view a ranked list of players & scores
    

    【讨论】:

      【解决方案2】:

      首先想到的是可能存在重复的分数,这需要处理。您可以通过.values() 方法获取字典的所有值。您可以使用set() 删除重复项。您可以使用sorted(the_list, reverse=True) 来获得最高分。 (在 Py3.8 中,sorted() 将接受一个集合作为输入。)然后遍历排序列表,这将为您一次提供一个值,并使用该值遍历玩家列表以查看谁得到了该值得分,打印出他们的名字。你可能想要这样的东西:

      1st: Adam
      2nd: Bob and Barry are tied
         :
         :
      5th: Mike
      6th: Steve
      

      可能是这样的:

      for index, score in enumerate(sorted(set(scores_dict.values()), reverse=True):
          player_list = [p for p in player_dict.values() if score_dict[p] == score]
          if len(player_list) == 1:
              print("{rank}: {player}".format(rank=index+1, player=player_list[0]))
          else:
              print("{rank}: {players} are tied".format(rank=index+1, players=' and '.join(player_list)))
      

      enumerate() 是一个很棒的例程,可以为返回值添加编号。

      [p for p in player_dict.values() if score_dict[p] == score] 是一个列表推导式,它根据输入语句创建一个列表。
      [x*x for x in [0, 1, 2]] 将返回 [0, 1, 4]

      [x*x for x in [0, 1, 2] if x

      另外,作为旁注,不清楚您是否需要两个 dicts 来存储此数据。您可能只有 player_dict,并且将玩家名称作为键,将分数作为值,除非您出于某种原因确实需要保留玩家编号 id。

      【讨论】:

        猜你喜欢
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-13
        • 1970-01-01
        • 2013-06-05
        • 1970-01-01
        • 2019-05-19
        相关资源
        最近更新 更多