实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)

1、namedtuple:命名元组,可以创建一个没有方法只有属性的类
from collections import namedtuple
card = namedtuple('card',['rank','suit']) # rank 牌面大小,suit牌面的花色
# card其实就是namedtuple创建的一个类,其属性就是rank和suit
c1 = card(,'红心 ')
# c1是实例化的对象
print(c1)
print(c1.suit)

运行结果:

card(rank=2, suit='红心 ')
红心2
2、按照循环顺序,通过对象[索引]任意取牌
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色
class FranchDeck:
ranks = [str(n) for n in range(2,11)]+list('JQKA')
suits = ['红心','方板','梅花','黑桃']
def __init__(self):
self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
# 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的
def __getitem__(self, item):
return self._cards[item] deck = FranchDeck()
print(deck[10]) # 出现对象加索引的的取法就是触发__getitem__方法

运行结果:

Card(rank='', suit='梅花')

Process finished with exit code 0
3、choice实现随机抽取一张纸牌的过程
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色
class FranchDeck:
ranks = [str(n) for n in range(2,11)]+list('JQKA')
suits = ['红心','方板','梅花','黑桃']
def __init__(self):
self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
# 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的 def __getitem__(self, item):
return self._cards[item] def __len__(self):
return len(self._cards) # 实现按照循环循序抽取对应的纸牌
deck = FranchDeck()
print(deck[10]) # 出现对象加索引的的取法就是触发__getitem__方法 # 实现随机抽取一张牌的过程
from random import choice
print(choice(deck))
# 注意:# choice能够实现随机抽取纸牌,必须得依赖__len__方法,如果前面没有定义__len__方法就会报错,
# 即只要用到choice就会触发__len__方法

运行结果:

Card(rank='A', suit='梅花')

Process finished with exit code 0
4、shuffle实现随机洗牌的过程
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色
class FranchDeck:
ranks = [str(n) for n in range(2,11)]+list('JQKA')
suits = ['红心','方板','梅花','黑桃']
def __init__(self):
self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
# 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的 def __getitem__(self, item):
return self._cards[item] def __len__(self):
return len(self._cards) # 传纸牌的长度,是从这么多张纸牌里面抽取 def __setitem__(self, key, value):
self._cards[key] = value deck = FranchDeck()
print(deck[10])
# 通过shuffle和__setitem__实现随机洗牌的过程,如果前面没有定义__setitem__方法同样会报错
# 因为随机洗牌的过程索引对应的牌就会发生改变,所以只能通过__setitem__去改变
from random import shuffle
shuffle(deck)
print(deck[10])

运行结果:

Card(rank='', suit='梅花')
Card(rank='K', suit='红心')
总结:
以上纸牌游戏实现随机抽牌,洗牌的过程,仅仅只是用了内置的方法,并没有用我们自己定
义的方法就实现了,需要注意的是: __getitem__与对象[索引],__len__与choice,__setitem__与shuffle
必须同时结合使用
内置函数,内置模块,内置的基础类型<---->类的内置方法,比如:== <--->__eq__,len()<--->__len__
5、总代码----纸牌游戏随机取牌以及洗牌的过程
# 按照循环顺序,通过对象[索引]任意取牌
# choice实现随机抽取一张纸牌的过程
# shuffle实现随机洗牌的过程
import json
from collections import namedtuple
Card = namedtuple('Card',['rank','suit']) # rank 牌面大小,suit牌面的花色
class FranchDeck:
ranks = [str(n) for n in range(2,11)]+list('JQKA')
suits = ['红心','方板','梅花','黑桃']
def __init__(self):
self._cards = [Card(rank,suit) for rank in FranchDeck.ranks for suit in FranchDeck.suits]
# 嵌套循环,每循环一次都拿到一张牌,并且都会存到一个列表中,这个里面的牌是按照循环的顺序的 def __getitem__(self, item): # 通过对象[索引]进行触发
return self._cards[item] def __len__(self): # 通过choice进行触发
return len(self._cards) # 传纸牌的长度,是从这么多张纸牌里面抽取 def __setitem__(self, key, value): # 通过shuffle进行触发
self._cards[key] = value def __str__(self):
return json.dumps(self._cards,ensure_ascii=False) # 序列化 deck = FranchDeck() # 通过对象[索引]和__getitem__实现按照循环循序抽取对应的纸牌
print(deck[10]) # 出现对象加索引的的取法就是触发__getitem__方法 # 通过choice和__len__实现随机抽取一张牌的过程
from random import choice
print(choice(deck))
# choice能够实现随机抽取纸牌,必须得依赖内置的__len__方法,如果前面没有定义__len__方法就会报错
print(deck[10]) # 通过shuffle和__setitem__实现随机洗牌的过程
from random import shuffle
shuffle(deck)
print(deck[10])
print(deck) # 需要进行序列化才可以 print(deck[:5]) # 直接利用对象进行切片

运行结果:

