设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 8952|回复: 3
打印 上一主题 下一主题

猜数字游戏,运行中途强制关闭会导致之前数据消失?

[复制链接]

1

主题

0

好友

15

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2020-5-14 04:59:07 |只看该作者 |正序浏览
猜数字游戏写入文件记录玩家数据那里,输入玩家姓名后,假如发现输错名字了,我不想继续进行游戏就直接关闭运行窗口,结果会发现game.txt文件中之前的数据被全部清空了,这是为什么?
代码是在玩家完成游戏后,才以写入方式再次打开txt文件,将更新的数据写入文件,程序运行中途强制退出的话按理说是不会执行后面的写入操作,为什么txt文件中的数据都会被清空呢?
请crossin老师或者其他朋友帮忙解释一下原因,该怎么解决这个问题,十分感谢!
回复

使用道具 举报

1

主题

0

好友

15

积分

新手上路

Rank: 1

地板
发表于 2020-5-14 16:41:32 |只看该作者
本帖最后由 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()
回复

使用道具 举报

1

主题

0

好友

15

积分

新手上路

Rank: 1

板凳
发表于 2020-5-14 16:24:13 |只看该作者
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()
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

沙发
发表于 2020-5-14 12:10:35 |只看该作者
w模式打开文件就会清空内容
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 08:00 , Processed in 0.014620 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部