"""
发牌 比大小
类和类之间(对象之间)的关系:
- is-a关系 - 继承
- has-a关系 - 关联/聚合/合成
- use-a关系 - 依赖
面向对象七个设计原则: - 单一职责原则 - 一个类只做该做的事情不做不该做事情
- 开闭原则
- 依赖倒转原则
- 里氏替换原则
- 接口隔离原则
- 合成聚合复用原则 - 优先考虑强关联关系而不是继承关系来复用代码
- 最少知识原则(迪米特法则)
GoF设计模式:23种经典场景 - Python中弱化了很大一部分
"""
from enum import Enum
from enum import unique
import random
# 经验: 符号常量优于字面常量 枚举类型是定义符号常量的最佳选择
@unique
class Suite(Enum):
"""花色的枚举"""
SPADE = 0
HEART = 1
CLUB = 2
DIAMOND = 3
class Card(object):
"""牌,指的是个体 一张牌"""
def __init__(self, suite, face):
self.suite = suite #花色
self.face = face #点数
def show(self):
suites = ['黑', '红', '梅', '方']
faces = [
'', 'A', '2', '3', '4', '5', '6',
'7', '8', '9', '10', 'J', 'Q', 'K'
]
return f'{suites[self.suite.value]}{faces[self.face]}'
"""
def __lt__(self, other):
if self.suite == other.suite:
return self.face < other.face
return self.suite.value < other.suite.value
"""
def __str__(self):
return self.show()
def __repr__(self):
return self.show()
class Poker(object):
"""扑克,指的是整体 一副扑克"""
def __init__(self):
self.index = 0
self.cards = [Card(suite, face)
for suite in Suite
for face in range(1, 14)] #列表推导式
#创建对象 自动调用__repr__函数,然后调用show()函数
#返回 return f'{suites[self.suite.value]}{faces[self.face]}'
#这里就可以创建52个牌
def shuffle(self):
"""洗牌"""
random.shuffle(self.cards)
#shuffle() 方法将序列的所有元素随机排序
def deal(self):
"""发牌"""
card = self.cards[self.index]
self.index += 1
return card #从self.cards列表中一张一张返回
@property
#把has_more方法变成一个属性
def has_more(self):
"""是否还有更多的牌"""
return self.index < len(self.cards)
class Player(object):
"""玩家"""
def __init__(self, name):
self.name = name
self.cards = [] #玩家手上的牌
def get_one(self, card):
"""摸一张牌"""
self.cards.append(card)
# *前面的参数称为位置参数(传参时不用指定参数名按位置对号入座即可)
# *后面的参数称为命名关键字参数(传参时必须给出参数名和参数值)
def sort_cards(self, *, key=lambda x: (x.suite.value, x.face)):
"""整理手上的牌"""
self.cards.sort(key=key)
def main():
if True:
poker = Poker()
poker.shuffle()
players = [
Player('东邪'), Player('西毒'), Player('南帝'), Player('北丐')
]
for _ in range(13):
for player in players: #让创建的4个玩家每个摸13张牌
player.get_one(poker.deal())#关键 , 扑克发一张玩家就获得一张
#保存在 self.cards = []列表中
for player in players:
player.sort_cards(key=lambda card: card.face)
#把自己手上的牌按从点数从小到大排序,花色默认是Suite里面写的顺序
print(player.name, end=': ')
print(player.cards)#打印四个玩家的名字和扑克
if __name__ == '__main__':
main()