Card(rank='', suit='梅花')
Card(rank='A', suit='红心')
Card(rank='', suit='梅花')
Card(rank='A', suit='梅花')
[["", "梅花"], ["", "梅花"], ["", "梅花"], ["", "方板"], ["", "方板"], ["Q", "红心"], ["", "红心"], ["J", "黑桃"], ["", "梅花"], ["J", "红心"], ["A", "梅花"], ["", "黑桃"], ["Q", "方板"], ["", "梅花"], ["", "红心"], ["A", "红心"], ["", "红心"], ["", "方板"], ["", "黑桃"], ["K", "黑桃"], ["", "方板"], ["Q", "梅花"], ["", "黑桃"], ["", "黑桃"], ["J", "梅花"], ["A", "黑桃"], ["", "红心"], ["", "红心"], ["", "红心"], ["J", "方板"], ["", "方板"], ["K", "方板"], ["K", "红心"], ["", "红心"], ["", "红心"], ["", "方板"], ["", "方板"], ["K", "梅花"], ["", "红心"], ["", "梅花"], ["", "黑桃"], ["", "方板"], ["Q", "黑桃"], ["", "梅花"], ["", "梅花"], ["", "黑桃"], ["", "黑桃"], ["", "梅花"], ["", "方板"], ["", "黑桃"], ["", "黑桃"], ["A", "方板"]]
[Card(rank='', suit='梅花'), Card(rank='', suit='梅花'), Card(rank='', suit='梅花'), Card(rank='', suit='方板'), Card(rank='', suit='方板')]

实现纸牌游戏的随机抽牌洗牌过程(item系列几个内置方法的实例)的更多相关文章

  1. 完美洗牌&洗牌

    完美洗牌问题,给定一个数组a1,a2,a3,...an,b1,b2,b3..bn,把它最终设置为b1,a1,b2,a2,...bn,an这样的. O(n)的算法,O(n)的空间. 对于前n个数,映射为 ...

  2. java list随机截取(洗牌)

    public void solution(){ List<Integer> givenList = Arrays.asList(1, 2, 3,4,5,6); Collections.sh ...

  3. Python字符串内置方法使用及年龄游戏深入探究

    目录 作业 ==程序代码自上往下运行,建议自上而下的完成下列任务== 作业 使用代码实现以下业务逻辑: 写代码,有如下变量name = " aleX",请按照要求实现每个功能: 移 ...

  4. 实现斗地主纸牌游戏---洗牌 发牌 看底牌的具体功能------Map集合存储方法 遍历的应用

    该Demo只是斗地主的游戏的一部分,实现的斗地主的组合牌  洗牌  发牌 看牌的功能,主要应用Map集合进行练习 package cn.lijun import java.util.ArrayList ...

  5. 【bzoj1965】 [Ahoi2005]SHUFFLE 洗牌 欧拉定理

    题目描述 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打 ...

  6. Hard 随机洗牌函数 @CareerCup

    第i个元素和index在[i,length-1]之间的一个数随机交换 package Hard; import CtCILibrary.AssortedMethods; /** * * Write a ...

  7. Craking the coding interview 面试题:完美随机洗牌

    给定一个序列,随机打乱这个序列,新产生的序列和任意一个序列产生的可能性是一样的,就是所谓的完美随机洗牌. 看下面的运行结果: 上面第一列是原数列,下面一行是新产生的打乱的数列. 基本思想:如果n-1个 ...

  8. C++分享笔记:扑克牌的洗牌发牌游戏设计

    笔者在大学二年级期间,做过的一次C++程序设计:扑克牌的洗牌发牌游戏.具体内容是:除去大王和小王,将52张扑克牌洗牌,并发出5张牌.然后判断这5张牌中有几张相同大小的牌,是否是一条链,有几个同花等. ...

  9. 随机洗牌算法Knuth Shuffle和错排公式

    Knuth随机洗牌算法:譬如现在有54张牌,如何洗牌才能保证随机性.可以这么考虑,从最末尾一张牌开始洗,对于每一张牌,编号在该牌前面的牌中任意一张选一张和当前牌进行交换,直至洗到第一张牌为止.参考代码 ...

随机推荐

  1. 转:为什么说Java中只有值传递

    原文:https://www.cnblogs.com/wchxj/p/8729503.html 错误理解 在开始深入讲解之前,有必要纠正一下大家以前的那些错误看法了.如果你有以下想法,那么你有必要好好 ...

  2. Springboot中定时任务的使用

    在springboot中已经集成了定时任务,只需要在启动类上加注解@EnableScheduling即可 例如: 添加类加上@Component注解,添加方法加上@Scheduler即可

  3. 设备驱动基础学习--misc device简单实现

    在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述).miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同. 所有的miscde ...

  4. Intellij Idea2019版本激活,目前可以激活到2089,解决失效问题(非商业用途)

    目录 Intellij Idea2019版本激活,目测可以激活到2089!! 前言-此教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! 步骤(直接激活新下载的) 成功 注意(不想重新下载的小伙 ...

  5. SniperOJ-as fast as you can-Writeup

    SniperOJ-as fast as you can-Writeup 题目描述: 打开所给的题目地址 很容易可以看出这是一个简单的爬虫问题,爬去网页的信息并post,但在界面及网页源码中均没发现有价 ...

  6. 详解Django中Request对象的相关用法

    原文链接:http://www.jb51.net/article/69624.htm 1.从Request对象中获取数据 我们在第三章讲述View的函数时已经介绍过HttpRequest对象了,但当时 ...

  7. C++ explicit的作用

    explicit作用: 在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换. explicit使用注意事项: * e ...

  8. oracle关于sequence的个人理解

    oracle关于sequence的个人理解 1. sequence在多用户使用时的同步问题 个人感觉sequence是以连接(会话)为基础,类似于java中使用mysql的一个connection 网 ...

  9. 操作Document文档

    利用客户端操作Document文档数据 1.创建一个文档(创建数据的过程,向表中去添加数据) 请求方式:Post 请求地址:es所在IP:9200/索引库/Type/文档ID(可给可不给,代表唯一标识 ...

  10. Java面向对象编程 -5.2

    静态代码块 静态代码块主要指的是使用static关键字定义的代码块 静态块的定义需要考虑到两种情况: 主类中定义静态块 非主类中定义静态块 静态块执行主要是给static属性进行初始化的 此时可以发现 ...