Python-比较权重

炸金花

实现逻辑:

1、定义好牌面、花色、牌型权重,后续需要把这个3个权重相加,得到最后的权重值;

2、使用循环产生一副牌;

3、将牌分发给玩家;

4、开牌,将每个玩家的牌面按花色、点数从大到小排序;

5、统计各个玩家的权重值;

6、输出权重值最高的玩家;

#!/usr/bin/python
# coding:utf-8
# @Author:Rauck

import random


class Player:
    def __init__(self, name=""):
        self.card = list()  # 玩家拥有的牌存储在card里面,元素类型为元组
        self.name = name  # 玩家姓名
        self.type = ()  # 牌型
        self.scores = 0


class WhoIsBig:
    """
    炸金花
    """
    # 玩家5个
    names = ['#Player1', '#Player2', '#Player3', '#Player4', '#Player5']

    # 每个玩家发牌张数
    circle = 3

    #  花色:方块 < 梅花 < 红心 < 黑桃,数值是权重
    colors_dict = {'方块♦': 0.1, '梅花♣': 0.2, '红心♥': 0.3, '黑桃♠': 0.4}

    # 牌面,数值是权重
    faces_dict = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8,
                  '9': 9, '10': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14}

    # 牌型
    # 豹子:三张一样的牌,如3张6
    # 同花顺:即3张同样花色的顺子,如红桃5、6、7
    # 顺子:又称拖拉机,花色不同,但是顺子,如红桃5、方片6、黑桃7,组成的顺子
    # 对子:2张牌一样
    # 单张: 单张最大的是A
    # 这几种牌的大小顺序为, 豹子>同花顺>同花>顺子>对子>单张
    types_dict = {
        'baozi': ('豹子', 600),
        'tonghuashun': ('同花顺', 500),
        'tonghua': ('同花', 400),
        'shunzi': ('顺子', 300),
        'duizi_before2': ('对子-前二张', 200),
        'duizi_after2': ('对子-后二张', 200),
        'danzhang': ('单张', 100)
    }

    def __init__(self):
        # 牌列表
        self.cards = list()
        self.players = list()

    def create_cards(self):
        """
        生成一副完整的扑克牌,列表[元组]
        :return:
        """
        for f in self.faces_dict:  # 遍历牌面值
            for c in self.colors_dict:  # 遍历花色
                self.cards.append((f"{c}{f}", self.colors_dict[c], self.faces_dict[f]))
        # print(self.cards)

    def create_players(self):
        """
        初始化玩家列表
        :return:
        """
        for name in self.names:
            self.players.append(Player(name))

    def deal_cards(self):
        """
        发牌
        :return:
        """
        # 玩家
        print('轮数/玩家 ', end='')
        for p in self.players:
            print("%15s" % p.name, end='')
        print()

        for i in range(self.circle):
            print('第{0}轮发牌'.format((i + 1)), end='')
            for p in self.players:
                temp = random.choice(self.cards)  # 随机抽牌
                self.cards.remove(temp)  # 从牌组移除这张牌
                p.card.append(temp)  # 将牌加入玩家的card列表里面
                print("%13s" % temp[0], end='')  # 打印牌名称
            print()
        print()

    def get_winner(self):
        """
        整理牌面、计算权重、输出赢家
        :return:
        """
        winner = None
        print("玩家开牌,分别是:")
        for p in self.players:
            p.card = self._sort_one(p.card)
            p.scores, p.type = self._scores_one(p.card)
            print("%-13s %-10s %-10s %-10s 权重:%0.1f(%s)" % (
                p.name, p.card[0][0], p.card[1][0], p.card[2][0], p.scores, p.type[0]))
            if winner is None:
                winner = p
            elif winner.scores < p.scores:
                winner = p

        print(f'\n赢家是:{winner.name}\n')

    def _scores_one(self, card):
        """
        计算单个玩家权重
        :param card:
        :return:
        """
        scores = 0
        if card[0][2] == card[1][2] == card[2][2]:
            # 豹子
            scores += self.types_dict['baozi'][1]
            scores += card[0][1] + card[0][2]
            type_tup = self.types_dict['baozi']

        elif card[0][1] == card[1][1] == card[2][1]:
            if card[0][2] - 1 == card[1][2] and card[1][2] - 1 == card[2][2]:
                # 同花顺
                scores += self.types_dict['tonghuashun'][1]
                scores += card[0][1] + card[0][2]
                type_tup = self.types_dict['tonghuashun']
            else:
                # 同花
                scores += self.types_dict['tonghua'][1]
                scores += card[0][1] + card[0][2]
                type_tup = self.types_dict['tonghua']

        elif card[0][2] - 1 == card[1][2] and card[1][2] - 1 == card[2][2]:
            # 顺子
            scores += self.types_dict['shunzi'][1]
            scores += card[0][1] + card[0][2]
            type_tup = self.types_dict['shunzi']

        elif card[0][2] == card[1][2]:
            # 对子:前二张牌一样
            scores += self.types_dict['duizi_before2'][1]
            scores += card[0][1] + card[0][2]
            type_tup = self.types_dict['duizi_before2']

        elif card[1][2] == card[2][2]:
            # 对子:后二张牌一样
            scores += self.types_dict['duizi_after2'][1]
            scores += card[1][1] + card[1][2]
            type_tup = self.types_dict['duizi_after2']

        else:
            # 单张
            scores += self.types_dict['danzhang'][1]
            scores += card[0][1] + card[0][2]
            type_tup = self.types_dict['danzhang']
        return scores, type_tup

    def _sort_one(self, card):
        """
        单个玩家牌面排序
        :param card:
        :return:
        """
        for i in range(0, self.circle):
            tmp = i
            for j in range(i + 1, self.circle):
                if card[tmp][2] < card[j][2]:
                    # 比较牌面大小
                    tmp = j
                elif card[tmp][2] == card[j][2] and card[tmp][1] < card[j][1]:
                    # 牌面大小相同,则比较花色
                    tmp = j
            if tmp != i:
                change = card[i]
                card[i] = card[tmp]
                card[tmp] = change
        return card

    def main(self):
        self.create_cards()
        self.create_players()
        self.deal_cards()
        self.get_winner()
        pass


if __name__ == '__main__':
    WhoIsBig().main()

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值