设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 69882|回复: 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分钟,轻松学编程
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

89#
发表于 2018-11-9 22:44:47 |只看该作者
吃土小华 发表于 2018-11-9 15:17
之前的问题已经解决了,可能是因为文本后面空白行的原因。
新的问题是这个
from random import randint

scores[name] = [game_times,mins,total]
这里是列表不是字典
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

88#
发表于 2018-11-9 15:17:34 |只看该作者
本帖最后由 吃土小华 于 2018-11-9 15:18 编辑
吃土小华 发表于 2018-11-8 21:00
from random import randint

f = open('game.txt')

之前的问题已经解决了,可能是因为文本后面空白行的原因。
新的问题是这个
from random import randint

f = open('game.txt')
lines = f.readlines()
f.close()


scores = {}
for l in lines:
   s = l.split()

   scores[s[0]] = s[1:]

   
name  = input('请输入你的名字:')
score = scores.get(name)
if score is None:
    score = [0,0,0]

game_time = int(score[0])
min_time = int(score[1])
total_time = int(score[2])
if game_time>0:
    avg_times = float(total_time)/game_time
else:
    avg_times = 0

print('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案。'%(name,game_time,min_time,avg_times))

num = randint(1,100)
time=0
bingo= False
print('Guess what I think.')
while bingo==False:
    answer=int(input())
    time+=1
    if answer<num:
        print('too small')
    if answer>num:
        print('too big')
    if answer==num:
        print('bingo')
        bingo=True

total_time +=time
if game_time==0 or time<min_time:
    min_time=time
game_time+=1
print(game_time,min_time,total_time)
game_times=str(game_time)
mins=str(min_time)
total=str(total_time)
scores[name] = {game_times,mins,total}
print(scores[name])
result=''
for n in scores:
    line = n +' '+' '.join(scores[n])+'\n'#line为字符串
    result += line


#f=open('game.txt','w')
#f.write(result)
#f.close()
这样写完后显示
请输入你的名字:小华
小华,你已经玩了0次,最少0轮猜出答案,平均0.00轮猜出答案。
Guess what I think.
50
too big
60
too big
25
too small
35
too small
40
too small
45
too small
48
too small
49
bingo
1 8 8
{'1', '8'}
>>>
其中小华的所有数值无法写入到字典里,只能显示两个值,文本文档中的内容和公众号一致,非常疑惑这是为什么,求大神解答,非常感谢。
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

87#
发表于 2018-11-8 21:00:24 |只看该作者
from random import randint

f = open('game.txt')
lines = f.readlines()
f.close()


scores = {}
for i in lines:
    a = i.split()
    scores[a[0]] = a[1:]
   
name  = input('请输入你的名字:')
运行后报错
Traceback (most recent call last):
  File "C:\Users\xiao hua\AppData\Local\Programs\Python\Python37\测试2.py", line 11, in <module>
    scores[a[0]] = a[1:]
IndexError: list index out of range
求解这个是什么问题,非常感谢!
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

86#
发表于 2018-10-29 16:12:24 |只看该作者
橙了个棒棒糖 发表于 2018-10-28 23:36
scores[s[0]] = s[1:],  这句里面的 我不太懂啊  每一项是什么意思  你现在明白吗   谢谢啦~ ...

你把代码,分来看每一个都输出来看

print(s)
print(s[0])
print(s[1:])
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

85#
发表于 2018-10-29 16:10:50 |只看该作者
你可以自己另用个文件写下:
  1. scores = {
  2. 'aaa': 123,
  3. 'bbb': 456,
  4. 'ccc': 789
  5. }
  6. for n in scores:
  7.     print(n)
  8.     print(scores[n])
复制代码
看看分别是什么

字典相关课程里的内容
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

19

积分

新手上路

Rank: 1

84#
发表于 2018-10-28 23:43:00 |只看该作者

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

本帖最后由 橙了个棒棒糖 于 2018-10-29 00:01 编辑
  1. scores = {}

  2. for l in lines:

  3.    s = l.split()

  4.    scores[s[0]] = s[1:]
复制代码
这里scores 是一个字典对吧,那么scores [s[0]] 是不是这个字典里的第一个key,也就是key1  后面的 s[1:]  是不是给key1赋值?也就是value1? 那么 这时是不是 文本里就是        key(暂定不知):s[1:]的值    假定一些值举例的话就是     ‘’:10 45 90      
还有就是这课里面 打开的文本  应该是默认里面有按   名字+数值    这种方式已记录过一些的吧  不然score.get(name)  应该是不能用的吧
QQ图片20181028235836.png

还有就是前面这个赋值的意义我不太懂 前面 应该是没有key 的一次赋值 ,但是后面创建了一个 带有key 的赋值,那要前面那个意义在哪。
  1. result = ''

  2. for n in scores:

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

  4.    result += line
复制代码
还有前面的n 和后面的scores[n]  我有点傻傻分不清
哪位老大哥能举个例子 跟我说说了   不胜感激!!!!
回复

使用道具 举报

1

主题

0

好友

19

积分

新手上路

Rank: 1

83#
发表于 2018-10-28 23:36:30 |只看该作者
Envy 发表于 2015-3-25 16:30
你好,那个scores和score这块不太明白是什么意思,就是readlines得到的应该是一个list吧,如果最开始game ...

scores[s[0]] = s[1:],  这句里面的 我不太懂啊  每一项是什么意思  你现在明白吗   谢谢啦~
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

82#
发表于 2018-6-5 23:38:47 |只看该作者
score[n] 这里应该是 scores 吧,仔细再对一下
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

26

积分

新手上路

Rank: 1

81#
发表于 2018-6-5 22:16:18 |只看该作者
python 3.5 帮忙指导下,报错:
Traceback (most recent call last):
  File "E:\workspace\learn\src\less01\game_tst1.py", line 63, in <module>
    line=n+''+''.join(score[n])+'\n'
TypeError: list indices must be integers or slices, not str
  1. #coding=utf-8


  2. from random import randint
  3. from pip._vendor.distlib.compat import raw_input

  4. name=raw_input("请输入你的名字")

  5. f=open(r'e:\test\game.txt','r')
  6. lines=f.readlines()
  7. scores={}
  8. for l in lines:
  9.     s=l.split()
  10.     scores[s[0]]=s[1:]
  11. score=scores.get(name)   
  12. if score is None:
  13.     score=[0, 0, 0,]

  14. game_times=int(score[0])
  15. min_times=int(score[1])
  16. total_times=int(score[2])

  17. if game_times > 0:
  18.     avg_times= float(total_times)/game_times
  19. else:
  20.     avg_times=0

  21. print("%s,你已经完料%d次,最少%d轮猜出答案,平均%.2f轮拆除答案"%(name,game_times,min_times,avg_times))

  22. times=0

  23. num=randint(1,100)
  24. print("Guess what i think?")
  25. bingo=False
  26. while bingo==False:
  27.     times=times+1
  28.     answer=int(input())
  29.     if answer<num:
  30.         print(("too small"))
  31.     if answer>num:
  32.         print("too big")
  33.     if answer==num:
  34.         print("you are clevr!")
  35.         bingo=True

  36. if  game_times==0 or times<min_times:
  37.     min_times=times
  38. total_times=total_times+times
  39. game_times=game_times+1

  40. scores[name]=[str(game_times),str(min_times),str(total_times)]
  41. result=''

  42. for n in scores:
  43.     line=n+''+''.join(score[n])+'\n'

  44. f=open(r'e:\test\game.txt','w')
  45. f.write(result)
  46. f.close()
复制代码
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

80#
发表于 2018-4-1 23:51:17 |只看该作者
scores = {}
是个字典,不是列表
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-11-22 14:21 , Processed in 0.018894 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部