设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
楼主: mty1111
打印 上一主题 下一主题

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

[复制链接]

0

主题

0

好友

60

积分

注册会员

Rank: 2

51#
发表于 2017-11-3 17:15:46 |只看该作者
  1. from random import randint
  2. name = input('请输入你的名字:')
  3. f = open('game.txt')
  4. lines = f.readlines()
  5. f.close()

  6. scores = {}  # 初始化字典
  7. for l in lines :
  8.     s = l.split() # 把每一行的数据拆分成list
  9.     scores[s[0]] = s[1:] # 第一项作为key,剩下的作为value
  10. score = scores.get(name) # 查找当前玩家数据
  11. if score is None:
  12.     score = [0,0,0] # 如果查不到score,就初始化score


  13. # 游戏主代码
  14. game_times = int(score[0])
  15. min_times = int(score[1])
  16. total_times = int(score[2])
  17. if game_times > 0:
  18.     avq_times = float(total_times) / game_times
  19. else:
  20.     avq_times = 0
  21. print('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案'%(
  22.     name,game_times,min_times,avq_times))  # 加了个名字name,在括号处换行.

  23. num = randint(1,10)
  24. times = 0 # 记录本次游戏轮数
  25. print('猜猜我想啥?')
  26. bingo = False
  27. while bingo == False:
  28.     times += 1   #轮数+1
  29.     answer = int(input())
  30.     if answer > num:
  31.         print('太大了')
  32.     if answer < num:
  33.         print('太小了')
  34.     if answer == num:
  35.         print('bingo')
  36.         bingo = True
  37.     if answer < 0:
  38.         print('Exit game...')
  39.         break

  40. # 如果是第一次玩,或者轮数比最小轮数少,则更新最小轮数。
  41. if game_times ==0 or times < min_times:
  42.     min_times = times
  43. total_times += times # 总游戏轮数增加
  44. game_times += 1

  45. # 把成绩更新到对应玩家当中
  46. # 加上str转化为字符串,为后面的格式做准备
  47. scores[name] = [str(game_times),str(min_times),str(total_times)]
  48. result = '' # 初始化一个空字符串用来存储
  49. for n in scores: # 把成绩按照'name,game_times,min_times,total_times',结尾要加上\n换行
  50.     line = n +' '+' '.join(scores[n])+'\n'
  51.     result += line

  52. f = open('game.txt','w')
  53. f.write(result)
  54. f.close()

复制代码
回复

使用道具 举报

0

主题

0

好友

60

积分

注册会员

Rank: 2

52#
发表于 2017-11-3 17:16:46 |只看该作者
C老师,为啥第一行的0 0 0 不会被替换掉啊,之后生成新的

王朝_20171103171303.jpg (29.22 KB, 下载次数: 413)

王朝_20171103171303.jpg

回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

53#
发表于 2017-11-4 15:28:22 |只看该作者
lubvi 发表于 2017-11-3 17:16
C老师,为啥第一行的0 0 0 不会被替换掉啊,之后生成新的

你把中间产生的变量都输出出来自己看一下就明白了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

8

积分

新手上路

Rank: 1

54#
发表于 2017-11-20 08:52:54 |只看该作者

请教老师,这是哪里出问题了

name=input('请输入你的名字:')
f1=open('d:\py\game.txt')
lines=f1.readlines()   #读取文件。与之前不同,我们用readlines把每组成绩分开来
f1.close()

scores={}              #再用一个字典来记录所有的成绩
for i in lines:
    s=i.split()
    scores[s[0]]=s[1:] #每一项的key是玩家的名字,value是一个由剩下的数据组成的数组。把成绩赋值给键
score=scores.get(name) #查找当前玩家数据
if score is None: #没有找到该玩家数据,说明是新玩家,给他初始化一组成绩:
    socre=[0,0,0]

from random import randint #用random模块中的randint这个方法产生随机数
game_times=int(score[0])  #玩游戏次数
min_times=int(score[1])   #最快猜出的轮数
total_times=int(score[2]) #猜过的总轮数
if game_times>0:         #分母不能为0,所以加了个判断
    avg_times=float(total_times)/game_times  #平均数可能是小数,所以在之前加个float
else:
    avg_times=0
print('%s,你已经玩了%d次,最少%d轮猜出答案,平均%.2f轮猜出答案' %(
    name,game_times,min_times,avg_times))

