0
点赞
收藏
分享

微信扫一扫

Python语法进阶篇 - 84 - 综合实战 - 抽奖系统之user模块 - user的抽奖逻辑实现

万叶集
🎉 隐约雷鸣,阴霾天空。 🎉
🎉 但盼风雨来,能留你在此。 🎉

文章目录

大家好呀,这一章节我们来开发 “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)

执行结果如下:



举报

相关推荐

Python实战:年会抽奖程序实现

0 条评论