栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

前言:
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 哈士奇 。(我真的有一只哈士奇)
CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主
 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步
 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。
 如果感觉博主的文章还不错的话,还请关注、点赞、收藏三连支持一下博主哦


系列专栏:
               ⛽️ Python全栈系列 - [更新中]     【 本文在该系列】
                        Python零基础入门篇
                        Python语法进阶篇
                网安之路系列
​                        网安之路踩坑篇
​                        网安知识扫盲篇
​                        Vulhub 漏洞复现篇
​                        Shell脚本编程篇
​                        Web攻防篇   2021年9月3日停止更新,转战先知等安全社区
​                        渗透工具使用集锦  2021年9月3日停止更新,转战先知等安全社区
​                ⭐️ 点点点工程师系列
​                        测试神器 - Charles 篇
​                        测试神器 - Fiddler 篇
​                        测试神器 - Jmeter 篇
​                        自动化 - RobotFrameWork 系列
​                        自动化 - 基于 JAVA 实现的WEB端UI自动化
                        自动化 - 基于 MonkeyRunner 实现的APP端UI自动化

文章目录
    •  构造函数内添加 1 - 100 的列表用于判断中奖率
    •  抽奖函数 - choice_gift()

大家好呀,这一章节我们来开发 “gift” 这个项目中最重要的核心部分,抽奖函数的相关逻辑。大概分三层来进行开发:

  • 第一层:首先要去做随机判断奖池第一层的奖品等级,也就是 PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize'] ;利用 random 模块的随机数分别获取 'FourthPrize'、 'ThirdPrize'、 'SecondPrize'、 'FirstPrize'。
    • FourthPrize:1-50,即 50%概率
    • ThirdPrize:51-80,即 30%概率
    • SecondPrize:81-95,即 15% 概率
    • FirstPrize:96-100,即 5% 概率
  • 第二层:当获取到了 第一层 的奖品等级(也就是 [‘FourthPrize’, ‘ThirdPrize’, ‘SecondPrize’, ‘FirstPrize’])之后,紧接着就是获取第二层级的奖品信息。第二层依然需要判断,也就是 LEVELNUMS = ['level1', 'level2', 'level3'] ;然后利用 random 模块的随机数分别获取 ['level1', 'level2', 'level3'] 。
    • level1:1-80,即 80% 概率
    • level2:81-95,即 15% 概率
    • level3:96-100,即 5% 概率
  • 第三层:拿到最终的奖池信息之后,接下来就需要获取到最终的奖品信息(即获取到对应层级的真实奖品)。这个时候可以随机一个奖品并查看奖品的数量是否为 0 ,不为 0 则中奖并提示用户,同时奖品数量减 1 ,将奖品信息更新到 user.json 文件的 gifts 标签内;若数量为 0 ,则提示用户未中奖。

PS:在构造函数内定义一个 1 - 100 的列表 ,用于判断用户的中奖概率。

 构造函数内添加 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 类 的获取奖品函数进行二次开发`)
    *****************************************************************************************************
    抽奖逻辑的实现:
    第一层:首先要去做随机判断奖池第一层的奖品等级,
    也就是 `PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize']` ;
    利用 `random` 模块的随机数分别获取 `'FourthPrize'、 'ThirdPrize'、 'SecondPrize'、 'FirstPrize'`。
      - FourthPrize:1-50,即 50%概率
      - ThirdPrize:51-80,即 30%概率
      - SecondPrize:81-95,即 15% 概率
      - FirstPrize:96-100,即 5% 概率
      
    第二层:当获取到了 第一层 的奖品等级(也就是 ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize'])之后,
    紧接着就是获取第二层级的奖品信息。第二层依然需要判断,也就是 `LEVELNUMS = ['level1', 'level2', 'level3']` ;
    然后利用 `random` 模块的随机数分别获取 `['level1', 'level2', 'level3']` 。
      - level1:1-80,即 80% 概率
      - level2:81-95,即 15% 概率
      - level3:96-100,即 5% 概率
      
    第三层:拿到最终的奖池信息之后,接下来就需要获取到最终的奖品信息(即获取到对应层级的真实奖品)。
    这个时候可以随机一个奖品并查看奖品的数量是否为 0 ,不为 0 则中奖并提示用户,同时奖品数量减 1 ,
    将奖品信息更新到 `user.json` 文件的 `gifts` 标签内;若数量为 0 ,则提示用户未中奖。
    *****************************************************************************************************
"""

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)

执行结果如下:



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/849046.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号