第五章 Python数据容器 08-容器综合案例

容器综合案例-双色球

玩法规则:

“双色球”每注投注号码由 6 个红色球号码和 1 个蓝色球号码组成。红色球号码从 1—33 中选择,蓝色球号码从 1—16 中选择。 球的数字匹配数量和颜色决定了是否中奖。

具体中奖规则:

20200810164037883

需求:

1.生成本期双色球中奖号码。
(注意:1.生成的红球随机有序且不可重复、2.蓝球和红球的随机范围不同且篮球允许和红球重复)

2.两种产生数据方式

2.1通过控制台输入竞猜号码。

2.2自动生成

3.记录红球、蓝球竞猜正确球的数量,并根据获奖条件输出竞猜结果和本期双色球号码

运行效果图:

启动画面

iShot_2022-12-20_11.43.32

机选效果

iShot_2022-12-20_11.43.03

iShot_2022-12-20_11.47.56

自选效果

iShot_2022-12-20_11.42.42

iShot_2022-12-20_11.47.45

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值