第一阶段:Python开发基础 day11 课后作业--猜年龄游戏函数版
目录
程序要求:
- 在猜年龄的基础上编写登录、注册方法,并且把猜年龄游戏分函数处理,如
- 登录函数
- 注册函数
- 猜年龄函数
- 选择奖品函数
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
博客地址
以上作业程序一定会存在不足和不对的地方,希望看到的大佬在评论区指出,深表感谢。