请以此公式“单人最小金额为0.01,最大金额为[(总金额-总使用的金额)/总红包数量]*2构建出一个微信抢红包模拟器。 提示:随机数可导入random获得,且UI界面不重要。并防止用户输入无效信息导致程序报错
解析:
# 导入random,easygui,pygame import random as random import easygui as easygui # 由于Mac.Os系统中无法在easygui提示框中输入中文,所以在控制台打印需要的字符'抢',当需要时只需要复制粘贴即可 print('抢') # 创建空列表总金额 total_amount = [] # 创建变量'次数' times = 0 # 创建变量'人数' qty_persons = easygui.enterbox('请选择抢红包总人数') # 死循环(line.13--line30为检验数据部分) while True: # 创建变量'人数布尔值'赋值为:查看变量'人数'是否完全由整数组成 qty_pers_bool = qty_persons.isdigit() # 如果变量'人数'等于零 if qty_persons == '0': # 重新赋值变量'人数' qty_persons = easygui.enterbox('数据错误,总人数不能为零,请再次选择抢红包总人数') # 如果变量'人数布尔值'不为真(即变量'人数'不完全由整数组成) if not qty_pers_bool: # 重新赋值变量'人数' qty_persons = easygui.enterbox('数据错误,请再次选择抢红包总人数') # 否则(即变量'人数'完全由整数组成) else: # 将变量'人数'重新赋值为整型后变量'人数' qty_persons = int(qty_persons) # 终止死循环 break # 创建变量'红包数量' qty_package = easygui.enterbox('请发红包者选择红包数量') # 死循环(line.34--line51为检验数据部分) while True: # 创建变量'红包数量布尔值'赋值为:查看变量'红包数量'是否完全由整数组成 qty_pac_bool = qty_package.isdigit() # 如果变量'红包数量'等于零 if qty_package == '0': # 重新赋值变量'红包数量' qty_package = easygui.enterbox('数据错误,红包数量不能为零,请发红包者再次选择红包数量') # 如果变量'红包数量布尔值'不为真(即变量'红包数量'不完全由整数组成) if not qty_pac_bool: # 重新赋值变量'红包数量' qty_package = easygui.enterbox('数据错误,请发红包者再次选择红包数量') # 否则(变量'红包数量'完全由整数组成) else: # 将变量'红包数量'重新赋值为整型后变量'红包数量' qty_package = int(qty_package) # 终止死循环 break # 如果变量'人数'小于变量'红包数量'(line.53--line.55为数据检验部分) if qty_persons < qty_package: # 重新赋值变量'qty_package' qty_package = easygui.enterbox('数据错误,红包数量不能大于人数,请再次选择红包数量') # 创建变量'金额' amount = easygui.enterbox('请发红包者选择红包总金额') # 创建变量'amo_bool'赋值为:查看变量'amount'是否完全由整数组成 amo_bool = amount.isdigit() while True: # 如果变量'总金额'等于零 if amount == '0': # 重新赋值变量'总金额' amount = easygui.enterbox('数据错误,红包总金额不能为零,请发红包者再次选择红包数量') # 否则(即总金额不等于零) else: break # 如果变量'amo_bool'不为真(即变量'amount'不完全由整数组成) if not amo_bool: # 将变量'amount'重新赋值为浮点化变量'amount' amount = float(amount) # 否则(变量'amount'完全由整数组成) else: # 将变量'amount'重新赋值为整型后变量'amount' amount = int(amount) # 提示信息"如想抢红包,请输入'抢'" easygui.msgbox("如想抢红包,请输入'抢'") # 提示信息'开始' easygui.msgbox('开始') # 创建'储存'类 class Storage: # 实例化方法 def __init__(self, amount, qty_package): self.amount = amount self.qty_package = qty_package # 创建'储存'方法 def storage(self): # 全局化列表'总金额' global total_amount # 添加元素'金额' total_amount.append(self.amount) # 死循环 while True: # 创建变量'人物' person = easygui.enterbox('现在抢吗?') # '次数'+1 times += 1 # 如果'次数'小于等于'红包数量' if times <= qty_package: # 如果人物等于'抢' if person == '抢': # 如果'次数'小于'红包数量' if times < qty_package: # 创建变量'单人最小金额'(单位:元) person_amount_Min = 0.01 # 创建变量'单人最大金额'(这个金额的大小来源于某微信内部工程师给出的最大金额公式,即:剩余金额平均值[(总金额-总使用的金额)/总红包数量]的2倍) person_amount_Max = (amount - sum(total_amount)) / qty_package * 2 # 创建变量'单人金额',取出金额最小值与最大值间的随机数 person_amount_eight = random.uniform(person_amount_Min, person_amount_Max) # 将变量'单人金额'去其四舍五入两位小数 person_amount = round(person_amount_eight, 2) # 提示信息'恭喜您获得了'单人金额'元' easygui.msgbox('恭喜您获得了' + str(person_amount) + '元') # 注意!此处在死循环中 # 由于死循环的影响,不停地传入参数'单人最小金额'与'红包数量' s = Storage(person_amount, qty_package) # 不停地调用'储存'方法,使列表内不停地添加元素,从而储存每次抢到的金额 s.storage() # 如果次数等于红包数量(即这是最后一个红包了) elif times == qty_package: # 获取列表'总金额'的总数,并赋值给变量'其他金额' other_amount = sum(total_amount) # 创建变量'最后金额'赋值为金额-其他金额 final_last_amount = amount - other_amount # 提示信息'恭喜您获得了'最后金额'元' final_last_amount = round(final_last_amount, 2) easygui.msgbox('恭喜您获得了' + str(final_last_amount) + '元') # 如果红包数量等于人数(即所有人都能抢到红包) if qty_package == qty_persons: # 终止死循环 break # 如果次数大于红包数量(即有人没法抢到红包) elif times > qty_package: # 如果人物等于抢(即这时[见上]有人要抢) if person == '抢': # 提示信息'手慢了,红包派完了' easygui.msgbox('手慢了,红包派完了') # 如果次数等于人数(即所有人都抢红包了) if times == qty_persons: # 终止死循环 break