Part 1纸牌游戏
纸牌游戏:
本次将完成抽牌和洗牌的功能。
预备知识:
- collections 模块的namedtuple: 生成可以使用名字来访问内容的列表,类似*对象名.内容*
- __len__() 如果一个类表现得像一个列表,就要用此方法获取元素个数
- __getitem__() 当访问不存在的属性时会调用该方法,定义了该方法后可以使用*对象名.[内容]*
- __setitem__() 属性被赋值时都会调用该方法。
- random 模块的choice: 返回一个列表,元组,字符串的随机项。
- random 模块的shuffle:随机打乱列表的次序。
具体代码如下:
1 from collections import namedtuple 2 from random import choice, shuffle 3 4 #定义一个可以用名字访问内容的列表,包含牌面和花色 5 Card = namedtuple('Card', ['rand', 'suit']) 6 7 class FranchDeck: 8 #列表推导式+列表构成13张牌面 9 ranks = [str(n) for n in range(2,11)] + list('JQKA') 10 #生成四种花色 11 suits = ['红心','方块','梅花','黑桃'] 12 13 def __init__(self): 14 #列表推导式完成52张牌的生成,返回一个列表 15 self._cards = [Card(rand, suit) for rand in self.ranks 16 for suit in self.suits] 17 #获取列表长度 18 def __len__(self): 19 return len(self._cards) 20 21 #取一张牌 22 def __getitem__(self, item): 23 return self._cards[item] 24 25 #给属性命名 26 def __setitem__(self, key, value): 27 self._cards[key] = value 28 29 deck = FranchDeck() 30 shuffle(deck) 31 print(deck[:])
》》》输出:
[Card(rand='8', suit='方块'), Card(rand='2', suit='梅花'), Card(rand='4', suit='梅花'), Card(rand='4', suit='方块'), Card(rand='A', suit='红心'), Card(rand='5', suit='黑桃'), Card(rand='9', suit='方块'), Card(rand='K', suit='黑桃'), Card(rand='Q', suit='方块'), Card(rand='7', suit='方块'), Card(rand='J', suit='红心'), Card(rand='Q', suit='梅花'), .......]