目录
一、扑克牌
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}')