昨天读完了《Mastering Object-oriented Python》的第一部分,做一些总结。

首先,第一部分总过八章,名字叫Pythonic Classes via Special Methods,也就是讲如何通过特殊方法构造以及设计类的。

其次,第一部分通篇使用的类的例子是BlackJack,也就是21点纸牌游戏,本篇先跳出来实现下21点游戏的代码,这里看明白了免得后面只使用部分时产生不清楚。【21点玩法】

以下代码我写了两个版本,版本一是原本自己按最普通的写法写的,版本二是用了部分书里的东西做了优化的,对照起来看能够发现版本二中不少优美的技巧。# py3.4.3

 #coding:gbk
import random
"""
--------------------------------------------- 第一部分:单张牌--------------------------------------------------------
"""
class Card:
def __init__(self,rank,suit):
self.rank = rank
self.suit = suit
self.hard,self.soft = self._point() def _point(self):
pass class numCard(Card):
def __init__(self,rank,suit):
super().__init__(rank,suit) def _point(self):
self.hard = self.soft = self.rank
return self.hard,self.soft class aceCard(Card):
def __init__(self,rank,suit):
super().__init__('A',suit) def _point(self):
self.hard = 1
self.soft = 11
return self.hard,self.soft class faceCard(Card):
def __init__(self,rank,suit):
super().__init__( rank , suit ) def _point(self):
self.hard = self.soft = 10
return self.hard,self.soft # somecard = [numCard('2','club'),aceCard('A','diamond'),faceCard('J','spade')]
# for i in somecard:
# print( i.rank,i.suit,i.hard,i.soft) """
-------------------------------------------------生成多幅牌---------------------------------------------------------
"""
#版本1:
# def deck(num):
# Decks = []
# for i in range(num):
# for j in ['club','heart','diamond','spade']:
# temp = [ str(x) for x in range(2,11) ]
# temp.extend(['J','Q','K','A'])
# for z in temp:
# if z in "JQK":
# Decks.append(numCard(z,j))
# elif z == 'A':
# Decks.append(aceCard(z,j))
# else:
# Decks.append(faceCard(z,j))
# random.shuffle(Decks)
# random.shuffle(Decks)
# return Decks
#
# Decks = deck(3)
# for i in Decks:
# print( i.rank,i.suit,i.hard,i.soft) # 版本2:
def card4( rank, suit ):
class_= {1: aceCard, 11: faceCard, 12: faceCard,13: faceCard}.get(rank, numCard)
return class_( rank, suit ) Decks = []
for i in range(3):
Decks.extend( [ card4(rank,suit) for rank in range(1,14) for suit in ['Club','Heart','Diamond','Spade'] ] )
random.shuffle(Decks)
# for i in Decks:
# print( i.rank,i.suit,i.hard,i.soft) """
-----------------------------------------------第三部分:手牌--------------------------------------------------------
注意:
"""
class Hand:
dieFlag = False
def __init__(self,*mycards):
self.mycards = []
self.mycards.extend(mycards)
print('your beginning cards are: ',mycards[0].suit,mycards[0].rank,mycards[1].suit,mycards[1].rank)
print('sum of your cards is:',self.count()) def askcard(self,acard):
nowpoint = self.count()
if Hand.dieFlag:
print('sum of your card is ',nowpoint,'you died')
else:
self.mycards.append(acard)
print('you get card:',acard.suit,acard.rank)
nowpoint = self.count()
print('sum of your card is ',nowpoint) def count(self):
sumpoint = 0
for x in self.mycards:
sumpoint += int(x.soft)
if sumpoint > 21:
sumpoint = 0
for x in self.mycards:
sumpoint += x.hard
if sumpoint > 21:
Hand.dieFlag = True
print('boom!,you get',sumpoint)
return sumpoint
else:
return sumpoint hands = Hand(Decks.pop(),Decks.pop())
while not hands.dieFlag:
wt2askc = input('ask card?<yes/no>: ')
if wt2askc == 'yes' and not hands.dieFlag:
hands.askcard(Decks.pop())
else:
break
print('\nfinally,your get %d points'%hands.count())

版本一

 #coding:gbk
import random
class Card:
def __init__(self,rank,suit):
self.rank = rank
self.suit = suit class numCard(Card):
def __init__(self,rank,suit):
super().__init__(rank,suit)
self.hard = self.soft = self.rank class aceCard(Card):
def __init__(self,rank,suit):
super().__init__('A',suit)
self.hard = 1
self.soft = 11 class faceCard(Card):
def __init__(self,rank,suit):
super().__init__( rank , suit )
self.hard = self.soft = 10 # somecard = [numCard('2','club'),aceCard('A','diamond'),faceCard('J','spade')]
# for i in somecard:
# print( i.rank,i.suit,i.hard,i.soft) """
--------------------------------------------- 第二部分:生成多副牌----------------------------------------------------
一个名为Decks的列表,其元素为一张张牌
"""
def card4( rank, suit ):
class_= {1: aceCard, 11: faceCard, 12: faceCard,13: faceCard}.get(rank, numCard)
return class_( rank, suit ) class Decks(list):
def __init__(self,num):
super().__init__()
for i in range(num):
self.extend( card4(rank,suit) for rank in range(1,14) for suit in ['Club','Heart','Diamond','Spade'] )
random.shuffle(self) decks = Decks(3) """
-----------------------------------------------第三部分:手牌--------------------------------------------------------
"""
class Hand:
dieFlag = False
def __init__(self,*mycards):
self.mycards = []
self.mycards.extend(mycards)
print('your beginning cards are: ',mycards[0].suit,mycards[0].rank,mycards[1].suit,mycards[1].rank)
print('sum of your cards is:',self.count()) def askcard(self,acard):
nowpoint = self.count()
if Hand.dieFlag:
print('sum of your card is ',nowpoint,'you died')
else:
print('you get card:',acard.suit,acard.rank)
self.mycards.append(acard)
nowpoint = self.count()
print('sum of your card is ',nowpoint) def count(self):
sumpoint = sum( c.hard for c in self.mycards)
if sumpoint > 21:
sumpoint = sum( c.soft for c in self.mycards)
if sumpoint > 21:
Hand.dieFlag = True
return sumpoint if __name__=="__main__":
hands = Hand(decks.pop(),decks.pop())
while not hands.dieFlag:
wt2askc = input('ask card?<yes/no>: ')
if wt2askc == 'yes' and not hands.dieFlag:
hands.askcard(decks.pop())
else:
break
print('finally,your get %d points'%hands.count()) #
# 输出1:
# your beginning cards are: Heart 3 Spade 5
# sum of your cards is: 8
# ask card?<yes/no>: yes
# you get card: Spade 9
# sum of your card is 17
# ask card?<yes/no>: no
# finally,your get 17 points
#
# 输出2:
# your beginning cards are: Club 12 Club 3
# sum of your cards is: 13
# ask card?<yes/no>: yes
# you get card: Club 6
# sum of your card is 19
# ask card?<yes/no>: yes
# you get card: Diamond 9
# sum of your card is 28
# finally,your get 28 points

版本二

python面对对象编程----1:BlackJack(21点)的更多相关文章

  1. python面对对象编程----2:__init__

    面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...

  2. python面对对象编程------4:类基本的特殊方法__str__,__repr__,__hash__,__new__,__bool__,6大比较方法

    一:string相关:__str__(),__repr__(),__format__() str方法更面向人类阅读,print()使用的就是str repr方法更面对python,目标是希望生成一个放 ...

  3. python面对对象编程-------5:获取属性的四种办法:@property, __setattr__(__getattr__) ,descriptor

    一:最基本的属性操作 class Generic: pass g= Generic() >>> g.attribute= "value" #创建属性并赋值 > ...

  4. python面对对象编程----------7:callable(类调用)与context(上下文)

    一:callables callables使类实例能够像函数一样被调用 如果类需要一个函数型接口这时用callable,最好继承自abc.Callable,这样有些检查机制并且一看就知道此类的目的是c ...

  5. python面对对象编程---------6:抽象基类

    抽象基本类的几大特点: 1:要定义但是并不完整的实现所有方法 2:基本的意思是作为父类 3:父类需要明确表示出那些方法的特征,这样在写子类时更加简单明白 用抽象基本类的地方: 1:用作父类 2:用作检 ...

  6. python面对对象编程中会用到的装饰器

    1.property 用途:用来将对像的某个方法伪装成属性来提高代码的统一性. class Goods: #商品类 discount = 0.8 #商品折扣 def __init__(self,nam ...

  7. python面对对象编程------3:写集合类的三种方法

    写一个集合类的三种方法:wrap,extend,invent 一:包装一个集合类 class Deck: def __init__( self ): self._cards = [card6(r+1, ...

  8. Python学习6——再谈抽象(面对对象编程)

    1.对象魔法 在面对对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法. 使用对象而非全局变量以及函数的原因有多个,而最重要的好处不过以下几点: 多态:可对不同类型的对象 ...

  9. Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

    目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2. ...

随机推荐

  1. mybatis中association的column传入多个参数值

    顾名思义,association是联合查询. 在使用association中一定要注意几个问题.文笔不好,白话文描述一下. 1: <association property="fncg ...

  2. HTML5 canvas生成图片马赛克特效插件

    HTML5 canvas生成图片马赛克特效插件 简要教程 这是一款使用html5 canvas来将图片制作成马赛克效果的js插件.该插件的灵感来自于美国肖像画家Chuck Close.已经有人使用这个 ...

  3. JQuery Dialog(JS模态窗口,可拖拽的DIV) 效果实现代码

    效果图 调用示意图   交互示意图 如上图所示,这基本是JQueryDialog的完整逻辑流程了. 1.用户点击模态窗口的“提交”按钮时,调用JQueryDialog.Ok()函数,这个函数对应了用户 ...

  4. C语言 位操作

    c语言位操作中需要注意有: 位操作只针对整型和字符型数据 在右移操作中:对无符号数和有符号中的正数补 0:符号数中的负数,取决于所使用的系统:补 0 的称为“逻辑右移”,补 1 的称为“算术右移”. ...

  5. MVC中的模型注解

    authour: chenboyi updatetime: 2015-04-26 21:28:42 friendly link:   目录: 1,思维导图 2,内容解析 3,CodeSimple 1, ...

  6. 上海招聘FPGA讲师(专兼职均可)

    上海招聘FPGA讲师(专兼职均可) 招聘FPGA培训讲师(专兼职均可) 诚聘FPGA培训讲师_软件无线电方向 ◆精通FPGA设计方法及技巧 ◆精通无线电知识及System View设计方法,有基于Sy ...

  7. 转:etc/fstab 文件详解

    etc/fstab这个文件的所有参数,这个文件是非常重要的.这个文件是配置文件系统的体系,创建的所有分区,都必须写在这个文件里面,否则下次启动的时候你的分区是挂不起来的.首先学习一个mount –a ...

  8. MVC与三层架构的区别

    我们平时总是将三层架构与MVC混为一谈,殊不知它俩并不是一个概念.下面我来为大家揭晓我所知道的一些真相. 首先,它俩根本不是一个概念. 三层架构是一个分层式的软件体系架构设计,它可适用于任何一个项目. ...

  9. POJ3349 Snowflake Snow Snowflakes(哈希)

    题目链接. 分析: 哈希竟然能这么用.检查两片雪花是否相同不难,但如果是直接暴力,定会超时.所以要求哈希值相同时再检查. AC代码: #include <iostream> #includ ...

  10. COJ 0986 WZJ的数据结构(负十四) 区间动态k大

    题解:哈哈哈我过了!!!主席树+树状数组写起来还真是hentai啊... 在这里必须分享我的一个沙茶错!!!看这段代码: void get(int x,int d){ ]=root[x];x;x-=x ...