⽤python写⼀个⼩⼩的⽂字游戏学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("您输⼊的为⾮数字字符,请重新启动!")
return True
第三步:
⾃定义数值合法性判定函数num_legal(ls):
功能描述:判定指定序列中的数值是否相等以及记录数字区间起始位置的值是否⼤于记录数字区间终⽌位置的值,要求:(1)设置列表类型的参数⽤于接收指定的序列
(2)取出序列中的值并进⾏⽐较:
若两者相等,则退出程序,并提⽰玩家重新启动程序;
若表⽰数字区间起始位置的值⼤于数字区间终⽌位置的值,则退出程序,并提⽰玩家重新启动程序;
# 数值合法性判定函数
def num_legal(ls):
if int(ls[0]) == int(ls[1]):
print('您输⼊的数字区间⼤⼩相同!!请重新启动程序。')
elif int(ls[0]) > int(ls[1]):
print('您输⼊的数字区间⼤⼩有误!!请重新启动程序。')
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 = w()
str_now = now.strftime('%Y-%m-%d %H:%M:%S')
path = os.getcwd()
log_path = os.path.join(path, '')
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("请继续输⼊您猜测的数字:")
python可以做什么游戏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("您输⼊的为⾮数字字符,请重新启动!")
return True
# 数值合法性判定函数
def num_legal(ls):
if int(ls[0]) == int(ls[1]):
print('您输⼊的数字区间⼤⼩相同!!请重新启动程序。')
elif int(ls[0]) > int(ls[1]):
print('您输⼊的数字区间⼤⼩有误!!请重新启动程序。')
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 = w()
str_now = now.strftime('%Y-%m-%d %H:%M:%S')
path = os.getcwd()
log_path = os.path.join(path, '')
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)