python生成扑克牌并实现比较大小玩法

编程目的:本内容主要是通过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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值