万叶集 |
---|
🎉 隐约雷鸣,阴霾天空。 🎉 |
🎉 但盼风雨来,能留你在此。 🎉 |
文章目录
大家好呀,这一章节我们来开发 “gift” 这个项目中最重要的核心部分,抽奖函数的相关逻辑。大概分三层来进行开发:
🐳 构造函数内添加 1 - 100 的列表用于判断中奖率
代码示例如下:
class User(Base): # 定义 user 类,继承 Base 类
def __init__(self, username, user_json, gift_json): # 构造函数
self.username = username
self.gift_random = list(range(1, 101)) # 添加 1 - 100 的列表用于判断中奖率
super().__init__(user_json, gift_json) # 同时也利用super()函数继承并使用 Base 类的构造函数
self.get_user()
🐳 抽奖函数 - choice_gift()
代码示例如下:choice_gift() 函数
# coding:utf-8
import os
import random
from base import Base
from common.utils import timestamp_to_string
from common.error import NotUserError, UserActiveError, RoleError, CountError
"""
***************************************************
1、user 类的初始化( `继承Base类`)
2、get_user(`Base类中时间的转变`)
3、查看奖品列表(`针对 Base 类 的获取奖品函数进行二次开发`)
***************************************************
"""
class User(Base): # 定义 user 类,继承 Base 类
def __init__(self, username, user_json, gift_json): # 构造函数
self.username = username
self.gift_random = list(range(1, 101)) # 添加 1 - 100 的列表用于判断中奖率
super().__init__(user_json, gift_json) # 同时也利用super()函数继承并使用 Base 类的构造函数
self.get_user()
def get_user(self): # 定义 get_user() 函数
users = self._Base__read_users() # 实例化 Base 类的 __read_user()方法
if self.username not in users: # 判断 username 是否存在,不存在则抛出自定义的 NotUserError 异常
raise NotUserError('not user %s' % self.username)
current_user = users.get(self.username) # 获取用户名
if current_user.get('active') == False: # 判断用户是否处于可用状态
raise UserActiveError('the user %s had not use'.format(self.username))
if current_user.get('role') != 'normal': # 判断用户的权限是否是 normal ,非 normal 不可参与抽奖
raise RoleError('permission by normal')
self.user = current_user
self.name = current_user.get('username')
self.role = current_user.get('role')
self.gifts = current_user.get('gifts')
self.create_time = timestamp_to_string(current_user.get('create_time'))
def get_gifts(self): # 定义 get_gifts 函数,获取奖品信息
gifts = self._Base__read_gifts() # 调用 Base 类的 __read_gifts() 函数
# print(gifts) # 调试打印输出 Base 类的 __read_gifts() 函数 获取的奖品信息
gift_lists = [] # 定义 一个空列表,用以存储 "奖品信息"
for prize_level, prize_level_pool in gifts.items(): # for 循环获取第一层级下的奖品信息;其实我们需要的就是奖品信息
# print(prize_level_pool) # 调试打印输出 第一层级下的奖品信息
for level_num, level_num_pool in prize_level_pool.items():
# print(level_num_pool) # 调试打印输出 第二层级下的奖品信息
for gift_name, gift_info in level_num_pool.items():
# print(gift_info) # 调试打印输出 第二层级下的奖品的详细信息
gift_lists.append(gift_info.get('name')) # 将 gift_info 获取到的奖品的 name 添加至 gift_lists 列表
# print(gift_lists) # 调试打印输出 gift_lists 列表的奖品信息
return gift_lists # 返回 gift_lists 列表
def choice_gift(self):
# TODO 获取第一层级的信息
first_level, second_level = None, None
prize_level_count = random.choice(self.gift_random) # 获取第一层级的随机数字
if 1 <= prize_level_count <= 50: # 判断获取的随机数字,根据数字获取对应的第一层级的奖品等级;否则抛出自定义 CountError 异常
first_level = 'FourthPrize'
elif 51 <= prize_level_count <= 80:
first_level = 'ThirdPrize'
elif 81 <= prize_level_count <= 95:
first_level = 'SecondPrize'
elif 96 <= prize_level_count <= 100:
first_level = 'FirstPrize'
else:
raise CountError('prize_level_count need 0~100')
gifts = self._Base__read_gifts()
prize_level = gifts.get(first_level)
# print(prize_level) # 调试打印输出每次获取的第一层级 prize_level 对应的奖品信息(每次都不一样)
level_num_count = random.choice(self.gift_random) # 获取第二层级的随机数字
if 1 <= level_num_count <= 80: # 判断获取的随机数字,根据数字获取对应的第二层级的奖品等级;否则抛出自定义 CountError 异常
second_level = 'level1'
elif 81 <= level_num_count <= 95:
second_level = 'level2'
elif 96 <= level_num_count <= 100:
second_level = 'level3'
else:
raise CountError('level_num_count need 0~100')
level_num = prize_level.get(second_level)
# print(level_num) # 调试打印输出每次获取的第二层级 level_num 对应的奖品信息(每次都不一样)
if len(level_num) == 0: # 判断奖品信息长度,如果为0则提示未中奖
print('哦可惜 您没有中奖')
return
gift_names = [] # 定义一个空列表用以存储奖品名称
for name, _ in level_num.items(): # 这里的 "_" 是为了屏蔽 level_num 这个第二层级奖品信息(字典形式)的 value 的值
gift_names.append(name)
gift_name = random.choice(gift_names)
# print(gift_name) # 调试打印输出 gift_name
gift_info = level_num.get(gift_name)
if gift_info.get('count') <= 0:
print('哦可惜 您没有中奖')
return
gift_info['count'] -= 1
level_num[gift_name] = gift_info
# print(level_num[gift_name]) # 调试打印输出 level_num[gift_name] 的信息
prize_level[second_level] = level_num
gifts[first_level] = prize_level
self._Base__save(gifts, self.gift_json)
self.user['gifts'].append(gift_name)
self.update()
print('恭喜 {} 获得 {} 奖品'.format(self.name, gift_name))
def update(self): # 定义一个 update 函数,用以抽奖函数 choice_gift();【用户抽完奖后,更新该用户的 gifts 标签】
users = self._Base__read_users()
users[self.username] = self.user
self._Base__save(users, self.user_json)
if __name__ == '__main__':
gift_path = os.path.join(os.getcwd(), 'storage', 'gift.json')
user_path = os.path.join(os.getcwd(), 'storage', 'user.json')
user = User('Adem', user_path, gift_path)
# print('username:', user.username, 'create_time:', user.create_time, 'gifts:', user.gifts, 'role:', user.role)
# result = user.get_gifts()
# print(result)
result = user.choice_gift()
print(result)
执行结果如下: