Crossin的编程教室

标题: 【Python 第40课】 用文件保存游戏(2) [打印本页]

作者: mty1111    时间: 2013-7-25 17:14
标题: 【Python 第40课】 用文件保存游戏(2)
话接上回。我们已经能从文件中读取游戏成绩数据了,接下来就要考虑,怎么把我们每次游戏的结果保存进去。

首先,我们需要有一个变量来记录每次游戏所用的轮数:
  1. times = 0
复制代码
然后在游戏每进行一轮的时候,累加这个变量:
  1. times += 1
复制代码
当游戏结束后,我们要把这个变量的值,也就是本次游戏的数据,添加到我们的记录中。

如果是第一次玩,或者本次的轮数比最小轮数还少,就记录本次成绩为最小轮数:
  1. if game_times == 0 or times < min_times:
  2.    min_times = times
复制代码
把本次轮数加到游戏总轮数里:
  1. total_times += times
复制代码
把游戏次数加1:
  1. game_times += 1
复制代码
现在有了我们需要的数据,把它们拼成我们需要存储的格式:
  1. result = '%d %d %d' % (game_times, min_times, total_times)
复制代码
写入到文件中:
  1. f = open('e:\py\game.txt', 'w')
  2. f.write(result)
  3. f.close()
复制代码
0.jpg

按照类似的方法,你也可以记录一些其他的数据,比如设定一种记分规则作为游戏得分。虽然在这个小游戏里,记录成绩并没有太大的乐趣,但通过文件来记录数据的方法,以后会在很多程序中派上用场。

#==== Crossin的编程教室 ====#
微信ID:crossincode
QQ群:312723402

面向零基础初学者的编程课
每天5分钟,轻松学编程


作者: 文心雕龙    时间: 2014-5-5 22:08
请问你运行时输出‘Bingo’后怎么继续循环进入下一次的游戏的呢?我的总是要关闭后在运行才能进入下一次游戏
作者: crossin先生    时间: 2014-5-6 11:13
文心雕龙 发表于 2014-5-5 22:08
请问你运行时输出‘Bingo’后怎么继续循环进入下一次的游戏的呢?我的总是要关闭后在运行才能进入下一次游 ...

外面再套一层 while 循环
作者: 文心雕龙    时间: 2014-5-6 12:39
crossin先生 发表于 2014-5-6 11:13
外面再套一层 while 循环

当然有while循环,但是还是不能实现 输出这个(================ RESTART =================)后多次游戏
作者: crossin先生    时间: 2014-5-6 19:16
文心雕龙 发表于 2014-5-6 12:39
当然有while循环,但是还是不能实现 输出这个(================ RESTART =================)后多次游戏 ...

那要靠你自己输出了
在整个程序外面套一层大循环(当然不是直接写个while就完了,可能还要做一些小调整)
作者: 文心雕龙    时间: 2014-5-6 21:50
crossin先生 发表于 2014-5-6 19:16
那要靠你自己输出了
在整个程序外面套一层大循环(当然不是直接写个while就完了,可能还要做一些小调整) ...

谢谢,已经解决了,原来可以直接Run就行。。。。。
作者: sun_yuanzy    时间: 2014-10-14 18:35
本帖最后由 sun_yuanzy 于 2014-10-14 18:41 编辑

zan
作者: lovia    时间: 2015-5-28 12:05
  1. #coding:utf-8
  2. from random import randint

  3. #load file
  4. f=open('game.txt')
  5. score=f.read().split()

  6. game_times = int(score[0])
  7. min_times = int(score[1])
  8. total_times = int(score[2])

  9. #judge
  10. if game_times>0:
  11.     avg_times = float(total_times)/game_times
  12. else:
  13.     avg_times = 0
  14. #output result
  15. print "你已经玩了%d次,最少%d轮猜出了答案,平均%.2f轮猜出了答案"%(game_times,min_times,avg_times)

  16. num=randint(1,100)
  17. times = 0
  18. print "Guess what i think?"
  19. bingo = False
  20. while bingo == False:
  21.     times+=1
  22.     answer = input()
  23.     if answer < num:
  24.         print "太小了!"
  25.     if answer > num:
  26.         print "太大了!"
  27.     if answer == num:
  28.         print "BINGO!"
  29.         bingo = True
  30. if game_times ==0 or times <= min_times:
  31.     min_times = times
  32. total_times +=times
  33. game_times +=1
  34. result = '%d %d %d'%(game_times,min_times,total_times)
  35. f = open('game.txt','w')
  36. f.write(result)
  37. f.close()
复制代码

