黑马程序员技术交流社区

标题: 斗地主简单发牌案例 [打印本页]

作者: 秋几    时间: 2018-10-7 17:07
标题: 斗地主简单发牌案例
import random


class Poke:
    # 定义初始化牌列表和每个玩家发牌后手里牌数的列表
    pokes = []
    player1 = []
    player2 = []
    player3 = []
    last = None

    # 每一张牌为一个对象,给它属性花色和数字
    def __init__(self, flower, num):
        self.flower = flower
        self.num = num

    # 返回一张扑克牌,包含花色和数字
    def __str__(self):
        return "%s%s" % (self.flower, self.num)

    # 因为洗牌,发牌,初始化牌都是针对所有牌操作的,
    # 所以定义为类方法比较好,单个牌洗牌发牌的意义不大

    # 初始化牌
    @classmethod
    def init_poke(cls):
        flowers = ("♠", "♥", "♣", "♦")
        nums = ("2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A")
        kings = {"big": "大王", "small": "小王"}
        for f in flowers:
            for n in nums:
                p = Poke(f, n)
                cls.pokes.append(p)
        cls.pokes.append(kings["big"])
        cls.pokes.append(kings["small"])

    # 洗牌  第一种方法 从牌的第一张开始,随机生成一张互换位置,相当于互换54
    @classmethod
    def wash_poke(cls):
        for i in range(53):
            num1 = random.randint(0, 53)
            Poke.pokes, Poke.pokes[num1] = Poke.pokes[num1], Poke.pokes

    # 洗牌  第二种方法 牌分成两部分,第一部分的选择一张随机插入到后面一部分
    @classmethod
    def wash1_poke(cls):
        for i in range(28, 54):
            Poke.pokes.insert(i, Poke.pokes.pop(0))

    # 发牌
    @classmethod
    def send_poke(cls):
        while True:
            if len(Poke.pokes) <= 3:
                break
            Poke.player1.append(Poke.pokes.pop(0))
            Poke.player2.append(Poke.pokes.pop(0))
            Poke.player3.append(Poke.pokes.pop(0))
        Poke.last = tuple(Poke.pokes)  # 因为底牌不变,做成元组会比较好一点

    # 显示牌的序列状态,在没有发牌以前临时使用
    @classmethod
    def show(cls):
        for a in cls.pokes:
            print(a, end="\t")
        print()

    # 显示玩家以及底牌
    @classmethod
    def player_show(cls):
        print("第一位玩家的牌是:", end="")
        for a in cls.player1:
            print(a, end="\t")
        print()
        print("第二位玩家的牌是:", end="")
        for a in cls.player2:
            print(a, end="\t")
        print()
        print("第三位玩家的牌是:", end="")
        for a in cls.player3:
            print(a, end="\t")
        print()
        print("最后的底牌是:", end="")
        for a in cls.last:
            print(a, end="\t")
        print()


Poke.init_poke()
Poke.show()
# Poke.wash_poke()  # 第一种洗牌方式
Poke.wash1_poke()  # 第二种洗牌方式
Poke.show()
Poke.send_poke()
Poke.player_show()






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2