学python也有一段时间,一些基础知识总是忘记,今天突然来了兴趣,打算用基础知识写一个小小的文字游戏,也算是复习了
这个游戏是前几天在网上看到一个练习题,叫做数字猜猜猜;
规则如下:
1、玩家根据提示进行数字区间起始位置和终止位置的输入
2、依据 1 中输入的数字区间,产生该区间内一个随机数,用于进行猜测比对的终值
3、提示用户输入所猜测的数字,与 2 中产生的随机数字进行比对
4、依据 3 中的比对结果。若两者不等,打印友好提示,重复 3、4 步骤;若两者相等,则退出该函数,执行下列语句
5、当猜测的值不在指定区间内时,不需要统计次数和记录
好,那我们现在开始!
整理下思路:
1、 划分功能模块,日志文件用以进行游戏过程中信息记录,主程序用以进行代码编写
2、 函数的定义要清楚易懂,代码结构要层次分明
第一步:
自定义游戏进入提示函数guide_page(guide_word):
功能描述: 提示玩家进入游戏,并输出信息,:
(1)设置参数guide_word,记录要输出的标题文字信息
(2)运用字符串的格式化函数(format),拼接“*”号和标题文字信息
# 游戏进入提示函数
def guide_page(guide_word):
print('{}{}{}'.format("*" * 50, guide_word, "*" * 50))
第二步:
自定义数字类型判断函数all_num(n):
功能描述:判断指定的值是否为数字,要求:
(1)设置参数n接收用于进行判定的变量的值
(2)运用isdigit( )方法进行判定并返回其判定结果
def all_num(n):
if not n.isdigit():
print("您输入的为非数字字符,请重新启动!")
sys.exit(2)
return True
第三步:
自定义数值合法性判定函数num_legal(ls):
功能描述:判定指定序列中的数值是否相等以及记录数字区间起始位置的值是否大于记录数字区间终止位置的值,要求:
(1)设置列表类型的参数用于接收指定的序列
(2)取出序列中的值并进行比较:
若两者相等,则退出程序,并提示玩家重新启动程序;
若表示数字区间起始位置的值大于数字区间终止位置的值,则退出程序,并提示玩家重新启动程序;
# 数值合法性判定函数
def num_legal(ls):
if int(ls[0]) == int(ls[1]):
print('您输入的数字区间大小相同!!请重新启动程序。')
sys.exit(3)
elif int(ls[0]) > int(ls[1]):
print('您输入的数字区间大小有误!!请重新启动程序。')
sys.exit(3)
else:
return 1
第四步:
自定义产生指定区间随机数函数set_final_num(num1,num2):
功能描述:根据参数值,产生一个位于参数值区间以内的随机数, 要求:
(1)设置两个参数用于接收用户所输入区间的起始值和终止值,并将其保存至列表中
(2)利用内置函数filter()及思路分析2中的all_num(n)过滤以确保输入值全部为数字
(3)依据(2)中过滤后的返回值进行判断,若全部为数字,则调用自定义的等值判断函数,判断输入值是否相等,并根据判断之后的返回值,输出用户产生随机数的区间,并运用random模块,返回产生区间内的随机数;反之则提示玩家所输入的为非数字字符,请重新启动
# 产生指定区间随机数函数
def set_final_num(num1, num2):
lst = [num1, num2]
result = list(filter(all_num, lst))
int_result = []
random_value = None
for s in result:
int_result.append(int(s))
print('所产生的随机数字区间为%s' % int_result)
if num_legal(int_result) == 1:
random_value = random.randint(int_result[0], int_result[1])
return random_value, int_result
第五步:
自定义核查数值是否属于指定区间函数check_num_legal(num):
功能描述:判定所输入的数值是否在指定的区间
# 核查数值是否属于指定区间函数
def check_num_legal(num):
if num[2] in range(num[1][0], num[1][1] + 1):
return True
elif num[2] not in range(num[1][0], num[1][1] + 1):
print("对不起您输入的数字未在指定区间!!!")
return False
第六步:
自定义日志写入函数write_record(times,value):
功能描述:将玩家每一次猜测数字和本次猜测次数两项信息写入日志文件,要求:
(1)设置参数接收玩家猜测的次数(times)和本次猜测的具体数字(value**)**
(2)根据datetime模块获取玩家进行每一次猜测数字输入的时间
(3)使用with语法操作日志文件,将获取到的参数和时间信息以追加方式写入日志文件
# 日志写入函数
def write_record(times, value):
now = datetime.datetime.now()
str_now = now.strftime('%Y-%m-%d %H:%M:%S')
path = os.getcwd()
log_path = os.path.join(path, 'log.txt')
log_message = str_now + " 您第{}次猜测的数字为:{}".format(times, value) + "\n"
with open(log_path, mode='a') as e:
e.write(log_message)
第七步:
自定义main(rand1)函数:
功能描述:依据所产生的随机数字(rand1),提示玩家输入猜测数字并进行比对直到猜测到正确数字, 要求:
(1)设置变量temp接收已产生的随机数字,记录猜测数字的次数(默认为0)
(2)设置无限循环:
1.提示用户输入所猜测数字,并转换为int类型
2.if判断核查数值函数,如果为真,则输出对不起您输入的数字未在指定区间!!!,跳过本次循环
3.实现用户输入一次猜测数字,次数+1
4.调用日志写入函数,传入猜测的次数和用户猜测的数字
5.当猜测的值不在指定区间内时,不需要统计次数和记录
6.使用if语句判断用户猜测的数字,相等,大于,小于的情况,并输出如效果图所示的提示信息
# 启动游戏的判断逻辑
def main(rand1):
total_times = 0 # 设置初始游戏次数
while True:
game_num = input("请继续输入您猜测的数字:")
rand1_list = list(rand1) # 把传进来的rand1转成list格式,以便后面添加
if all_num(game_num): # 判断,如果game_num是由纯数字组成的,就把game_num转为int格式,然后把game_num添加到list里面,以便后面判断区间使用
game_num = int(game_num)
rand1_list.append(game_num)
if not check_num_legal(rand1_list): # 把集合传入到区间判断函数
continue
if check_num_legal(rand1_list):
total_times += 1
write_record(times=total_times, value=rand1_list[2])
if game_num == rand1[0]:
print('恭喜您!只用了%s次就赢得了游戏' % total_times)
break
elif game_num < rand1_list[0]:
print("*" * 20, "\nLower than the answer")
elif game_num > rand1_list[0]:
print("*" * 20, "\nHigher than the answer")
ok,码完了,让我们测试一下
1.区间开始值大于结束值
2.区间开始值与结束值相等
3.开始或者结束值有非数字字符
4.输入的猜测字符,不在设定的区间内
5.重复猜测,直到猜对
6.日志输出
ok,完美运行!
附上完整的代码:
有些地方写的有些过于复杂,希望大佬给出牛逼的建议!
# coding:utf-8
import sys
import random
import datetime
import os
# 游戏进入提示函数
def guide_page(guide_word):
print('{}{}{}'.format("*" * 50, guide_word, "*" * 50))
# 数字类型判断函数
def all_num(n):
if not n.isdigit():
print("您输入的为非数字字符,请重新启动!")
sys.exit(2)
return True
# 数值合法性判定函数
def num_legal(ls):
if int(ls[0]) == int(ls[1]):
print('您输入的数字区间大小相同!!请重新启动程序。')
sys.exit(3)
elif int(ls[0]) > int(ls[1]):
print('您输入的数字区间大小有误!!请重新启动程序。')
sys.exit(3)
else:
return 1
# 产生指定区间随机数函数
def set_final_num(num1, num2):
lst = [num1, num2]
result = list(filter(all_num, lst))
int_result = []
random_value = None
for s in result:
int_result.append(int(s))
print('所产生的随机数字区间为%s' % int_result)
if num_legal(int_result) == 1:
random_value = random.randint(int_result[0], int_result[1])
return random_value, int_result
# 核查数值是否属于指定区间函数
def check_num_legal(num):
if num[2] in range(num[1][0], num[1][1] + 1):
return True
elif num[2] not in range(num[1][0], num[1][1] + 1):
print("对不起您输入的数字未在指定区间!!!")
return False
# 日志写入函数
def write_record(times, value):
now = datetime.datetime.now()
str_now = now.strftime('%Y-%m-%d %H:%M:%S')
path = os.getcwd()
log_path = os.path.join(path, 'log.txt')
log_message = str_now + " 您第{}次猜测的数字为:{}".format(times, value) + "\n"
with open(log_path, mode='a') as e:
e.write(log_message)
# 启动游戏的判断逻辑
def main(rand1):
total_times = 0 # 设置初始游戏次数
while True:
game_num = input("请继续输入您猜测的数字:")
rand1_list = list(rand1) # 把传进来的rand1转成list格式,以便后面添加
if all_num(game_num): # 判断,如果game_num是由纯数字组成的,就把game_num转为int格式,然后把game_num添加到list里面,以便后面判断区间使用
game_num = int(game_num)
rand1_list.append(game_num)
if not check_num_legal(rand1_list): # 把集合传入到区间判断函数
continue
if check_num_legal(rand1_list):
total_times += 1
write_record(times=total_times, value=rand1_list[2])
if game_num == rand1[0]:
print('恭喜您!只用了%s次就赢得了游戏' % total_times)
break
elif game_num < rand1_list[0]:
print("*" * 20, "\nLower than the answer")
elif game_num > rand1_list[0]:
print("*" * 20, "\nHigher than the answer")
if __name__ == '__main__':
guide_page("欢迎进入数字猜猜猜小游戏")
i = input("请输入数字区间起始值:")
j = input("请输入数字区间终止值:")
a = set_final_num(i, j) # 因为set_final_num函数return了两个值,所以此时的a是一个元组格式
main(rand1=a)