num=randint(1,100)
times=0            #记录本次游戏轮数
print('gusee what i think?')
bingo=False  #先让循环动起来!
while bingo==False:
    times+=1       #每进行一次就记录一次轮数
    answer=int(input())
    if answer<num:
        print('%.2f is too small!' %answer)
    if answer>num:
        print('%.2f is too big!'%answer)
    if answer<0:
        print('exit game')
        break             #输入负数提前结束游戏
    if answer==num:
        print('bingo,%.2f is the right answer!'%answer)
        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)] #把成绩更新到scores中,如果没有这一项,会自动生成新条目
result=''    #初始化一个空字符串
for n in scores:
    line=n+''+' '.join(scores[n])+'\n' #把成绩按照“game_times,min_times,total_times”格式化
    result+=line  #添加到result中

f1=open('d:\py\game.txt','w')
f1.write(result)    #把结果输入到文件中
f1.close()
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

55#
发表于 2017-11-20 10:06:12 |只看该作者
bobo0769 发表于 2017-11-20 08:52
name=input('请输入你的名字:')
f1=open('d:\py\game.txt')
lines=f1.readlines()   #读取文件。与之前不 ...

请提供输出或报错,你不能光把代码放上来让别人来调试
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

4

主题

0

好友

98

积分

注册会员

Rank: 2

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

明白了,这个按行读取会分别按行保存,然后循环从第二个数据读取,原来如此,谢谢啦
回复

使用道具 举报

4

主题

0

好友

34

积分

新手上路

Rank: 1

57#
发表于 2017-12-14 16:54:49 |只看该作者
你好,想请教一个问题,代码如下:
from random import randint

name = raw_input('Plz print your Name:')
f = open('F:\py\game.txt')
lines = f.readlines()
f.close()

scores = ()
for l in lines:
    s = l.split()
    scores[s[0]] = s[1:]
score = scores.get(name)
if score is None:
    score = [0,0,0]

game_times = int(score[0])
min_times = int(score[1])
total_times = int(score[2])
if game_times > 0:
    avg_times = float(total_times) / game_times
else:
    avg_times = 0
print '%s, you have played %d times, the best takes %d times, avg takes %2f. times'%(name,game_times,min_times,avgtimes)

num = randint(1,100)
times = 0
print 'Guess what number i think?!'
bingo == False
while bingo==False:
    answer = input()
    if answer > num:
        print 'too small!'
    if answer < num:
        print 'too big!!'
    if answer == num:
        print 'BINGO!'
        bingo = True

if game_times == 0 or times < min_times:
    min_times = times
total_names += times
game_times += 1

socres[name]=[str(game_times),str(min_times),str(total_times)]
result = ''
for n in scores:
    line = n + ' ' + ' '.join(scores[n]) + '\n'
    result += line
    f = open('F:\py\game.txt','w')
    f.write(result)
    f.close()
结果总是报错:
File "C:\Users\asus\Desktop\L39-41 Game record by TXT 20171214.py", line 14, in <module>
    score = scores.get(name)
AttributeError: 'tuple' object has no attribute 'get'
回复

使用道具 举报

0

主题

0

好友

34

积分

新手上路

Rank: 1

58#
发表于 2017-12-21 22:50:47 |只看该作者
   line=n+' '+' '.join(scores[n])+'\n'
这个不是特别理解,n是指的名字,我不太理解为什么是两个空格,是因为n是名字,名字与数字间的空格需要加一个空格强调一下,后面的都是数字了就可以只有一个空格吗?
编程新人,求大神解答
  
回复

使用道具 举报

2

主题

0

好友

60

积分

注册会员

Rank: 2

59#
发表于 2018-2-9 15:34:50 |只看该作者
老师能解释一下这句吗
for n in scores:
     line=n+' '+' '.join(scores[n])+'\n'
     result+=line
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

60#
发表于 2018-2-9 16:23:49 |只看该作者
wwyy4ever 发表于 2018-2-9 15:34
老师能解释一下这句吗
for n in scores:
     line=n+' '+' '.join(scores[n])+'\n'

这个就是拼字符串,你把它分开来一步步写会比较清楚,我这里合在一行里了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

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

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

GMT+8, 2024-11-22 08:06 , Processed in 0.016439 second(s), 22 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部