python炸金花并对比结果

#!usr/bin/env python
# -*- coding: utf-8 -*-
"""
编写炸金花游戏程序

自己写一个程序,实现发牌、比大小判断输赢。

#### 游戏规则:

一付扑克牌,去掉大小王,每个玩家发3张牌,最后比大小,看谁赢。

有以下几种牌:

豹子:三张一样的牌,如3张6.

顺金:又称同花顺,即3张同样花色的顺子, 如红桃 5、6、7

顺子:又称拖拉机,花色不同,但是顺子,如红桃5、方片6、黑桃7,组成的顺子

对子:2张牌一样

单张:单张最大的是A

这几种牌的大小顺序为, **豹子>顺金>顺子>对子>单张**
"""
import random


def gen_all_cards():
    """
    生成所有扑克牌
    :return:
    """
    colors = ["diamond", "club", "heart", "spade"]
    card_enumerate = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
    all_card_dict = {}
    for color in colors:
        for index, item in enumerate(card_enumerate):
            card = "{}{}".format(color, item)
            # 借助数组的顺序来判定牌的大小
            all_card_dict[card] = [index, color]
    return all_card_dict


def allocate_playing_cards(all_cards, player_num):
    """
    给指定个数玩家分配纸牌
    :param all_cards:
    :param player_num:
    :return:
    """
    gen_all_cards()
    player_index_result = {}
    for player_index in range(1, player_num + 1):
        card_result = random.sample(all_cards, 3)
        player_index_result[player_index] = card_result
        for card in card_result:
            all_cards.remove(card)
    return player_index_result


def is_consecutive_numbers(card_index_list):
    """
    是否是连续的三个数字
    :param card_index_list:
    :return:
    """
    result = False
    _card_index_list = sorted(card_index_list)
    if _card_index_list[0] + 1 == _card_index_list[1] and _card_index_list[0] + 2 == _card_index_list[2]:
        result = True
    return result


def gen_level_and_score(player_card_result, all_cards_dict):
    """
    生成牌的类别和得分
    :param player_card_result:
    :param all_cards_dict:
    :return:
    """
    level = 0
    card_index_list = []
    color_set = set()
    same_card_index_score = 0
    for card in player_card_result:
        card_index, color = all_cards_dict[card]
        if card_index in card_index_list:
            same_card_index_score = card_index
        card_index_list.append(card_index)
        color_set.add(color)
    score = max(card_index_list)
    color_num = len(color_set)
    card_index_set_num = len(set(card_index_list))

    if card_index_set_num == 1:
        level = 5  # 豹子
    elif color_num == 1:
        if is_consecutive_numbers(card_index_list):
            # 顺金
            level = 4
        else:
            # 金花
            level = 3
    elif is_consecutive_numbers(card_index_list):
        # 顺子
        level = 2
    elif card_index_set_num == 2:
        # 对子
        level = 1
        # 只有这个特殊,需要获取对子的下标值作为得分,其余都是按最大牌算得分
        score = same_card_index_score
    return level, score


def main():
    all_cards_dict = gen_all_cards()
    all_cards = list(all_cards_dict.keys())
    player_index_result = allocate_playing_cards(all_cards, player_num=5)
    print(player_index_result)
    max_level = 0
    level_score_list = []
    for player_index, player_card_result in player_index_result.items():
        level, score = gen_level_and_score(player_card_result, all_cards_dict)
        print(player_card_result, level, score)
        level_score_list.append([level, score, player_index])
    _level_score_list = sorted(level_score_list, reverse=True)
    print(_level_score_list)
    print('第{}号玩家取胜'.format(_level_score_list[0][-1]))


if __name__ == '__main__':
    main()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值