0
点赞
收藏
分享

微信扫一扫

面向对象应用(扑克牌,薪酬结算系统)

非衣所思 2022-05-05 阅读 45
python

目录

一、扑克牌

1、题目描述

2、分析

3、实现

3、1扑克类

3、2牌类

3、3玩家类

4、源码

二、薪酬

1、题目描述

2、分析

3、源码


一、扑克牌

1、题目描述

说明:简单起⻅见,我们的扑克只有52张牌(没有⼤⼩王),
游戏需要将52张牌发到4个玩家的⼿上,
每个玩家⼿上有13张牌,
按照⿊桃、红⼼、草花、⽅块的顺序和点数从⼩到⼤排列,暂时不实现其他的功能

2、分析

①首先分清楚要创建的类的个数,此处要创建三个类,一个是扑克类,一个是牌类,一个是玩家类

②扑克类的静态属性有52张扑克牌,方法有洗牌和发牌

③牌类有静态属性花色和大小

④玩家类有静态属性名字,以及方法摸排和排序

3、实现

3、1扑克类

①枚举:枚举类型可以通过继承Enum类来实现,注意Enum类是在enum模块中的

from  enum import Enum
class VIP(Enum):
	YELLOW = 1
	RED  = 2
	BLUE = 3

如上就创建了一个简单的枚举类型,我们可以查看枚举类型的名称和它的值

其中查看枚举成员可以采用点运算符或者方框运算符,这和普通的类是一模一样的。使用name可以查看枚举的名称,使用value可以查看枚举的值。与普通的类不同的是,我们还可以传入数字来得到枚举成员,所以枚举类型可以用值也可以用数字表示

②初始化:首先通过枚举将牌给声明出来存储到牌的对象中,牌包括花色和大小

②洗牌:也就是将牌类的顺序打乱,此时用到了random的shuffle函数

shuffle() 方法将序列的所有元素随机排序。

                random.shuffle (lst )

shuffle()是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。

③发牌:将牌发送到玩家手上,从以及初始化好的牌中将牌取出发给玩家,

④判断:因为牌的数量有限,所以要加上一个判断是否有牌发出,此时需用property声明,把一个方法当做属性来用

3、2牌类

①初始化:属性为花色和大小

②排序:因为要求将扑克牌按照一定的顺序排序,而此时的比较不是数值大小的比较(因为J,Q,K的值无法正常的比较)而是下标的比较,此时的下标的大小代表的就是真实值的大小。

③输出:此时的输出时按照一定的格式输出的,所以要进行输出格式化,即要重写str或者repr方法,两者的差别在于str是更符合人的习惯,而repe更符合机器的习惯

3、3玩家类

①初始化:包含玩家的名字,以及玩家拿到的牌(初值为空列表)

②摸排:将抽到的牌存放到列表中

③排序:使用内置的sort函数即可

4、源码

from enum import Enum

class Suite(Enum):
    """
    这个类继承与 Enum 那么这个类就叫做枚举类
    """
    #⿊桃、红⼼、草花、⽅块
    SPADE,HEART,CLUB,DIAMOND = range(4)


# for suite in Suite:
#     print(f'{suite},{suite.value}')
#
# print(Suite.SPADE)

"""
说明:简单起⻅见,我们的扑克只有52张牌(没有⼤⼩王),
游戏需要将52张牌发到4个玩家的⼿上,
每个玩家⼿上有13张牌,
按照⿊桃、红⼼、草花、⽅块的顺序和点数从⼩到⼤排列,暂时不实现其他的功能
"""
# 扑克类
# 静态属性  52张牌  方法   洗牌 发牌
# 牌类
# 花色   点数
# 玩家类
# 静态属性  玩家名字   摸牌  排序

import random
class Poker:

    def __init__(self):
        self.cards = [Card(suite,x) for suite in Suite for x in range(1,14)] #52张牌
        self.current = 0 # 设置发牌的位置  默认0

    # 洗牌
    def shuffle(self):
        random.shuffle(self.cards)

    # 发牌
    def deal(self):
        card = self.cards[self.current]
        self.current += 1
        return card # 发牌要把牌给到玩家

    @property
    def has_card(self):   # 加上 property  对象.has_card  不需要加()
        # 把一个方法当做属性来用
        # 是否有牌可发
        return self.current < len(self.cards)

