Crossin的编程教室
标题:
猜数字游戏,运行中途强制关闭会导致之前数据消失?
[打印本页]
作者:
abeginer
时间:
2020-5-14 04:59
标题:
猜数字游戏,运行中途强制关闭会导致之前数据消失?
猜数字游戏写入文件记录玩家数据那里,输入玩家姓名后,假如发现输错名字了,我不想继续进行游戏就直接关闭运行窗口,结果会发现game.txt文件中之前的数据被全部清空了,这是为什么?
代码是在玩家完成游戏后,才以写入方式再次打开txt文件,将更新的数据写入文件,程序运行中途强制退出的话按理说是不会执行后面的写入操作,为什么txt文件中的数据都会被清空呢?
请crossin老师或者其他朋友帮忙解释一下原因,该怎么解决这个问题,十分感谢!
作者:
crossin先生
时间:
2020-5-14 12:10
w模式打开文件就会清空内容
作者:
abeginer
时间:
2020-5-14 16:24
crossin先生 发表于 2020-5-14 12:10
w模式打开文件就会清空内容
感谢,找到原因了,我在代码最开始加入了下面的代码来创建储存数据的文件,每次开始就先运行了,所以中途退出程序文件就已经清空了
f = open('Game.txt', 'w', encoding='utf-8')
f.close()
修改后加了个判断语句就没有问题了
if not os.path.exists('Game.txt'):
f = open('Game.txt', 'w', encoding='utf-8')
f.close()
作者:
abeginer
时间:
2020-5-14 16:41
本帖最后由 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()
欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/)
Powered by Discuz! X2.5