作者: 草办    时间: 2015-12-8 14:19
get
作者: l0ve1o24    时间: 2016-12-14 14:53
  1. #-*-coding:utf-8-*-
  2. a = 1
  3. while a == 1:
  4.     from random import randint
  5.     f = open('jifen.txt')
  6.     score = f.read().split()
  7.     game_times = int(score[0])#总游戏数
  8.     min_times = int(score[1])#最少轮数
  9.     total_times = int(score[2])#总轮数
  10.     if game_times > 0:
  11.         avg_times = float(total_times)/game_times
  12.     else:
  13.         avg_times = 0
  14.     print ' 你已经玩%d了次,最少%d轮猜出答案,平均%.2f轮猜出答案 '%(game_times,min_times,avg_times)

  15.     num = randint(1 , 100)
  16.     times = 0
  17.     print ' 请猜一个100以内的数字'
  18.     bingo = False
  19.     while bingo == False:
  20.         times += 1
  21.         answer = input()
  22.         if answer < num:
  23.             print 'too small'
  24.         if answer > num:
  25.             print 'too big'
  26.         if answer == num:
  27.             print 'bingo'
  28.             bingo = True
  29.    
  30.     if game_times == 0 or times < min_times:
  31.         min_times = times
  32.     total_times += times
  33.    
  34.     game_times += 1

  35.     jilu = '%d %d %d'%(game_times,min_times,total_times)
  36.     f = open('jifen.txt', 'w')
  37.     f.write(jilu)
  38.     f.close()
复制代码

作者: linake    时间: 2016-12-15 15:30
  1. #coding=UTF8
  2. from random import randint
  3. # 读取记录
  4. f=open('f:\pycharm\learn\guessNum\saveData.txt')
  5. score=f.read().split()
  6. f.close()
  7. game_times=int(score[0])
  8. min_times=int(score[1])
  9. total_times=int(score[2])
  10. # 计算平均轮次
  11. if game_times>0:
  12.     avg_times=float(total_times)/game_times
  13. else:
  14.     avg_times = 0
  15. # 显示记录
  16. print'Welcome'
  17. print'You played %d times. Min:%d. Avg:%.2f'%(
  18.     game_times,min_times,avg_times)
  19. print'Do you want to start game?'
  20. yORn=raw_input('(y/n):')
  21. # 主程序
  22. while yORn=='y':
  23.     num = randint(1, 100)
  24.     print'Guess number 1~100'
  25.     times = 0   # 当前回合轮次
  26.     bingo = False
  27.     while bingo == False:
  28.         answer = input()
  29.         if answer < num:
  30.             print'too small'
  31.         if answer > num:
  32.             print'too big'
  33.         if answer == num:
  34.             print'bingo'
  35.             bingo = True
  36.         times+=1
  37.     # 判定是否破纪录
  38.     if game_times==0 or times<min_times:
  39.         min_times=times
  40.         print'Broke record. Only %d times'%(times)
  41.     total_times+=times
  42.     game_times+=1
  43.     avg_times = float(total_times) / game_times
  44.     print'You played %d times. Min:%d. Avg:%.2f'%(
  45.         game_times,min_times,avg_times)
  46.     print'Do you want to play again?'
  47.     yORn=raw_input('(y/n:)')
  48.     # 保存记录
  49.     result='%d %d %d'%(game_times,min_times,total_times)
  50.     f=open('f:\pycharm\learn\guessNum\saveData.txt','w')
  51.     f.write(result)
  52.     f.close()
复制代码

作者: jinss    时间: 2017-6-22 17:24
标题: 老师,程序可以运行,但是无法写入成绩,肿么回事啊@Crossin
本帖最后由 jinss 于 2017-6-23 15:19 编辑

f=file("E:\python\pycharm\python\game.txt")
score=f.read().split()
f.close()
game_times=int(score[0])
min_times=int(score[1])
total_times=int(score[2])
if game_times>0:
    ave_times=float(total_times)/game_times
else:
    ave_times=0
print'you have played %d round, at least is %d try  ,avg is %.2f'%(game_times,min_times,ave_times)
from random import randint
times=0
print'guess what I think?'
num=randint(0,100)
bingo=False
while bingo==False:
    times+=1
    num1 = input()
    if num1>num:
        print'too big'
    if num1<num:
        print"too small"
    if num1==num:
        print'bingo'
        bingo=True
if game_times==0 or times<min_times:
    min_times=times
total_times+=times
game_times=game_times+1
result='%d,%d,%.2f'%(game_times,min_times,total_times)
f=file('E:\python\pycharm\python\game.txt','w')
f.write(result)
f.close()
作者: crossin先生    时间: 2017-6-23 21:41
jinss 发表于 2017-6-22 17:24
f=file("E:\python\pycharm\python\game.txt")
score=f.read().split()
f.close()

