Python3骰子游戏,如何根据得分对玩家进行排名?

时间:2020-08-31 04:03:37

标签: python python-3.x dice

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

现在,我想使用该分数并在玩家之间进行比较,因此在游戏结束时,每个玩家都会知道自己的排名。

我希望这样的东西可以打印出“第五名:迈克”,“第六名:史蒂夫:”。我真的不知道该怎么做。希望你们能帮助我,这是代码。

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

2 个答案:

答案 0 :(得分:0)

最简单的方法可能是通过将scores_dict合并到player_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

答案 1 :(得分:0)

首先想到的是可能存在重复的乐谱,需要处理。您可以通过.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]是一个列表理解,它从输入语句创建一个列表。
[[*,1,2]中x的x * x将返回[0,1,4]

[x * x表示[0,1,2]中x的值,如果x <2]添加条件并返回[0,1]

此外,作为一个旁注,不清楚此数据是否需要两个字典。除非您出于某种原因确实需要保留玩家编号id,否则您可能只需要player_dict,并以玩家名称作为键,并以得分作为值。