Part 1纸牌游戏

纸牌游戏:
本次将完成抽牌和洗牌的功能。
  预备知识:

  1.  collections 模块的namedtuple: 生成可以使用名字来访问内容的列表,类似*对象名.内容*
  2. __len__() 如果一个类表现得像一个列表,就要用此方法获取元素个数
  3. __getitem__() 当访问不存在的属性时会调用该方法,定义了该方法后可以使用*对象名.[内容]*
  4. __setitem__() 属性被赋值时都会调用该方法。
  5. random 模块的choice: 返回一个列表,元组,字符串的随机项。
  6. 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='梅花'), .......]

 

posted @ 2018-09-20 15:53  A-handsome-cxy  阅读(108)  评论(0编辑  收藏  举报