没看出问题
你自己程序里加输出调试,看看 result 的值对不对,再看为什么没有写入
作者: yamika    时间: 2018-3-13 15:48
from random import randint
f=open('d:\Others\\text.txt')
score=f.read().split()
f.close()
cishu=int(score[0])
lunshu=int(score[1])
avg=int(score[2])
if cishu>0:
    avg=float(lunshu)/cishu
else:
    avg==0
print('游戏次数:%d,猜出所用的轮数:%d,平均每次所用轮数:%.2f'%(
    cishu,lunshu,avg))
num=randint(1,50)
print('猜一个1到50之间的数')
Biggo=False
time=0
while Biggo==False:
      time+=1
      answer=int(input())
      if answer>num:
          print('大了')
          Biggo==True
      if answer<num:
          print('小了')
          Biggo==True
      if answer==num:
          print('Biggo')
          Biggo==False
if cishu==0 or time<lunshu:
    lunshu==time
    cishu=cishu+1
    avg=float(lunshu)/cishu
data='%d,%d,%.2f'%(cishu,lunshu,avg)
f=open('d:\Others\\text.txt','w')
f.write(data)
f.clsoe()
能运行,但最后无法写入最新结果,自查半天也差不是原因,求教。。。

作者: crossin先生    时间: 2018-3-14 10:57
最后 close() 不是 clsoe
你这个应该直接就会有报错提示的,注意看报错信息
作者: chenhua44521    时间: 2018-3-19 14:52
老师你好
运行代码提示
Traceback (most recent call last):
  File "C:/Users/chenh/PycharmProjects/untitled/1.py", line 9, in <module>
    game_times=int(score[0])
ValueError: invalid literal for int() with base 10: '\xef\xbb\xbf0'

这个报错一直出现,弄得摸不着头脑。
谢谢指教!
作者: chenhua44521    时间: 2018-3-19 14:53
#coding:utf-8
from random import randint

#load file
f=open('C:\\Users\chenh\Desktop\game.txt')
score=f.read().split()
f.close()
game_times=int(score[0])
min_times=int(score[1])
total_times=int(score[2])

#judge
if game_times>0:
    avg_times = float(total_times)/game_times
else:
    avg_times = 0
#output result
print "你已经玩了%d次,最少%d轮猜出了答案,平均%.2f轮猜出了答案"%(game_times,min_times,avg_times)

num=randint(1,100)
times = 0
print "Guess what i think?"
bingo = False
while bingo == False:
    times+=1
    answer = input()
    if answer < num:
        print "太小了!"
    if answer > num:
        print "太大了!"
    if answer == num:
        print "BINGO!"
        bingo = True
if game_times ==0 or times <= min_times:
    min_times = times
total_times +=times
game_times +=1
result = '%d %d %d'%(game_times,min_times,total_times)
f = open('C:\Users\chenh\Desktop\game.txt','w')
f.write(result)
f.close()
作者: 司南    时间: 2018-4-12 15:19
  1. #读取文件中的成绩数据
  2. f=open('D:\game.txt')
  3. score=f.read().split()
  4. f.close()
  5. #分别存入变量中
  6. game_times=int(score[0])
  7. min_times=int(score[1])
  8. total_times=int(score[2])
  9. times=0
  10. #计算游戏的平均轮数,注意浮点数和避免除零错误
  11. if game_times>0:
  12.     avg_times=float(total_times)/game_times
  13. else:
  14.     avg_times=0
  15. print(game_times,min_times,avg_times)
  16. import random
  17. num=random.randint(1,5)
  18. guess=eval(input('guess what I think?'))
  19. #猜数过程
  20. def compare(x,y):
  21.     if x<y:
  22.         print('%d is too small' %x)
  23.     elif x>y:
  24.         print('%d is too big' %x)
  25.     else:
  26.         print('bingo')
  27.     return x==y

  28. #开始猜数
  29. while num!=guess:
  30.     compare(guess,num)
  31.     guess=eval(input('guess what I think?'))
  32.     times+=1
  33. print('bingo')
  34. if game_times==0 or times<min_times:
  35.     min_times=times
  36. total_times+=times
  37. game_times+=1
  38. result='%d %d %d' %(game_times,min_times,total_times)
  39. f=open('D:\game.txt','w')
  40. f.write(result)
  41. f.close()


  42.    

复制代码

作者: zorro    时间: 2018-10-20 15:14
老师,用这句判断的用意何在?
if game_times == 0 or times < min_times:

我试过忽略上句直接用min_times=times一样可以达到效果
作者: crossin先生    时间: 2018-10-21 13:24
zorro 发表于 2018-10-20 15:14
老师,用这句判断的用意何在?
if game_times == 0 or times < min_times:

当然不一样……你这个每次都会刷新最小轮数,之前的成绩就被覆盖了




欢迎光临 Crossin的编程教室 (https://bbs.crossincode.com/) Powered by Discuz! X2.5