前言
通过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心得体会
调试时的易错点(多次犯的错):
·易错点:不同特殊牌组的判断。
·错误原因:不同牌组容易混淆,牌组的判断不明。
·解决方案:明确不同牌组的特点,找出不点,分步解决。