example04.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. """
  2. 程序设计的范式(理念):
  3. 1. 指令式程序设计 - 汇编语言
  4. 2. 面向过程程序设计 - 把一组指令封装成一个过程,需要执行这组指令时调用这个过程即可 - C
  5. 3. 面向对象程序设计 - 将数据和操作数据的函数从逻辑上组织成了对象 - C++ / Java
  6. 4. 函数式程序设计 - 函数是一等对象(一等公民) - Haskell
  7. 面向对象程序设计步骤:
  8. 1. 定义类 - 抽象过程 - 数据抽象(静态特征-属性)/行为抽象(动态特征-方法)
  9. 2. 创建对象 - 构造器 - 初始化(__init__)
  10. 3. 给对象发消息 - 对象引用.对象方法(参数)
  11. 面向对象的三大支柱 - 封装 / 继承 / 多态
  12. 类与类(对象与对象)之间的关系:
  13. 1. is-a: 继承
  14. 2. has-a: 关联 / 聚合 / 合成
  15. 3. use-a: 依赖
  16. 面向对象的设计原则/SOLID原则:
  17. 1. 单一职责原则 - 类的设计要高内聚
  18. 2. 开闭原则 - 接受扩展不接受修改 - 抽象是关键/用继承封装可变性
  19. 3. 依赖倒转原则 - 面向抽象编程
  20. 4. 里氏替换原则 - 任何时候都可以使用子类型对象替换父类型对象
  21. 5. 接口隔离原则
  22. 6. 合成聚合复用原则 - 优先考虑用强关联而不是继承去复用代码
  23. 7. 最少知识原则(迪米特法则) - 不要跟陌生人讲话
  24. GoF设计模式 - 23种场景(Python中有16中已经被弱化)
  25. - 单例、工厂、原型、适配器、观察者、策略
  26. """
  27. from enum import Enum
  28. from enum import unique
  29. import random
  30. # 经验: 符号常量优于字面常量
  31. # 枚举类型是定义符号常量的最佳选择
  32. # 如果一个变量的值只有有限多个选项那么最好使用枚举
  33. @unique
  34. class Suite(Enum):
  35. """花色"""
  36. SPADE = 0
  37. HEART = 1
  38. CLUB = 2
  39. DIAMOND = 3
  40. class Card():
  41. """牌"""
  42. def __init__(self, suite, face):
  43. self.suite = suite
  44. self.face = face
  45. def show(self):
  46. """显示牌的花色和点数"""
  47. suites = ['♠️', '♥️', '♣️', '♦️']
  48. faces = [
  49. '', 'A', '2', '3', '4', '5', '6',
  50. '7', '8', '9', '10', 'J', 'Q', 'K'
  51. ]
  52. return f'{suites[self.suite.value]} {faces[self.face]}'
  53. def __str__(self):
  54. return self.show()
  55. def __repr__(self):
  56. return self.show()
  57. class Poker():
  58. """扑克"""
  59. def __init__(self):
  60. self.index = 0
  61. self.cards = [Card(suite, face)
  62. for suite in Suite
  63. for face in range(1, 14)]
  64. def shuffle(self):
  65. """洗牌"""
  66. random.shuffle(self.cards)
  67. def deal(self):
  68. """发牌"""
  69. temp = self.cards[self.index]
  70. self.index += 1
  71. return temp
  72. @property
  73. def has_more(self):
  74. """是否有牌可以发"""
  75. return self.index < len(self.cards)
  76. class Player():
  77. """玩家"""
  78. def __init__(self, name):
  79. self.name = name
  80. self.cards = []
  81. def get_one(self, card):
  82. """摸一张牌"""
  83. self.cards.append(card)
  84. def drop_one(self, index):
  85. """打出一张牌"""
  86. return self.cards.remove(index)
  87. def get_many(self, more_cards):
  88. """摸多张牌"""
  89. self.cards += more_cards
  90. def drop_cards(self):
  91. """扔掉所有牌"""
  92. self.cards.clear()
  93. def arrange(self):
  94. """整理手上的牌"""
  95. self.cards.sort(key=lambda x: (x.suite.value, x.face))
  96. def main():
  97. """主函数"""
  98. poker = Poker()
  99. poker.shuffle()
  100. players = [
  101. Player("东邪"), Player("西毒"),
  102. Player("南帝"), Player("北丐")
  103. ]
  104. for _ in range(3):
  105. for player in players:
  106. if poker.has_more:
  107. player.get_one(poker.deal())
  108. for player in players:
  109. player.arrange()
  110. print(player.name)
  111. print(player.cards)
  112. if __name__ == '__main__':
  113. main()