2014-12-07 79 views
0

我在一个简单的无尽的隧道赛车类型的游戏中写一个高分的文件有一个小问题。python失败的文件编写

如果在我开始游戏之前写了高分,文件中没有任何内容。但文件中的一个号码后,它完全忽略了:

if score > hs: 
    hs = score 
    hsfile = open("hs.txt", "w") 
    hsfile.write(str(hs)) 
    hsfile.close() 

要打开的文件,并检查,如果事情是写我的代码:

hf = open("hs.txt", "r") 

h = hf.readline() 

if len(h) > 0: 
    hs = h 
else: 
    hs = 0 

重述:

如果在hs.txt中没有写入任何内容,则将高分添加到txt文件中,然后写入该文件。

如果写入内容(在第一次播放和重新启动应用程序之后),分数将保留为文件中的内容。帮帮我?如果需要的话

全码:

import pygame, sys, time, random 

pygame.init() 

disw = 640 
dish = 480 

white = (255,255,255) 
black = ( 0, 0, 0) 
brown = (193,125, 58) 
green = ( 0,220, 0) 

gameExit = False 

score = 0 

speed = -2 

spawned = False 

hf = open("hs.txt", "r") 

h = hf.readline() 

if len(h) > 0: 
    hs = h 
else: 
    hs = 0 

if gameExit == True: 
    h.close() 

rockx = 640 

rocky = random.randint(0, dish) 

rockw = random.randint(10,150) 

rockh = random.randint(10,150) 

ship = pygame.image.load("ship.png") 

bg = pygame.image.load("bg.png") 

gameOver = False 

def rock(thingx,thingy,thingw,thingh,color): 
    pygame.draw.rect(gameDisplay, color, [thingx, thingy, thingw, thingh]) 

def rockhit(): 
    global score, spawned, speed, rockx, rocky, rockw, rockh 
    rockx = 640 
    rocky = random.randint(0, dish) 
    rockw = random.randint(10,150) 
    rockh = random.randint(10,150) 
    score += 1 
    spawned = False 
    speed -= 1 

class Ship(): 
    def __init__(self, x, y, w, h): 
     self.x = x 
     self.y = y 
     self.w = w 
     self.h = h 

gameDisplay = pygame.display.set_mode((disw,dish)) 
pygame.display.set_caption("Tunnel") 
Clock = pygame.time.Clock() 

def main(): 
    global gameOver, score, spawned, speed, rockx, rocky, rockw, rockh, hs, gameExit 
    shipdimensions = Ship(200, 10, 60, 40) 
    xc = 0 
    yc = 0 
    def startGame(): 
     gameDisplay.blit(bg, (0, 0)) 
     gameDisplay.blit(ship, (shipdimensions.x, shipdimensions.y)) 

    while not gameExit: 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 

      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_w: 
        yc = -6 
       if event.key == pygame.K_s: 
        yc = 6 
       if event.key == pygame.K_SPACE: 
        if gameOver == True: 
         startGame() 
         gameOver = False 
         speed = -2 

      elif event.type == pygame.KEYUP: 
       if event.key == pygame.K_w or event.key == pygame.K_s: 
        yc = 0 

     shipdimensions.y += yc 
     rockx += speed 

     gameDisplay.fill(black) 
     gameDisplay.blit(bg, (0, 0)) 
     gameDisplay.blit(ship, (shipdimensions.x, shipdimensions.y)) 

     font = pygame.font.SysFont(None, 25) 
     text = font.render("Score: " + str(score), True, green) 
     gameDisplay.blit(text, (1,1)) 

     font = pygame.font.SysFont(None, 25) 
     text = font.render("High Score: " + str(hs), True, green) 
     gameDisplay.blit(text, (1,20)) 

     if gameOver == True: 
      font = pygame.font.SysFont(None, 25) 
      text = font.render("Game Over, press 'Space' to restart.", True, green) 
      gameDisplay.blit(text, (100,200)) 

     if shipdimensions.y < rocky + rockh: 
      if shipdimensions.y + shipdimensions.h < rocky: 
       pass  
      elif shipdimensions.x > rockx and shipdimensions.x < rockx + rockw or shipdimensions.x + shipdimensions.w > rockx and shipdimensions.x + shipdimensions.w < rockx + rockw:    
       rockx = 640 
       rocky = random.randint(0, dish) 
       rockw = random.randint(10,150) 
       rockh = random.randint(10,150) 
       speed = 0 
       gameOver = True 
       score = 0 

     if gameOver == False and spawned == False: 
      rock(rockx,rocky,rockw,rockh,brown) 

     if shipdimensions.y <= 0: 
      shipdimensions.y = 0 

     if shipdimensions.y + shipdimensions.h >= dish: 
      shipdimensions.y = dish - shipdimensions.h 

     if rockx <= 0: 
      rockhit() 

     if score > hs: 
      hs = score 
      hsfile = open("hs.txt", "w") 
      hsfile.write(str(hs)) 
      hsfile.close() 


     pygame.display.update() 
     Clock.tick(60) 

if '__main__' == __name__: 
    main() 
+0

请注意,此代码永远不会执行:'如果gameExit == True:h.close()',因为您在程序的早期将'gameExit'设置为'False'。而要真正关闭你的文件,你需要'hf.close()'。是的,如果你打开一个带有“r”的文件,你需要关闭它,然后用''w''重新打开它。 – 2014-12-07 08:28:09

+0

gameExit = False当我退出游戏时,它在关闭之前运行。它现在适用于别人的修复。 – HKVariant 2014-12-07 11:47:15

回答

2

尝试在读取它时将hs转换为int(否则它将是一个字符串)?

if len(h) > 0: 
    hs = int(h) 
else: 
    hs = 0 

例如你会得到奇怪的比较字符串和整数..即:

>>> 12 > "10" 
False 

在python解释器。 (Python应该可能会抛出一个异常,我想不出你想要比较一个int和一个字符串的时间)。

+0

谢谢,它的工作,有一个小错误我想我可以用它自己解决。 – HKVariant 2014-12-07 11:41:29

+0

是的,修正了它写出每个数字的错误,谢谢你的回答!简直不敢相信。 – HKVariant 2014-12-07 11:45:34

0

您可能打开同一文件进行写入之前关闭HF。

+0

没有工作!我认为这与顶部的if和else声明有关,但我不知道如何解决它。 – HKVariant 2014-12-07 05:48:35

+0

您是否试过在读写模式下打开文件?使用“R +”而不是“R”或“W”,所以你只需要处理打开文件一次 – 2014-12-07 05:56:01

+0

同样的错误做到这一点,我很困惑这是为什么 – HKVariant 2014-12-07 05:58:51