用Python写炸金花代码,学习python语言精品案例

以下代码对于练习python相关的条件循环语句、自定义函数及函数调用、列表、字典、变量运算、基本逻辑等的练习很有帮助,特别是如何使用python语言解决实际问题的思路,且具有一定趣味性,对于Python新手是一个很好的实例。

(代码是实现逻辑的重要手段,其中逻辑是根本,代码是手段。逻辑可以在学习代码基础语法过程中慢慢培养,有一定天花板,吃天赋,但通过练习足以应付大多数工作场景逻辑。不管如何,代码基础语法是根基,一定得靠不断的练习,读万卷书才能拨云见雾。加油,少年。。。)

炸金花的代码,依照以下逻辑:
1.定义玩家数量
2.生成52张扑克牌
3.每一位玩家随机发三张牌
4.对每位玩家得到的牌进行排序,方便后续对不同类型的牌打分
5.对不同类型的牌进行打分,分以下几种情况:
    单牌:分配大中小牌得分权重(大牌*100,中牌*10,小牌*1)。
    对子:这里需要满足一种情况,最小的对子得分一定要大于最大的单牌得分(如最小对子2 2 3得分一定要大于最大的单牌J K A得分,通过单牌规则J K A得分是1541,如果用(2+2)*500+3=2003,此时满足情况),所以计算规则是:对子得分 = (对子数字加和)*500+剩下单牌,用于比较对子大小。
    顺子:基本规则是最小顺子得分大于最大对子得分(2 3 4得分一定要大于K A A得分,通过对子规则K A A得分是14013,如果用(2+3+4)*2000=18000,此时满足情况),所以计算规则是:
        顺子得分 = (顺子加和)*2000。
    同花:基本规则是最小同花得分大于最大顺子得分(同花2 3 5得分一定大于Q K A),计算规则是:同花得分 = (单牌加和)*10000
    同花顺:同时满足顺子和同花,基于顺子和同花累加出来分数已经达到较高权重,这里无需代码
    豹子:基本规则是最小豹子得分大于最大同花顺得分(豹子2 2 2得分一定大于同花Q K A),计算规则是:豹子得分 = 单牌之一*3*200000000
6.对以上计算得到的得分进行排序,得出最后排名。
import random
import operator

# 1 定义玩家数量
def build_player_list():
    player_list = []  # 空列表用于装所有的玩家
    # 通过输入的玩家数量,自动生成对应玩家名字并装入列表
    for num in range(1, player_nums + 1):
        player = f"player{num}"
        player_list.append(player)
    print(f"玩家有以下{player_nums}位屌丝:", player_list)
    return player_list

# 2 生成52张扑克牌
def build_52_cards():
    poker_marks = ["♠(Spade)", "♥(Heart)", "♣(Club)", "♦(Diamond)"]  # 四种花色的列表
    poker_nums = [2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K", "A"]  # 对应的13张牌
    poker_list = []  # 空列表装所有的的52张牌
    for i in poker_marks:   # 将52张牌装入空列表
        count = 2
        for j in poker_nums:
            card = [f"{i}{j}", count]
            count += 1
            poker_list.append(card)
    # print(poker_list) #用于打印生成的扑克牌,这里隐藏,去掉句首#即可显示
    return poker_list

# 3 发牌
def acquired_cards(player_list, poker_list):    #定义发牌的函数,每人随机获取三张牌
    player_cards_dic = {}
    for person in player_list:
        person_cards = random.sample(poker_list, 3)
        for card in person_cards:
            poker_list.remove(card) #通过remove除掉已经发过的牌,避免重复发牌
        player_cards_dic[person] = person_cards
        print(f"为玩家{person}生成了牌", person_cards)
    return player_cards_dic

# 4 得到的牌从小到大排序
def card_sort(lis):
    from operator import itemgetter #引入itemgetter函数对列表排序
    lis.sort(key=itemgetter(1)) #自小到大排序
    return lis

# 5 对可能出现的牌的类型分别进行比较
# # 单牌
def single_type(person_cards, score):
    weight_val = [1,10,100]
    score = person_cards[0][1]*weight_val[0]+person_cards[1][1]*weight_val[1]+person_cards[2][1]*weight_val[2]
    print("计算单牌得分", person_cards, score)
    return score
# # 对子
def pair_type(person_cards, score):
    value_set = {i[1] for i in person_cards}
    if len(value_set) == 2:
        if person_cards[0][1] == person_cards[1][1]:
            score = int(person_cards[1][1]) * 2 * 500 + int(person_cards[2][1])
        else:
            score = int(person_cards[1][1]) * 2 * 500 + int(person_cards[0][1])
    print("计算对子得分", person_cards, score)
    return score
# # 顺子
def straight_type(person_cards, score):
    if person_cards[1][1]-person_cards[0][1] == 1 and person_cards[2][1] - person_cards[1][1] == 1:
        score = person_cards[1][1]*3*2000
    print("计算顺子得分", person_cards, score)
    return score
# # 同花
def color_type(person_cards, score):
    type_set = {i[0][0] for i in person_cards}
    if len(type_set) == 1:
        score *= 10000
    print("计算同花得分", person_cards, score)
    return score
# # 豹子
def leopard_type(person_cards, score):
    leopard_value = {i[1] for i in person_cards}
    if len(leopard_value) == 1:
        score *= 200000000
    print("计算豹子得分", person_cards, score)
    return score

# 6.调用上面函数以实现赢家排序
player_nums = int(input("请输入玩家数量(大于1个玩家,小于17个玩家):"))  # 输入玩家数量
player_list = build_player_list()   #调用build_player_list函数,生成玩家
poker_list = build_52_cards()   #调用build_52_cards()函数,生成52张扑克牌
player_cards_dic = acquired_cards(player_list, poker_list)  #调用acquired_cards()函数
score_funcbyfunc = [single_type, pair_type, straight_type, color_type, leopard_type]    #按顺序调用不同牌型对应函数并统计得分,放入列表
results = []     #空列表用于装最后结果
for player, person_cards in player_cards_dic.items():
    person_cards = card_sort(person_cards)  #调用排序函数,将牌从小到大排序
    print(f"开始计算玩家{player}的得分,最后项为最终得分:")
    score = 0
    for i_func in score_funcbyfunc:
        score = i_func(person_cards, score) # 传入参数
    results.append([player, score]) #玩家对应得分统计放入列表

winner = card_sort(results) #得分排序
print(winner)
print("************************************")
count = 1
for i in winner:
    print(f"第{count}名是:", winner[-count])
    count += 1
print("------------------------------------")
print(f"最后的赢家是{winner[-1]}")

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值