- 帖子
- 3
- 精华
- 0
- 积分
- 15
- 阅读权限
- 10
- 注册时间
- 2020-5-14
- 最后登录
- 2020-5-18
|
本帖最后由 abeginer 于 2020-5-14 16:44 编辑
代码贴出来,小改了一点进行完善,并加上了部分注释帮助理解,供后面同学参考
from random import randint
import os
# 游戏开始之前,如果未创建数据文件时,新创建一个
# 必须先判断文件是否存在,否则直接以写入打开文件,会导致文件内容清空
if not os.path.exists('Game.txt'):
f = open('Game.txt', 'w', encoding='utf-8')
f.close()
# 输入玩家姓名
name = input('请输入你的名字:')
# 打开数据文件,
f = open('Game.txt', 'r', encoding='utf-8')
f.readline() # 跳过标题行
lines = f.readlines() # 读取玩家成绩数据
f.close()
# 初始化空字典,用字典储存文件中的数据
scores = {}
for l in lines:
s = l.split()
scores[s[0]] = s[1:] # 键s[0](玩家姓名)对应值s[1:] (玩家游戏数据)
# 在字典中找到当前玩家的游戏数据
score = scores.get(name) # 如果玩家不存在,scores[name]会报错,用scores.get(name) 可以返回空值None
# 如果没找到,初始化该玩家成绩为0
if score is None:
score = [0, 0, 0]
game_times = int(score[0])
min_times = int(score[1])
total_times = int(score[2])
# 如果游戏次数大于0,平均猜中次数为总次数除游戏次数,否则为0
if game_times > 0:
avg_times = total_times / game_times
else:
avg_times = 0
# 打印玩家的历史游戏数据
print ('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案' % (name, game_times, min_times, avg_times))
# 开始本次猜数游戏
num = randint(1, 100)
times = 0 # 记录本次游戏轮数
print('猜猜我想的是什么数字(1~100)?')
bingo = False
while bingo ==False:
times += 1 # 每猜一次轮数+1
answer = eval(input())
if answer<num:
print ('你猜的数字太小了!')
if answer>num:
print ('你猜的数字太大了!')
if answer==num: # 注意使用两个等号==判断是否相等,一个等号=是赋值
print ('恭喜你猜中了!')
bingo = True
# 更新本次游戏数据
if game_times == 0 or times < min_times:
min_times = times
total_times +=times
game_times +=1
# 将更新数据增加到对应玩家原游戏数据中
scores[name] = [str(game_times), str(min_times), str(total_times)] # 玩家原数据存在则更新,不存在则新添加入字典
title = ['玩家姓名', '游戏次数', '最好成绩', '全部成绩'] # 标题行
titleline = '\t'.join(title) + '\n' # 格式化标题行
result = titleline # 初始化字符串,用来储存游戏数据,此处先加入标题行
for n in scores: # 遍历字典是对字典中的每一个键(此处是玩家姓名)进行遍历
line = n + '\t' + '\t'.join(scores[n]) + '\n' # 格式化玩家数据,n为键(玩家姓名),scores[n]为值(玩家游戏数据列表)
result += line # 将每行游戏数据(一个玩家的姓名和游戏成绩)添加到result中
# 将游戏数据写入文件中
f = open('Game.txt', 'w', encoding='utf-8')
f.write(result)
f.close() |
|