python实践报告——通过python程序设计实现德州扑克

本文介绍如何使用Python设计一款德州扑克游戏,涉及卡牌类、扑克类和玩家类的实现,包括洗牌、发牌、验证手牌等功能,以及特殊牌型的判断逻辑。通过实例代码和关键点分析,分享项目设计与调试心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

通过python设计程序实现德州扑克


一、项目概述

1.1项目目标和主要内容
设计程序实现德州扑克,共52张手牌,包含四种花色(红心,黑心,方块,梅花),每种花色共13张(A,2,3,4,5,6,7,8,9,10,J, Q, K)。
1.2项目的主要功能
1)洗牌功能
2)发牌功能
3)验证手牌
皇家同花顺(同一个花色五张连牌 A K Q J 10)
同花顺(同一个花色7 8 9 10 J)
四条(x x x x+y)
满堂红(x x x+ y y)
同花 (5张同一花色)
顺子 (不同花色组成的顺子)
三条 (x x x + y z)
两对 (x x y y + z)
一对 (x x y z c)
普通牌

二、项目实现

1.引入库

代码如下:

import random

2.实现卡牌类

代码如下:

class Card:
    """卡牌"""
    def __init__(self):
        # 一张卡牌是由花色+点数构成的
        self.__color = ''
        self.__value = 1
    @property
    def color(self):
        return self.__color

    @color.setter
    def color(self, value):
        if isinstance(value, str):
            self.__color = value
    
    @property
    def value(self):
        return self.__value

    @value.setter
    def value(self, value):
        if isinstance(value, int):
            if value < 1 or value >= 14:
                self.__value = 1
            else:
                self.__value = value
    
    def __str__(self):
        """
        重写该方法的目的是为了输出对象的时候,输出我们想要的信息
        """
        # 构造特殊点数的映射关系
        special_point = {1: 'A', 11: 'J', 12: 'Q', 13: 'K'}
        # 判断
        if self.value in special_point:
            # 替换
            str_value = special_point[self.__value]
        else:
            str_value = str(self.__value)
        return self.color + str_value + " "

3.实现扑克类

代码如下:

class Poke:
    def __init__(self):
        """
        初始化一副扑克
        """
        # 花色
        poke_color = ['红桃', '黑桃', '方块', '梅花']
        # 点数
        poke_point = [value for value in range(1, 14)]
        # 存储牌
        self.poke = []
        # 定义索引
        index = 0
        # 构造扑克
        for i in range(4):
            for j in range(13):
                # 1. 创建card
                card = Card()
                # 2. 将生成的card装入扑克中
                self.poke.append(card)
                # 3. 设置card的花色和点数
                self.poke[index].color = poke_color[i]
                self.poke[index].value = poke_point[j]
                # 4. 索引递增
                index += 1

    def show(self, poke):
        """显示所有的扑克"""
        index = 0
        for card in poke:
            if index % len(poke) == 0:
                print("")
            print(card, end='')
            index += 1
        print("")

    def shuffle(self):
        """洗牌"""
        random.shuffle(self.poke)

    def deal_poke(self, start=0, end=5, step=1):
        """发牌"""
        return self.poke[start:end:step]

4.实现玩家类

代码如下:

class Player:
    """玩家类"""
    def __init__(self, player_id, player_name, player_money):
        self.player_id = player_id
        self.player_name = player_name
        self.player_money = player_money
        # 玩家获取的手牌
        self.hand_card = []
        # 是否为同一花色
        self.is_samecolor = False
        # 是否为顺子
        self.is_straight = False

    def hand_poke(self, card):
        """玩家持有的手牌"""
        self.hand_card = card

    def judge_poke(self):
        """验证牌型"""
        # 1. 将card拆分(花色和点数分别拆出来)
        hand_colors = [x.color for x in self.hand_card]
        hand_values = [x.value for x in self.hand_card]

        # [梅花 方块 红桃 梅花 黑桃] => set          [A 7 8 6 A] => 
        hand_colors_set = set(hand_colors)
        hand_values_set = set(hand_values)

        if len(hand_colors_set) == 1:
            # 判断是否为同一花色
            self.is_samecolor = True
        if len(hand_values_set) == 5 and max(hand_values_set) - min(hand_values_set) == 4:
            # 判断是否为顺子
            self.is_straight = True

        if self.is_samecolor and self.is_straight:
            print("同花顺")
            return 10
        elif self.is_samecolor:
            print("同花")
        elif self.is_straight:
            print("顺子")
        elif len(hand_values_set) == 5:
            print("基础牌")
        elif len(hand_values_set) == 4:
            print("一对子")
        else:
            # 四条 满堂红 三条 两对
            # 四条: 4 4 4 4 5 => (4, 5)  => [4, 1]    44433 [3, 2]  44435 [3, 1, 1]
            counts = [hand_values.count(x) for x in hand_values_set]
            if max(counts) == 4:
                print("四条")
            elif max(counts) == 3 and len(counts) == 2:
                print("满堂红")
            elif max(counts) == 3:
                print("三条")
            else:
                print("两对")

总结

这里对文章进行总结:
1项目的难点和关键点
1)架构的设计,关键步骤的思路。
2)特殊牌组的判断。
3)A J Q K的替换。
2心得体会
调试时的易错点(多次犯的错):
·易错点:不同特殊牌组的判断。
·错误原因:不同牌组容易混淆,牌组的判断不明。
·解决方案:明确不同牌组的特点,找出不点,分步解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值