第一阶段:Python开发基础 day11 课后作业--猜年龄游戏函数版


程序要求:

  1. 在猜年龄的基础上编写登录、注册方法,并且把猜年龄游戏分函数处理,如
  2. 登录函数
  3. 注册函数
  4. 猜年龄函数
  5. 选择奖品函数
import random
import os
# 编写注册模块函数
def regist():
    '''用于用户注册的模块函数'''

    print('*' * 40, '注册模块', '*' * 40)
    while True:
        check_tar = 0  # 用作登陆的用户名是否存在核验所用
        username = input('请输入你要注册的用户名:').strip()  # 接收用户输入的用户名并做去除两端空格操作
        password = input('请输入你要注册的密码:').strip()  # 接收用户输入的密码并做去除两端空格操作
        re_pwd = input('请再次确认你的密码:').strip()  # 接收用户输入的确认密码
        # 检测输入的用户名和密码是否为空
        if username == '' or password == '' or re_pwd == '':
            print('你输入的账号或密码或确认密码为空,请重新输入')
            continue
        # 检测输入的密码和确认密码是否一致
        elif password != re_pwd:
            print('你两次输入的密码不同,请重新输入!')
            continue
        #  检测当前文件夹下是否有user.txt 文件,如果有就进行用户名核验
        if os.path.exists('user.txt') :
            # 首先先打开文件查看一下注册的用户名是否已经在文件中了
            with open('user.txt', 'r') as user_r:  # 打开文件
                check_data = user_r.read()
            # 如果文件不为空
            if check_data != '':
                check_data = check_data.split('\n')  # 文件处理数据
                for ckeck_info in check_data:  # 取出每一条在文件中的注册数据
                    check_info_list = ckeck_info.split('|')  # 处理用户数据
                    # 做判断是否存在 存在就跳出for循环
                    # print(check_info_list)
                    if username == check_info_list[0]:
                        print('你注册的用户名已存在请重新输入一个不同的!')
                        check_tar = 1  # 这个时候设置一个状态,以此来结束外层当前本次循环
                        break
        # 如果状态被修改就跳过本次循环
        if check_tar == 1 :
            continue
        # 不存在就 执执行追加文件
        with open(r'user.txt', 'a') as user_w:  # 打开db文件夹下的user.txt文件
            user_w.write(username + '|' + password + '\n')  # 以 这种格式:nick|nick123  将获取来的账号和密码放入user.txt文件中
        print('恭喜你,完成注册!现在可以去选择登陆啦')
        break


# 编写登陆模块的函数
def login():
    '''用于用户登录的模块函数'''
    print('*' * 40, '登陆模块', '*' * 40)
    login_tar = 0  # 0 表示登陆成功 1 表示不成功
    count = 3
    while count > 0:
        check_num = random.randint(1000, 9999)  # 定义一个check_num 变量用于做为验证码的功能 就是随机生成一段四位数的数字
        username = input('请输入你的用户名:')  # 接收用户输入用于登陆的用户名
        password = input('请输入你的密码:')  # 接收用户输入用于登陆的密码
        # 小判断,检测输入的用户或密码是否为空 如果为空给提示,减登陆次数并跳过接下来的程序重新执行登陆
        if username == '' or password == '':
            print(f'你的输入的账号或密码为空,请重新输入。剩余可登录次数为:{count - 1}')
            count -= 1
            continue
        print(f'你此次登陆的验证码为:{check_num}')  # 打印 验证码,以供用户输入
        check_code = input('请输入显示的验证码:').strip()  # 接收用户输入的验证码
        # 判断验证码输入是否为空,如果为空给提示 减登陆次数,跳出本次循环
        if check_code == '':
            print(f'你的输入的验证码为空,请重新输入。剩余可登录次数为:{count - 1}')
            count -= 1
            continue
        # 对比输入的验证码和给出的验证码是否相同,如果不同给提示,减次数,跳出循环
        elif check_num != int(check_code):
            print(f'你的验证码输入有误,请重新输入。剩余可登录次数为:{count - 1}')
            count -= 1
            continue
        #  如果上面的 简单判断 都没有问题,证明输入进来的数字还算是有效字符
        if os.path.exists('user.txt') :
            #  这个时候打开存储了用户注册信息的文件进行用户名 和密码验证
            with open(r'user.txt', 'r') as user_r:  # 打开db文件夹下的user.txt 文件
                user_info_list = user_r.read().split('\n')  # 取出文件中的数据并做处理放入一个列表中
                # print(user_info_list)  # 打印一下列表中的数据查看规律 # ['user|pwd', 'aa|aa', '']
                #  循环从用户信息列表中取出每条数据
                for user_info in user_info_list:
                    user_info = user_info.split('|')  # 对取出的单个数据进行处理成为我们想要的格式
                    # print(user_info)   # ['user', 'pwd'] 这个user_info 变成了一个列表,列表元素 0 是用户名,元素1 是密码
                    # 对用户名和密码进行比对,如果正确,将count 清零,然后跳出 该层循环
                    if username == user_info[0] and password == user_info[1]:
                        print('恭喜你登录成功')
                        login_tar = 1 # 当登陆成功之后将这个状态置为1
                        count = 0  # 这一步的作用就是为了停止最外层的 while 循环
                        break  # 这个break 是停止 从文件中取出的数据的这个for循环
                else:  # 这里就是循环完文件中的数据,没有找到与我们输入的用户密码一致的数据,给提示,减次数
                    print(f'对不起你输入的账号密码有误,请重新输入。剩余可登录次数为:{count - 1}')
                    count += 1
        else:
            print('当前用户没注册,请去注册一个账号再来')
            count = 0

    return login_tar
