容器综合案例-双色球
玩法规则:
“双色球”每注投注号码由 6 个红色球号码和 1 个蓝色球号码组成。红色球号码从 1—33 中选择,蓝色球号码从 1—16 中选择。 球的数字匹配数量和颜色决定了是否中奖。
具体中奖规则:
需求:
1.生成本期双色球中奖号码。
(注意:1.生成的红球随机有序且不可重复、2.蓝球和红球的随机范围不同且篮球允许和红球重复)2.两种产生数据方式
2.1通过控制台输入竞猜号码。
2.2自动生成
3.记录红球、蓝球竞猜正确球的数量,并根据获奖条件输出竞猜结果和本期双色球号码
运行效果图:
启动画面
机选效果
自选效果
import random
def get_custom_balls():
# 准备一个彩票
balls = []
# 让用户输入选择
while True:
input_red = input("请输入6个红球(范围1-33): ")
input_red = input_red.split()
if len(input_red) != 6:
print("红球数量错误,请重新输入")
continue
# 将6个红球转成整型
input_red = [int(x) for x in input_red]
# 对红球进行排序
input_red.sort()
# 判断红球是否越界
if input_red[0] < 1 or input_red[5] > 33:
print("红球越界了,请重新输入")
continue
# 判断红球是否重复
if len(set(input_red)) < 6:
print("红球重复了,请重新输入")
continue
balls += input_red
break
# 让用户输入蓝球
while True:
input_blue = int(input("请输入一个蓝球(范围1-16): "))
if input_blue > 16 or input_blue < 0:
print("蓝球越界,请重新输入")
continue
balls.append(input_blue)
break
return balls
def get_random_balls():
# 准备一个红球池
red_balls = list(range(1, 34))
# 创建双色球
balls = []
# 循环6次,取6个红球
for i in range(6):
# 生成一个随机下标
random_index = random.randint(0, len(red_balls) - 1)
# 从红球池中获取一个随机的球,从中移除,并添加到双色球中
balls.append(red_balls.pop(random_index))
# 对红球排序
balls.sort()
# 随机篮球
balls.append(random.randint(1, 16))
return balls
def get_ball_desc(balls):
red = map(lambda x: f"{x:02d}", balls[:6])
blue = f"{balls[6]:02d}"
return f"红球: {', '.join(red)} 蓝球: {blue}"
def get_ticket_money(level):
mapping = {1: 5000000, 2: 500000, 3: 3000, 4: 200, 5: 10, 6: 5, 7: 0}
return mapping.get(level, 0)
def check_balls(user_balls, ticket_balls):
# 将用户选择的双色球、中奖号码双色球的红球部分提取到set中
user_balls_set = set(user_balls[:6])
ticket_balls_set = set(ticket_balls[:6])
# 计算两个集合的交集,长度就是中奖号码的个数
red_number = len(user_balls_set & ticket_balls_set)
# 计算蓝球数量
blue_number = 1 if user_balls[6] == ticket_balls[6] else 0
# 记录中奖等级
if red_number == 6 and blue_number == 1:
ticket_level = 1
elif red_number == 6 and blue_number == 0:
ticket_level = 2
elif red_number == 5 and blue_number == 1:
ticket_level = 3
elif red_number + blue_number == 5:
ticket_level = 4
elif red_number + blue_number == 4:
ticket_level = 5
elif blue_number == 1:
ticket_level = 6
else:
ticket_level = 7
return ticket_level, get_ticket_money(ticket_level)
def get_level_upper(ticket_level):
mapping = {1: '一等奖', 2: '二等奖', 3: '三等奖', 4: '四等奖', 5: '五等奖', 6: '六等奖'}
return mapping.get(ticket_level)
def user_operation():
"""
用户的操作界面
:return: None
"""
print(f"{' 欢迎使用双色球系统 ':*^60}")
while True:
# 让用户输入自己的选择
while True:
user_choice = int(input("请输入您的选择: 1、自选号码 2、机选号码 0、退出系统 "))
if user_choice in (0, 1, 2):
break
# 根据用户的选择,执行不同的操作,生成用户选择的双色球
user_balls = []
match user_choice:
case 1:
user_balls = get_custom_balls()
case 2:
user_balls = get_random_balls()
case 0:
break
# 系统随机生成一注双色球,作为中奖号码
ticket_balls = get_random_balls()
# 匹配两注双色球,获取中奖等级以及奖金
ticket_level, ticket_money = check_balls(user_balls, ticket_balls)
# 打印最后的结果
print(f"您的选择是: {get_ball_desc(user_balls)}")
print(f"中奖号码是: {get_ball_desc(ticket_balls)}")
if 1 <= ticket_level <= 6:
print(f"🎉🎉🎉恭喜!!!您中了{get_level_upper(ticket_level)},奖金 {ticket_money:,}元!")
else:
print("很遗憾,您本次没有中奖,请再接再厉!")
print("再见!欢迎下次再来使用!")
user_operation()