几个人用一副扑克牌玩游戏,游戏过程通常有洗牌、发牌、理牌等动作,编写程序模拟游戏过程。新牌花色顺序为♠、♥、♣、♦,花色相同时按2、3、4、5、6、7、8、9、10、J、Q、K、A,最后是小王和大王,小王用’jokers’、大王用 ‘JOKERS’表示。
输入参与游戏的人数,正整数,题目限定使每个人分到的牌数相同,即人数为54的约数
要求
- 先按顺序输出新牌
- 洗牌
- 按洗好的顺序输出洗过的牌
- 将牌轮流分给参与游戏的人,按分牌的顺序输出每个人手上的牌
- 对每个人手上的牌升序排序并输出
- 输出时,每张牌间用空格分隔
示例:
参与游戏的人数: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
洗牌顺序
♦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
每个人手上分到的牌
♦Q ♦9 ♠8 ♣A ♥5 ♦K ♥K ♣4 ♥3 ♦3 ♠A ♣2 ♥4 ♦8 ♠Q ♣7 ♠2 ♣3
♥A ♦5 ♣J ♣10 ♦2 ♥7 ♣K ♦A ♣8 ♠J ♥J ♦6 ♠6 ♣9 ♦4 ♣5 JOKERS ♠4
♦7 ♠3 ♥8 ♠5 ♦J ♠9 ♠K ♠7 ♥10 ♦10 ♠10 ♥Q ♥9 jokers ♥6 ♥2 ♣6 ♣Q
每个人手上排序的牌
♠2 ♠8 ♠Q ♠A ♥3 ♥4 ♥5 ♥K ♣2 ♣3 ♣4 ♣7 ♣A ♦3 ♦8 ♦9 ♦Q ♦K
♠4 ♠6 ♠J ♥7 ♥J ♥A ♣5 ♣8 ♣9 ♣10 ♣J ♣K ♦2 ♦4 ♦5 ♦6 ♦A JOKERS
♠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中出现的位置次序相同。
desigh = ['♠', '♥', '♣', '♦'] # 表示黑桃、红桃、梅花、方块
print(sorted(['♠', '♥', '♣', '♦'] ))
# ['♠', '♣', '♥', '♦'] 说明原顺序与字符串顺序不同,不能直接按花色排序
# 花色也按出现首次出现顺序排序
num = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:]))))
import random
def start():
"""初始顺序,返回元素为字符串的列表"""
cards_start = [i + j for i in desigh for j in num] + ghost
return cards_start
def shuffle_cards(cards_start):
"""打乱顺序,返回元素为字符串的列表"""
random.shuffle(cards_start)
return cards_start
def traver(cards_shuffle, m):
"""发牌给m个人,返回二维列表"""
person = []
for i in range(m):
person.append(cards_shuffle[i::m])
return person
def sort_cards(person, m):
"""对m个人手上的牌进行升序排序,花色按黑红梅方,牌面按点数,大王最大,小王第二大"""
person_sort = []
for i in range(m):
if ('jokers' in person[i]) and ('JOKERS' in person[i]):
person[i].remove('jokers')
person[i].remove('JOKERS')
person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:])))+['jokers', 'JOKERS'])
elif 'jokers' in person[i]:
person[i].remove('jokers')
person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:])))+['jokers'])
elif 'JOKERS' in person[i]:
person[i].remove('JOKERS')
person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:])))+['JOKERS'])
else:
person_sort.append(sorted(person[i], key=lambda x: (desigh.index(x[0]), num.index(x[1:]))))
return person_sort
if __name__ == '__main__':
desigh = ['♠', '♥', '♣', '♦'] # 表示黑桃、红桃、梅花、方块
num = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
ghost = ['jokers', 'JOKERS']
n = int(input()) # 输入参与游戏的人数
s = int(input())
random.seed(s)
print(f'参与游戏的人数:{n}')
cards = start()
print('新牌顺序')
print(*cards)
cards_after = shuffle_cards(cards)
print('洗牌顺序')
print(*cards_after)
cards_n = traver(cards_after, n)
print('每个人手上分到的牌')
for i in range(n):
print(*cards_n[i])
cards_sort = sort_cards(cards_n, n)
print('每个人手上排序的牌')
for i in range(n):
print(*cards_sort[i])