## 猜年龄的模块函数
def guess_age() :
    '''这个函数是用来实现可以进行猜密码的功能'''
    # 导入随机数的模块库
    import random
    # 首先随机一个18-60之间的年龄
    random_age = random.randint(18, 60)
    # 定义一个变量做游戏次数计数
    count = 0
    # 打印一个游戏开始的头(纯属为了显示好看)
    print('*' * 40, '猜年龄游戏开始', '*' * 40)

    # 程序主题,开始进行循环控制
    while count < 3:
        # 用户输入自己猜测的年龄
        guess_age = input(f'请输入你猜的年龄,还有{3 - count}次游戏机会:')
        # 游戏次数减一
        count += 1
        # 判断输入的字符是否符合要求,不符合则跳出重新输入
        if not guess_age.isdigit():
            print('你的输入有误,请输入正确的格式')
            if count == 3:
                inp_y = input('你的游戏次数已用完,请输入"y or Y "获得三次游戏机会:').lower()
                # 如果输入了y就,将count 置为 0 ,继续游戏
                if inp_y == 'y':
                    count = 0
                else:
                    # 如果没有输入y,而是其他字符就直接结束游戏
                    print('你的输入有误,已退出游戏')
                    count = 3
            continue

        # 将输入的字符型数据转换为整型
        guess_age = int(guess_age)
        # 判断输入的年龄和我们要猜的年龄
        if guess_age == random_age:
            print('恭喜您,猜中了。接下来进入抽奖环节')

            # 猜中了,调用抽奖模块函数,执行抽奖程序
            choose_prize()
            # 跳出while循环,结束游戏
            count = 4
        elif guess_age > random_age:
            print('对不起,猜大了')
        elif guess_age < random_age:
            print('对不起猜小了')
        # 当count为3的时候证明已经猜了三次,这个时候要选择是否继续猜下去了
        if count == 3:
            inp_y = input('你的游戏次数已用完,请输入"y or Y "获得三次游戏机会:').lower()
            # 如果输入了y就,将count 置为 0 ,继续游戏
            if inp_y == 'y':
                count = 0
                continue
            else:
                # 如果没有输入y,而是其他字符就直接结束游戏
                print('你的输入有误,已退出游戏')
                count = 4
    # 打印游戏结束语(纯属好看,没有实际意义)
    print('\n', "*" * 40, "游戏结束", "*" * 40)

# 选择奖品模块函数
def choose_prize() :
    '''这是猜中了之后进行选择奖品的函数'''
    # 猜对之后就进入到抽奖环节
    get_prize = {}  # 定义一个空字典,用于存储接下来获得奖励
    # 首先打印出所有的奖品选项
    with open('prize.txt', 'r', encoding='utf8') as f:
        data = f.read()
    # 将文件中的数据放入到一个数据字典中
    data_dict = dict(eval(data))
    # 打印这个字典中的数据
    for k, v in data_dict.items():
        print(f'奖品编号:{k} {v}')
    # 进行抽奖循环
    for i in range(2):
        in_start = input(f'请输入"s or S"进行抽奖,剩余{2 - i}次抽奖机会:').lower()
        if in_start == 's':
            # 随机获取中奖的编号
            prize_num = random.randint(0, 8)
            # 打印抽出来的结果
            print(f'恭喜您抽得以下奖品:{data_dict[prize_num]}')
            # 将 抽出来的奖品放入到我们的奖品字典中
            if data_dict[prize_num] in get_prize.keys():
                get_prize[data_dict[prize_num]] += 1
            else:
                get_prize[data_dict[prize_num]] = 1
        else:
            print('你放弃了一次抽奖机会')
    else:
        print('您的抽奖机会已用完,您获得以下奖品:')
        # 打印出我们抽到的奖品汇总信息
        for i, j in get_prize.items():
            print(f'奖品{i} {j}个', end=' ')
        print()

####  注:上面都是相关函数的定义,下面才是具体的调用执行过程
# 第一步,首先调用注册函数,实现用户注册的功能
print('\n', "*" * 40, "欢迎来玩猜游戏", "*" * 40)
while True:
    in_num = input('''想玩游戏要有账号哟,请做出以下选择(没有账号请选1.注册,已有账号请选择2.登陆,选择0退出游戏):
1.注册
2.登陆
0.退出
    ''')
    if in_num == '1' :
        regist()
        continue
    elif in_num == '2' :
        if login() == 1 :
            guess_age()
            break
        else:
            print('登陆失败,请重新选择')
            continue
    elif in_num == '0' :
        print('你选择了 退出游戏,game over!')
        break
    else:
        print('你的选择有误请重新选择!')
        continue

博客地址

筱久的学习园地

以上作业程序一定会存在不足和不对的地方,希望看到的大佬在评论区指出,深表感谢。

posted @ 2019-08-08 20:16  foreversun92  阅读(254)  评论(0编辑  收藏  举报