编程目的:本内容主要是通过Python中的类实现的,当时编写扑克牌的目的是宁大哥为了锻炼我理解面向对象的编程。通过编写程序更好的明白py中类用法及类中方法的调用。
说明:本章内容比较啰嗦,代码实现不是最简单的,因为编码的时候考虑用到了生成器用法,装饰器,函数传参为字典类型,列表操作,字典操作等加以练习,对类的继承,函数调用函数都用到了,所以代码显臃肿。大神们可以对我的编程习惯、用法等进行指正批评。写本章内容为了巩固知识点用法
代码功能简述:
1.通过类实现生成一副扑克牌(PlayCard);
2.并定义一个类实现——人(People);
3.练习类的继承定义玩家对象(Rookie)和发牌小姐姐 ( DealerSister);
4.定义函数eq_lt_gt进行将特殊牌(J、Q、K、大王、小王进行转换为特定数字比较);
5.定义函数pk_result实现玩家比大小的功能;
另外:简单编写了一个装饰器,主要是练习一下装饰器的用法。主要实现了程序的开始时间和结束时间;
玩法:
通过发牌小姐姐给两个玩家随机派发牌(在程序中体现发牌的动作),每个玩家各27张;
玩家之间相互出牌对比大小;
通过玩家出牌比较后,返回本次牌局胜利者是谁;
具体代码:
编写一个类(PlayCard),实现扑克牌的各种方法:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import random
import time
class PlayCard():
"""
定义类,实现生成一副顺序扑克牌的方法及一副随机扑克牌的方法
"""
def __init__(self):
"""
属性定义
"""
self.start_numbers=2
self.end_numbers=11
self.types = ['♥', '♠', '♦', '♣']
self.JQK = ['J', 'Q', 'K']
self.A = 'A'
self.play_cards = []
self.play_cards_random = []
self.play_card()
def play_card(self):
"""
生成一副顺序扑克牌
:return:
"""
for type in self.types:
self.play_cards.append(type+self.A)
for num in range(self.start_numbers,self.end_numbers):
self.play_cards.append(type+str(num))
for JJQQKK in self.JQK:
self.play_cards.append(type+JJQQKK)
self.play_cards.append('王大')
self.play_cards.append('王小')
return self.play_cards
def random_play_card(self):
"""
生成一副随机扑克牌
:return:
"""
number_1 = 54
while number_1 >0:
number_1-=1
a = int(random.randint(0, number_1))
self.play_cards_random.append( self.play_cards[a])
del self.play_cards[a]
return self.play_cards_random
def random_one_card(self):
"""
随机取一张牌
:return:
"""
a=int(random.randint(0,53))
return self.play_cards[a]
def color(self):
"""
打印带颜色的红桃和方片
:return:
"""
b=int(random.randint(0,53))
x=self.play_cards[b]
if x[:1] in ['♥','♦']:
return ('\033[36;31m{0}\033[1;37;37m'.format(x))
else:
return self.play_cards[b]
def __getitem__(self, item):
"""
实现getitem方法,通过索引直接取一张牌
:param item:
:return:
"""
return self.play_cards[item]
a = PlayCard()#对类进行实例化
print("打印一副顺序的牌")
print("指定取出第几张牌:" + a[2])
print("查看是否实现了颜色展示:" + a.color())
print("随机取一张牌:" + a.random_one_card())
print("打印顺序的一副牌")
print(a.play_cards)
print("打印随机的一副牌")
print(a.random_play_card())
结果如下:
编写一个类(People),定义人。主要用于其他玩家进行继承,此类的功能只显示名字及等级;供发牌小姐姐及玩家继承;
class People():
"""定义一个人"""
def __init__(self, name, grade):
self.name = name
self.grade = grade
a = People("史真香","9")
print(a.name,a.grade)
实例化一个玩家为“史真香”,等级为9级。结果如下:
定义玩家"杜子疼"和发牌小姐姐"史真香",继承人的属性,并完成发牌和接收牌的动作
class Rookie(People):
"""
定义一个菜鸟玩家,继承人的属性
"""
def __init__(self, name, grade):
super().__init__(name, grade)
self.list1 = []#定义一个空列表进行存放接收的牌
def jieshoupai(self, values):
"""
给玩家定义一个接收牌的方法,发牌小姐姐发一张,他接收一张
:param values:
:return:
"""
self.list1.append(values) #每次将发的牌存放在接收牌的列表中
return self.list1
class DealerSister(People):
"""
定义一个发牌小姐姐,继承人的属性
"""
def __init__(self, name, grade):
super().__init__(name, grade)
self.pcard_list = PlayCard().random_play_card()#在这实例化类,存放一副扑克牌
def shuffle(self):
"""
定义发牌小姐姐实现发牌的功能,
每次发一张牌需要0.5秒,用来体现出整个发牌的过程
:return:
"""
for i in self.pcard_list:
yield i #利用生成器迭代实现,主要是为了锻炼用法
time.sleep(0.5)#暂停0.5秒,体现一张一张发牌的功能
#del self.pcard_list[0]
dea_sister = DealerSister("史真香","9")#对发牌小姐姐进行实例化
linzhiling = dea_sister.shuffle()#调用小姐姐的发牌方法(生成器)
rookie_1 = Rookie("杜子疼","1")#对菜鸟玩家进行实例化
print(rookie_1.jieshoupai(next(linzhiling))[-1])#生成器利用惰性执行,取第一张牌,并进行存放到列表中
print(rookie_1.jieshoupai(next(linzhiling))[-1])#生成器利用惰性执行,取第二张牌,并进行存放到列表中
print(rookie_1.jieshoupai(next(linzhiling))[-1])#生成器利用惰性执行,取第三张牌,并进行存放到列表中
print("玩家 " + rookie_1.name +" 的牌")
print(rookie_1.list1)#玩家1手中的牌
结果如下
定义函数eq_lt_gt,对扑克牌特殊符号进行转换为数字,并返回数字类型,用于后续比较
def eq_lt_gt(a):
"""
将AJQK小王大王转换为对应的数字1,11,12,13,50,99
其他的数字转换为本身数字
:param a:
:return:
"""
a = a[-1]
if a == 'J':
a_t = 11
elif a == 'Q':
a_t = 12
elif a == 'K':
a_t = 13
elif a == 'A':
a_t = 1
elif a == '0':
a_t = 10
elif a == '小':
a_t = 50
elif a == '大':
a_t = 99
else:
a_t = a
return int(a_t)
定义函数pk_result实现两个玩家出牌比较大小的功能,如果玩家1胜在列表中记录数字1,反之记录2,如果平手记录0;
def pk_result(list_a, list_b):
"""
实现玩家比大小的方法
:param list_a:
:param list_b:
:return:
"""
list1 = list_a
list2 = list_b
result = list()
for i in range(27):
wanjia1 = list1.pop()
wanjia2 = list2.pop()
if eq_lt_gt(wanjia1) > eq_lt_gt(wanjia2):
result.append(1)
elif eq_lt_gt(wanjia1) < eq_lt_gt(wanjia2):
result.append(2)
else:
result.append(0)
return result
以上代码及实现了程序的主要功能。编写一个装饰器,对程序开始时间和结束时间进行记录。主要为了练习装饰器可以不编写。
def time_Ymd(a='%Y%m%d %H:%M:%S'):
"""
生成一个时间日期
:param a:
:return:
"""
return time.strftime(a)
#print(time_Ymd())
def statuslog(func):
"""
定义一个装饰器,用来实现程序的时间记录
:param func:
:return:
"""
def _log(*args, **kwargs):
print(func.__name__+" start time :{0}".format(time_Ymd()))
ret = func(*args, **kwargs)
print("end time :{0}".format(time_Ymd()))
return ret
return _log
完整代码如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import random
import time
def time_Ymd(a='%Y%m%d %H:%M:%S'):
"""
生成一个时间日期
:param a:
:return:
"""
return time.strftime(a)
#print(time_Ymd())
def statuslog(func):
"""
定义一个装饰器,用来实现程序的时间记录
:param func:
:return:
"""
def _log(*args, **kwargs):
print(func.__name__+" start time :{0}".format(time_Ymd()))
ret = func(*args, **kwargs)
print("end time :{0}".format(time_Ymd()))
return ret
return _log
class PlayCard():
"""
定义类,实现生成一副顺序扑克牌的方法及一副随机扑克牌的方法
"""
def __init__(self):
"""
属性定义
"""
self.start_numbers=2
self.end_numbers=11
self.types = ['♥', '♠', '♦', '♣']
self.JQK = ['J', 'Q', 'K']
self.A = 'A'
self.play_cards = []
self.play_cards_random = []
self.play_card()
def play_card(self):
"""
生成一副顺序扑克牌
:return:
"""
for type in self.types:
self.play_cards.append(type+self.A)
for num in range(self.start_numbers,self.end_numbers):
self.play_cards.append(type+str(num))
for JJQQKK in self.JQK:
self.play_cards.append(type+JJQQKK)
self.play_cards.append('王大')
self.play_cards.append('王小')
return self.play_cards
def random_play_card(self):
"""
生成一副随机扑克牌
:return:
"""
number_1 = 54
while number_1 >0:
number_1-=1
a = int(random.randint(0, number_1))
self.play_cards_random.append( self.play_cards[a])
del self.play_cards[a]
return self.play_cards_random
def random_one_card(self):
"""
随机取一张牌
:return:
"""
a=int(random.randint(0,53))
return self.play_cards[a]
def color(self):
"""
打印带颜色的红桃和方片
:return:
"""
b=int(random.randint(0,53))
x=self.play_cards[b]
if x[:1] in ['♥','♦']:
return ('\033[36;31m{0}\033[1;37;37m'.format(x))
else:
return self.play_cards[b]
def __getitem__(self, item):
"""
实现getitem方法,通过索引直接取一张牌
:param item:
:return:
"""
return self.play_cards[item]
class People():
"""定义一个人"""
def __init__(self, name, grade):
self.name = name
self.grade = grade
class Rookie(People):
"""
定义一个菜鸟玩家,继承人的属性
"""
def __init__(self, name, grade):
super().__init__(name, grade)
self.list1 = []#定义一个空列表进行存放接收的牌
def jieshoupai(self, values):
"""
给玩家定义一个接收牌的方法,发牌小姐姐发一张,他接收一张
:param values:
:return:
"""
self.list1.append(values) #每次将发的牌存放在接收牌的列表中
return self.list1
class DealerSister(People):
"""
定义一个发牌小姐姐,继承人的属性
"""
def __init__(self, name, grade):
super().__init__(name, grade)
self.pcard_list = PlayCard().random_play_card()#在这实例化类,存放一副扑克牌
def shuffle(self):
"""
定义发牌小姐姐实现发牌的功能,
每次发一张牌需要0.5秒,用来体现出整个发牌的过程
:return:
"""
for i in self.pcard_list:
yield i #利用生成器迭代实现,主要是为了锻炼用法
time.sleep(0.5)
#del self.pcard_list[0]
def eq_lt_gt(a):
"""
将AJQK小王大王转换为对应的数字1,11,12,13,50,99
其他的数字转换为本身数字
:param a:
:return:
"""
a = a[-1]
if a == 'J':
a_t = 11
elif a == 'Q':
a_t = 12
elif a == 'K':
a_t = 13
elif a == 'A':
a_t = 1
elif a == '0':
a_t = 10
elif a == '小':
a_t = 50
elif a == '大':
a_t = 99
else:
a_t = a
return int(a_t)
def pk_result(list_a, list_b):
"""
实现玩家比大小的方法
:param list_a:
:param list_b:
:return:
"""
list1 = list_a
list2 = list_b
result = list()
for i in range(27):
wanjia1 = list1.pop()
wanjia2 = list2.pop()
if eq_lt_gt(wanjia1) > eq_lt_gt(wanjia2):
result.append(1)
elif eq_lt_gt(wanjia1) < eq_lt_gt(wanjia2):
result.append(2)
else:
result.append(0)
return result
@statuslog
def start_game(**dict):#此处定义的传参为字典类型
"""游戏执行总路程"""
result = list()#单次pk结果存放记录表
#将取出指定玩家以及发牌人员信息传入到游戏中
sister, sister_grade = dict['0'][0], dict['0'][1] # 发牌人的信息
rookie1, grade1 = dict['1'][0], dict['1'][1] # 玩家1的信息
rookie2, grade2 = dict['2'][0], dict['2'][1] # 玩家2的信息
#游戏开始,介绍信息
dea_sister = DealerSister(sister, sister_grade)
print("她的名字是 :" + dea_sister.name)
print(dea_sister.name + " 的职称是:" + dea_sister.grade)
rookie_1 = Rookie(rookie1,grade1)
print("玩家1是:" + rookie_1.name +",他的等级是:" + rookie_1.grade)
#print(rookie_1.jieshoupai(dea_sister.shuffle()))#每次发一张牌供玩家接受
rookie_2 = Rookie(rookie2, grade2)
print("玩家2是:" + rookie_2.name + ",他的等级是:" + rookie_2.grade)
n = 0
linzhiling = dea_sister.shuffle()
for i in range(int(len(PlayCard().play_cards)/2)):#开始发牌
n += 1
print("玩家" + rookie_1.name + "的第" + str(n) + "牌")
print(rookie_1.jieshoupai(next(linzhiling))[-1])
#print(rookie_1.jieshoupai(dea_sister.shuffle()))
print("玩家" + rookie_2.name + "的第" + str(n) + "牌")
print(rookie_2.jieshoupai(next(linzhiling))[-1])
#print(rookie_2.jieshoupai(dea_sister.shuffle()))
#print(dea_sister.pcard_list)
print(rookie_1.name + " 的牌:")
print(rookie_1.list1)#玩家1到手的牌
print(rookie_2.name + " 的牌:")
print(rookie_2.list1)#玩家2到手的牌
result = pk_result(rookie_1.list1,rookie_2.list1)#对玩家手中的牌进行比较#此处在内部直接比对了,可以对函数里进行打印每一次比对的结果
if result.count(1) > result.count(2):#最终统计1,2的数量判断是玩家1胜利还是玩家2胜利
print(rookie_1.name + "胜利")
elif result.count(1) < result.count(2):
print(rookie_2.name + "胜利")
else:
print("牌技一致,再决高下")
def main():
#请依次定义荷兰官,玩家1,玩家2(每个人员定义信息一次为名称及等级属性)
renyuan = {'0': ['史真香', '荷兰官'], '1': ['杜子腾', '1'], '2': ['刘碧悌', '11']}
start_game(**renyuan)
if __name__ == '__main__':
main()
结果如下:杜子腾胜利
start_game start time :20190721 12:02:08
她的名字是 :史真香
史真香 的职称是:荷兰官
玩家1是:杜子腾,他的等级是:1
玩家2是:刘碧悌,他的等级是:11
玩家杜子腾的第1牌
♠2
玩家刘碧悌的第1牌
♣5
玩家杜子腾的第2牌
王小
玩家刘碧悌的第2牌
♥K
玩家杜子腾的第3牌
♥7
玩家刘碧悌的第3牌
♥10
玩家杜子腾的第4牌
♦10
玩家刘碧悌的第4牌
♥J
玩家杜子腾的第5牌
♥6
玩家刘碧悌的第5牌
♠8
玩家杜子腾的第6牌
♠5
玩家刘碧悌的第6牌
♦4
玩家杜子腾的第7牌
♦6
玩家刘碧悌的第7牌
♥2
玩家杜子腾的第8牌
♦K
玩家刘碧悌的第8牌
♦2
玩家杜子腾的第9牌
♦Q
玩家刘碧悌的第9牌
♠6
玩家杜子腾的第10牌
王大
玩家刘碧悌的第10牌
♥5
玩家杜子腾的第11牌
♠J
玩家刘碧悌的第11牌
♣4
玩家杜子腾的第12牌
♦3
玩家刘碧悌的第12牌
♠Q
玩家杜子腾的第13牌
♦J
玩家刘碧悌的第13牌
♣10
玩家杜子腾的第14牌
♦9
玩家刘碧悌的第14牌
♣8
玩家杜子腾的第15牌
♦7
玩家刘碧悌的第15牌
♣J
玩家杜子腾的第16牌
♥8
玩家刘碧悌的第16牌
♣3
玩家杜子腾的第17牌
♠7
玩家刘碧悌的第17牌
♥9
玩家杜子腾的第18牌
♥A
玩家刘碧悌的第18牌
♥3
玩家杜子腾的第19牌
♥Q
玩家刘碧悌的第19牌
♠9
玩家杜子腾的第20牌
♣Q
玩家刘碧悌的第20牌
♠3
玩家杜子腾的第21牌
♠10
玩家刘碧悌的第21牌
♣7
玩家杜子腾的第22牌
♠A
玩家刘碧悌的第22牌
♦A
玩家杜子腾的第23牌
♠K
玩家刘碧悌的第23牌
♦8
玩家杜子腾的第24牌
♣2
玩家刘碧悌的第24牌
♣A
玩家杜子腾的第25牌
♥4
玩家刘碧悌的第25牌
♦5
玩家杜子腾的第26牌
♣9
玩家刘碧悌的第26牌
♣K
玩家杜子腾的第27牌
♣6
玩家刘碧悌的第27牌
♠4
杜子腾 的牌:
[‘♠2’, ‘王小’, ‘♥7’, ‘♦10’, ‘♥6’, ‘♠5’, ‘♦6’, ‘♦K’, ‘♦Q’, ‘王大’, ‘♠J’, ‘♦3’, ‘♦J’, ‘♦9’, ‘♦7’, ‘♥8’, ‘♠7’, ‘♥A’, ‘♥Q’, ‘♣Q’, ‘♠10’, ‘♠A’, ‘♠K’, ‘♣2’, ‘♥4’, ‘♣9’, ‘♣6’]
刘碧悌 的牌:
[‘♣5’, ‘♥K’, ‘♥10’, ‘♥J’, ‘♠8’, ‘♦4’, ‘♥2’, ‘♦2’, ‘♠6’, ‘♥5’, ‘♣4’, ‘♠Q’, ‘♣10’, ‘♣8’, ‘♣J’, ‘♣3’, ‘♥9’, ‘♥3’, ‘♠9’, ‘♠3’, ‘♣7’, ‘♦A’, ‘♦8’, ‘♣A’, ‘♦5’, ‘♣K’, ‘♠4’]
杜子腾胜利
end time :20190721 12:02:34
再玩一次,结果如下:刘碧悌胜利
start_game start time :20190721 12:11:06
她的名字是 :史真香
史真香 的职称是:荷兰官
玩家1是:杜子腾,他的等级是:1
玩家2是:刘碧悌,他的等级是:11
玩家杜子腾的第1牌
♣6
玩家刘碧悌的第1牌
♣7
玩家杜子腾的第2牌
♣9
玩家刘碧悌的第2牌
♣A
玩家杜子腾的第3牌
♠2
玩家刘碧悌的第3牌
♣3
玩家杜子腾的第4牌
♥5
玩家刘碧悌的第4牌
♠J
玩家杜子腾的第5牌
♠6
玩家刘碧悌的第5牌
♦A
玩家杜子腾的第6牌
♣J
玩家刘碧悌的第6牌
♥8
玩家杜子腾的第7牌
♦6
玩家刘碧悌的第7牌
♠5
玩家杜子腾的第8牌
♠3
玩家刘碧悌的第8牌
♠8
玩家杜子腾的第9牌
王小
玩家刘碧悌的第9牌
♣10
玩家杜子腾的第10牌
♥2
玩家刘碧悌的第10牌
♦3
玩家杜子腾的第11牌
♣K
玩家刘碧悌的第11牌
♥K
玩家杜子腾的第12牌
♥3
玩家刘碧悌的第12牌
♥A
玩家杜子腾的第13牌
♠7
玩家刘碧悌的第13牌
♦9
玩家杜子腾的第14牌
♦4
玩家刘碧悌的第14牌
♠A
玩家杜子腾的第15牌
♥6
玩家刘碧悌的第15牌
♣Q
玩家杜子腾的第16牌
♥4
玩家刘碧悌的第16牌
♦7
玩家杜子腾的第17牌
♥Q
玩家刘碧悌的第17牌
♠K
玩家杜子腾的第18牌
♦J
玩家刘碧悌的第18牌
♦2
玩家杜子腾的第19牌
♦5
玩家刘碧悌的第19牌
♥10
玩家杜子腾的第20牌
♥J
玩家刘碧悌的第20牌
♠9
玩家杜子腾的第21牌
♠10
玩家刘碧悌的第21牌
♥9
玩家杜子腾的第22牌
♠Q
玩家刘碧悌的第22牌
♠4
玩家杜子腾的第23牌
♦Q
玩家刘碧悌的第23牌
♣8
玩家杜子腾的第24牌
♦8
玩家刘碧悌的第24牌
♦10
玩家杜子腾的第25牌
♣2
玩家刘碧悌的第25牌
♦K
玩家杜子腾的第26牌
♣5
玩家刘碧悌的第26牌
王大
玩家杜子腾的第27牌
♣4
玩家刘碧悌的第27牌
♥7
杜子腾 的牌:
[‘♣6’, ‘♣9’, ‘♠2’, ‘♥5’, ‘♠6’, ‘♣J’, ‘♦6’, ‘♠3’, ‘王小’, ‘♥2’, ‘♣K’, ‘♥3’, ‘♠7’, ‘♦4’, ‘♥6’, ‘♥4’, ‘♥Q’, ‘♦J’, ‘♦5’, ‘♥J’, ‘♠10’, ‘♠Q’, ‘♦Q’, ‘♦8’, ‘♣2’, ‘♣5’, ‘♣4’]
刘碧悌 的牌:
[‘♣7’, ‘♣A’, ‘♣3’, ‘♠J’, ‘♦A’, ‘♥8’, ‘♠5’, ‘♠8’, ‘♣10’, ‘♦3’, ‘♥K’, ‘♥A’, ‘♦9’, ‘♠A’, ‘♣Q’, ‘♦7’, ‘♠K’, ‘♦2’, ‘♥10’, ‘♠9’, ‘♥9’, ‘♠4’, ‘♣8’, ‘♦10’, ‘♦K’, ‘王大’, ‘♥7’]
刘碧悌胜利
end time :20190721 12:11:33