python面向对象实现斗地主洗牌发牌,牌面排序–最容易理解的方式
看了很多篇文章 看的很懵逼 于是自己也写了一个,浅显易懂的
import random
import operator
class PokeCard():
# 扑克牌类
def __init__(self, num, color, num_level, color_level):
'''一张牌扑克牌要有的属性 游戏中牌的级别大小 '''
# 牌表面数字大小
self.num = num
# 花色
self.color = color
# 牌的实际大小级别,区分比较谁的牌大的 如2就比10大
self.num_level = num_level
# 花色的大小级别 其实斗地主游戏中用不到花色大小比较,但是牌的顺序展示要用呀,黑桃要展示在红桃前面吧?
self.color_level = color_level
def __repr__(self):
'''字符串展示显示这张牌的属性 数值大小、花色'''
return "{color}{num}".format(color=self.color, num=self.num)
class GameManager():
def __init__(self):
self.poke_num = ['3', '4', '5',
'6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2', ]
self.poke_color = ['♠', '♥', '♣', '♦']
# 使用列表存储每张牌的对象的形式来装牌
self.poke_cards = []
self.playerA = []
self.playerB = []
self.playerC = []
# 底牌
self.hand_card = []
def init_card(self):
'''装牌+洗牌'''
# for 循环创建每张牌,添加每一张牌的属性
for num_level, num in enumerate(self.poke_num):
for color_level, color in enumerate(self.poke_color):
self.poke_cards.append(
PokeCard(num, color, num_level+3, color_level+1))
# 小王入牌组 16是牌的展示大小,0是花色的级别
self.poke_cards.extend([PokeCard('小王', '', 16, 0)])
# 大王入牌组 17是牌的展示大小,0是花色的级别
self.poke_cards.extend([PokeCard('大王', '', 17, 0)])
# 洗牌打乱
self.shuffle(self.poke_cards)
def shuffle(self, poke_list):
'''洗牌'''
return random.shuffle(poke_list)
def deal_cards(self):
'''性感荷官在线发牌'''
# 利用切片来分牌
self.playerA = self.poke_cards[0:17]
self.playerB = self.poke_cards[17:34]
self.playerC = self.poke_cards[34:51]
# 底牌是3张
self.hand_card = self.poke_cards[51:54]
return self.playerA, self.playerB, self.playerC, self.hand_card
def sort_cards(self, cards):
'''对牌组进行排序'''
# 使用operator来排序,依据的排序方式是牌面数值+花色等级
sort_key = operator.attrgetter('num_level', 'color_level')
cards.sort(key=sort_key)
if __name__ == '__main__':
game = GameManager()
# 初始化牌组
game.init_card()
# 性感荷官在线发牌
playerA, playerB, playerC, hand_card = game.deal_cards()
print("playerA", playerA)
print("playerB", playerB)
print("playerC", playerC)
print("底牌", hand_card)
# 排序
game.sort_cards(playerA)
game.sort_cards(playerB)
game.sort_cards(playerC)
game.sort_cards(hand_card)
print("playerA 洗牌后", playerA)
print("playerB 洗牌后", playerB)
print("playerC 洗牌后", playerC)
print("底牌洗牌后", hand_card)