几个人用一副扑克牌玩游戏,游戏过程通常有洗牌、发牌、理牌等动作,编写程序模拟游戏过程。新牌花色顺序为♠、♥、♣、♦,花色相同时按2、3、4、5、6、7、8、9、10、J、Q、K、A,最后是小王和大王,小王用’jokers’、大王用 ‘JOKERS’表示。
    输入参与游戏的人数,正整数,题目限定使每个人分到的牌数相同,即人数为54的约数
    要求

    1. 先按顺序输出新牌
    2. 洗牌
    3. 按洗好的顺序输出洗过的牌
    4. 将牌轮流分给参与游戏的人,按分牌的顺序输出每个人手上的牌
    5. 对每个人手上的牌升序排序并输出
    6. 输出时,每张牌间用空格分隔

    示例:

    1. 参与游戏的人数:3
    2. 新牌顺序
    3. 2 3 4 5 6 7 8 9 10 J Q K A 2 3 4 5 6 7 8 9 10 J Q K A 2 3 4 5 6 7 8 9 10 J Q K A 2 3 4 5 6 7 8 9 10 J Q K A jokers JOKERS
    4. 洗牌顺序
    5. Q A 7 9 5 3 8 J 8 A 10 5 5 2 J K 7 9 K K K 4 A 7 3 8 10 3 J 10 A J 10 2 6 Q 4 6 9 8 9 jokers Q 4 6 7 5 2 2 JOKERS 6 3 4 Q
    6. 每个人手上分到的牌
    7. Q 9 8 A 5 K K 4 3 3 A 2 4 8 Q 7 2 3
    8. A 5 J 10 2 7 K A 8 J J 6 6 9 4 5 JOKERS 4
    9. 7 3 8 5 J 9 K 7 10 10 10 Q 9 jokers 6 2 6 Q
    10. 每个人手上排序的牌
    11. 2 8 Q A 3 4 5 K 2 3 4 7 A 3 8 9 Q K
    12. 4 6 J 7 J A 5 8 9 10 J K 2 4 5 6 A JOKERS
    13. 3 5 7 9 10 K 2 6 8 9 10 Q 6 Q 7 10 J jokers

    先按黑桃、红桃、梅花、方块顺序排序(主排序关键字)
    再按牌面点数排序(次排序关键字)
    使用方法:
    key=lambda x: (desigh.index(x[0]), num.index(x[1:])
    因为有字符串”10”的存在,直接比较字符串会得到错误的排序结果,此处排序依据设为与num中出现的位置次序相同。

    1. desigh = ['♠', '♥', '♣', '♦'] # 表示黑桃、红桃、梅花、方块
    2. print(sorted(['♠', '♥', '♣', '♦'] ))
    3. # ['♠', '♣', '♥', '♦'] 说明原顺序与字符串顺序不同,不能直接按花色排序
    4. # 花色也按出现首次出现顺序排序
    5. num = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
    6. person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:]))))
    1. import random
    2. def start():
    3. """初始顺序,返回元素为字符串的列表"""
    4. cards_start = [i + j for i in desigh for j in num] + ghost
    5. return cards_start
    6. def shuffle_cards(cards_start):
    7. """打乱顺序,返回元素为字符串的列表"""
    8. random.shuffle(cards_start)
    9. return cards_start
    10. def traver(cards_shuffle, m):
    11. """发牌给m个人,返回二维列表"""
    12. person = []
    13. for i in range(m):
    14. person.append(cards_shuffle[i::m])
    15. return person
    16. def sort_cards(person, m):
    17. """对m个人手上的牌进行升序排序,花色按黑红梅方,牌面按点数,大王最大,小王第二大"""
    18. person_sort = []
    19. for i in range(m):
    20. if ('jokers' in person[i]) and ('JOKERS' in person[i]):
    21. person[i].remove('jokers')
    22. person[i].remove('JOKERS')
    23. person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:])))+['jokers', 'JOKERS'])
    24. elif 'jokers' in person[i]:
    25. person[i].remove('jokers')
    26. person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:])))+['jokers'])
    27. elif 'JOKERS' in person[i]:
    28. person[i].remove('JOKERS')
    29. person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:])))+['JOKERS'])
    30. else:
    31. person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:]))))
    32. return person_sort
    33. if __name__ == '__main__':
    34. desigh = ['♠', '♥', '♣', '♦'] # 表示黑桃、红桃、梅花、方块
    35. num = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
    36. ghost = ['jokers', 'JOKERS']
    37. n = int(input()) # 输入参与游戏的人数
    38. s = int(input())
    39. random.seed(s)
    40. print(f'参与游戏的人数:{n}')
    41. cards = start()
    42. print('新牌顺序')
    43. print(*cards)
    44. cards_after = shuffle_cards(cards)
    45. print('洗牌顺序')
    46. print(*cards_after)
    47. cards_n = traver(cards_after, n)
    48. print('每个人手上分到的牌')
    49. for i in range(n):
    50. print(*cards_n[i])
    51. cards_sort = sort_cards(cards_n, n)
    52. print('每个人手上排序的牌')
    53. for i in range(n):
    54. print(*cards_sort[i])