class Card:

    def __init__(self,suite,face):
        # 这是实例化对象用的
        self.suite = suite
        self.face = face

    def __gt__(self, other):
        # 默认比较的是内存地址
        # 我们想对扑克进行 排序  指定按照点数排序  需要重写  __gt__
        # 当两个对象进行比较的时候  __gt__自动被触发  所以需要虫写 __gt__
        if self.suite == other.suite:
            return self.face > other.face
        return self.suite.value>other.suite.value
    # 发牌 洗牌 摸牌 需要显示牌的花色和点数的
    # 所以我们需要 将对象的信息格式化后输出
    def __repr__(self):
        suites = '♤♡♣♢'
        faces = ['','A','2','3','4','5','6','7','8','9','10','J','Q','K']
        # 目的为了让索引和值对应起来  faces[1] = 'A'
        return f'{suites[self.suite.value]}{faces[self.face]}'

# card1 = Card(Suite.SPADE,5)
# card2 = Card(Suite.HEART,1)
#
# print(card1,card2)


class Player:


    def __init__(self,name):
        self.name = name
        self.cards = []  # 存放这个玩家拿到的牌

    def get_card(self,card):
        self.cards.append(card)

    def range_cards(self):
        self.cards.sort()

p = Poker() # 买了一副扑克
# 开始洗牌
p.shuffle()

# 聚齐四个玩家

palyers = [Player('麦迪'),Player('艾佛森'),Player('卡特'),Player('科比')]

# print(palyers)

for player in palyers:
    for x in range(13):
        player.get_card(p.deal())
# 打印结果

for player in palyers:
    player.range_cards()
    print(f'{player.name}:{player.cards}')

二、薪酬

1、题目描述

某公司有三种类型的员工,分别是部门经理、程序员和销售员。
其中,部门经理每月固定月薪15000元;程序员计时支付月薪,每小时200元;销售员按照1800元底薪加上销售额5%的提成支付月薪。
设计一个工资计算系统,录入员工信息,计算员工的月薪。

2、分析

①首先定义一个员工类,定义其信息属性和薪酬方法

②定义经理、程序员、销售员等类,继承与员工类

③在不同类里面重写员工类的薪酬方法,因为不同职务计算的方式不一样

④因为计算方式不一样,所以需要的参数不一样,所以需要进行判断到底属于哪个职务,此时用的是isinstance()函数,判断其属于哪个类,然后再输入所需的参数,最后计算其薪酬

3、源码

# -*- coding: utf-8 -*-

"""
某公司有三种类型的员工,分别是部门经理、程序员和销售员。
其中,部门经理每月固定月薪15000元;程序员计时支付月薪,每小时200元;销售员按照1800元底薪加上销售额5%的提成支付月薪。
设计一个工资计算系统,录入员工信息,计算员工的月薪。
"""
from abc import ABCMeta,abstractmethod
class Employee(metaclass=ABCMeta): # 抽象类不能实例化对象  但是子类可以继承

    def __init__(self,name):
        self.name = name

    @abstractmethod
    def give_salary(self): # 这个方法不能直接调用 但是子类可以重写
        pass

class Manager(Employee):

    def give_salary(self):
        return 15000.00

class Programmer(Employee):

    def __init__(self,name,work_hour=0):
        super(Programmer, self).__init__(name)
        self.work_hour = work_hour




    def give_salary(self):
        return self.work_hour*200

class SalesMan(Employee):

    def __init__(self,name,sales=0):
        super(SalesMan, self).__init__(name)
        self.sales = sales

    def give_salary(self):
        return self.sales*0.05+1800


emps = [Manager('曹操'),
        Programmer('诸葛亮'),Programmer('周瑜'),Programmer('关羽'),
        SalesMan('大乔'),SalesMan('小乔')]
for emp in emps:
    if isinstance(emp,Programmer):
        emp.work_hour = float(input(f'请输入你的{emp.name}工作时长:'))
    elif isinstance(emp,SalesMan):
        emp.sales = float(input(f'请输入{emp.name}的销售额:'))

    print(f'{emp.name}本月月薪为¥{emp.give_salary():.2f}')
举报

相关推荐

0 条评论