几个人用一副扑克牌玩游戏,游戏过程通常有洗牌、发牌、理牌等动作,编写程序模拟游戏过程。新牌花色顺序为♠、♥、♣、♦,花色相同时按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])