请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 50770|回复: 89

【Python 第41课】 用文件保存游戏(3)

[复制链接]

10

主题

0

好友

52

积分

注册会员

Rank: 2

发表于 2013-7-25 17:12:14 |显示全部楼层
你的小游戏现在已经可以保存成绩了,但只有一组成绩,不管谁来玩,都会算在里面。所以今天我还要加上一个更多的功能:存储多组成绩。玩家需要做的就是,在游戏开始前,输入自己的名字。而我会根据这个名字记录他的成绩。这个功能所用到的内容我们几乎都说过,现在要把它们结合起来。


首先要输入名字,这是我们用来区分玩家成绩的依据:
  1. name = raw_input('请输入你的名字:')
复制代码
接下来,我们读取文件。与之前不同,我们用readlines把每组成绩分开来:
  1. lines = f.readlines()
复制代码
再用一个字典来记录所有的成绩:
  1. scores = {}

  2. for l in lines:

  3.    s = l.split()

  4.    scores[s[0]] = s[1:]
复制代码
这个字典中,每一项的key是玩家的名字,value是一个由剩下的数据组成的数组。这里每一个value就相当于我们之前的成绩数据。


我们要找到当前玩家的数据:
  1. score = scores.get(name)
复制代码
字典类的get方法是按照给定key寻找对应项,如果不存在这样的key,就返回空值None。


所以如果没有找到该玩家的数据,说明他是一个新玩家,我们给他初始化一组成绩:
  1. if score is None:

  2.    score = [0, 0, 0]
复制代码
这是我们拿到的score,已经和上一课中的score一样了,因此剩下的很多代码都不用改动。


当游戏结束,记录成绩的时候,和之前的方法不一样。我们不能直接把这次成绩存到文件里,那样就会覆盖掉别人的成绩。必须先把成绩更新到scores字典中,再统一写回文件中。


把成绩更新到scores中,如果没有这一项,会自动生成新条目:
  1. scores[name] = [str(game_times), str(min_times), str(total_times)]
复制代码
对于每一项成绩,我们要将其格式化:
  1. result = ''

  2. for n in scores:

  3.    line = n + ' ' + ' '.join(scores[n]) + '\n'

  4.    result += line
复制代码
把scores中的每一项按照“名字 游戏次数 最低轮数 总轮数\n”的格式拼成字符串,再全部放到result里,就得到了我们要保存的结果。


最后就和之前一样,把result保存到文件中。

0.jpg

1.jpg


如果你充分理解了这个程序,恭喜你,你对文件处理已经有了一个基本的了解。在日常工作学习中,如果需要处理一些大量重复机械的文件操作,比如整理格式、更改文件中的部分文字、统计数据等等,都可以试着用python来解决。


#==== Crossin的编程教室 ====#

微信ID:crossincode

QQ群:312723402


面向零基础初学者的编程课

每天5分钟,轻松学编程
回复

使用道具 举报

0

主题

0

好友

10

积分

新手上路

Rank: 1

发表于 2013-8-8 15:16:48 |显示全部楼层
自己调试时出的问题:
1、问题1:join前面那个单引号里少打了一个空格,导致下次运行时split拆不开。
for n in scores:
    line = n + ' ' + ' '.join(scores[n]) + '\n'
2、正常运行后,私自打开记录分数的文件是空白。
3、还有好像文件最初不能是空白的?必须有几个值。
回复

使用道具 举报

1

主题

1

好友

40

积分

新手上路

Rank: 1

发表于 2013-9-1 15:51:17 |显示全部楼层
结果保存在txt的时候,是按什么顺序来的呢?我发现有时候新建的玩家数据在最上面,有时候又在中间行@crossin先生
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-9-1 22:50:22 |显示全部楼层
林夕_信仰 发表于 2013-9-1 15:51
结果保存在txt的时候,是按什么顺序来的呢?我发现有时候新建的玩家数据在最上面,有时候又在中间行@crossi ...

字典是无序,所以你不能依赖它来排序
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

1

好友

40

积分

新手上路

Rank: 1

发表于 2013-9-3 17:25:03 |显示全部楼层
crossin先生 发表于 2013-9-1 22:50
字典是无序,所以你不能依赖它来排序

soga!
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2013-9-17 01:07:23 |显示全部楼层
今天发现一个Mac下IDLE的问题,折腾了很久才大约搞清楚了。
mac下的IDLE里raw_input读进来的字符串是unicode字符串,和我们平常的用的str是不一样的
如果print出包含它们的list就会发现,是u'abc'和'abc'的区别

unicode和str相加会出问题,也不能作为参数被writelines调用。而文件读出来的内容是str,还会导致输入相同的字符却无法匹配

所以如果mac下遇见奇怪的编码问题,类似
UnicodeDecodeError: 'ascii' codec can't decode byte 0xba in position 0: ordinal not in range(128)

试试把一开始的输入改为
name = raw_input('请输入你的名字:').encode('utf-8')

在windows下没这个问题,因为输入被默认编码了。Terminal好像也没问题
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

发表于 2015-3-24 23:41:49 |显示全部楼层
报错了。。。
Traceback (most recent call last):
  File "C:\Users\Desktop\4.py", line 14, in <module>
    if score in None:
TypeError: argument of type 'NoneType' is not iterable
貌似是格式有问题。。不知道有没有知道的,都是按照上面的代码敲得
回复

使用道具 举报

174

主题

45

好友

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

发表于 2015-3-25 10:35:08 |显示全部楼层
Envy 发表于 2015-3-24 23:41
报错了。。。
Traceback (most recent call last):
  File "C:\Users\Desktop\4.py", line 14, in

不是 in,是 is 吧?
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

发表于 2015-3-25 14:41:46 |显示全部楼层
crossin先生 发表于 2015-3-25 10:35
不是 in,是 is 吧?

感谢。。。。一到长代码就老是遇到拼写问题。。。。自己对着看了几遍也看不出来。。。。
回复

使用道具 举报

0

主题

0

好友

14

积分

新手上路

Rank: 1

发表于 2015-3-25 16:30:33 |显示全部楼层
crossin先生 发表于 2015-3-25 10:35
不是 in,是 is 吧?

你好,那个scores和score这块不太明白是什么意思,就是readlines得到的应该是一个list吧,如果最开始game.txt里面是0 0 0的话,得到的就是{0,0,0},那么用split将他分开是得到了三个list吗?,并且他还在for循环里面,应该是对lines里的三个0依次进行处理吗?这块弄得不是很明白。。。。尤其是哪句scores[s[0]] = s[1:],和score = scores.get(name)
回复

使用道具 举报

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

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

GMT+8, 2024-3-29 16:34 , Processed in 0.026515 second(s), 25 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部