Метка рекордов Python 3 отображает 0 вместо значения из Pickle - PullRequest
0 голосов
/ 29 октября 2018

Я знаю, что только что задал другой вопрос ранее, но я немного застрял. Моя игра о том, что вы перемещаетесь между тремя пробелами и уклоняетесь от квадратов с разными скоростями. Текстовая метка «скорость» (я не знаю, как ее назвать) обновляется нормально (и обновляется, когда блок достигает нижней части экрана), но текстовая метка с высокой оценкой (которую с помощью маринада загружается высокая оценка) , И если вам интересно, в файле pickle уже загружен высокий балл. Это не пусто.

import pygame
import random
import math
import sys
import cPickle as pickle
#import os.path

pygame.init()
pygame.font.init()

score = 0

myfont = pygame.font.SysFont("Comic Sans MS", 30)

screenWidth = 700
screenHeight = 800

red = (255,0,0)
blue = (0,0,255)
yellow = (255,255,0)
cyan = (0,255,255)
purple = (255, 0, 255)

x = screenWidth / 2
y = (screenHeight / 4) * 3
width = 50
height = 50
highScore = 0


corn1 = pygame.image.load("new1.png")
corn2 = pygame.image.load("new2.png")
corn3 = pygame.image.load("new3.png")
corn4 = pygame.image.load("new4.png")

mac = [corn1, corn2, corn3, corn4]

class player():
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.walkCount = 0

    def draw(self, win):
        if self.walkCount + 1 >= 60:
            self.walkCount = 0
        win.blit(mac[self.walkCount//15], (self.x,self.y))
        self.walkCount += 1


win = pygame.display.set_mode((screenWidth, screenHeight))
pygame.display.set_caption("Corn Dash")

bg = pygame.image.load("background.png").convert()
gameover = pygame.image.load("gameover.png").convert()
#corn = pygame.image.load("player.png")
bgx = (screenWidth / 6) * 2
bgy = 0



#mac = [pygame.image.load("1.png"), pygame.image.load("2.png"), pygame.image.load("3.png"), pygame.image.load("4.png")]

clock = pygame.time.Clock()

class enemy():
    def __init__(self,c,y,width,height, color, vel):
        self.c = c
        self.y = y
        self.width = width
        self.height = height
        self.vel = vel
        self.color = color

    def draw(self, win):
        global score
        if gameOver == False:
            if self.c == 1:
                self.x = 250
                #250
            elif self.c == 2:
                self.x = 350
                #350
            else:
                self.x = 450
                #450
            self.y += self.vel
            if self.y >= 800:
                score += 1
                self.y = random.randint(-500,0)
                self.c = random.randint(1,3)
            pygame.draw.rect(win, (self.color), (self.x,self.y,self.width,self.height))
        else:
            self.y = 0

evil = enemy(random.randint(1,3),0,50,50, blue, 5)
evil2 = enemy(random.randint(1,3),-400,50,50, blue, 5)
evil3 = enemy(random.randint(1,3),random.randint(-500,-100),50,50, blue, 5)
evil4 = enemy(random.randint(1,3),-1000,50,50, yellow, 15)
evil5 = enemy(random.randint(1,3),100,50,50, purple, 2)

running = True
gameOver = False

corn = player(screenWidth/2,(screenHeight / 4) * 3)

def saveScore():
    highScore = score
    pickle_out = open("save.pickle","wb")
    pickle.dump(highScore, pickle_out)
    pickle_out.close()
    print("Score saved:" + str(highScore))

def  loadScore():
    pickle_in = open("save.pickle","rb")
    highScore = pickle.load(pickle_in)
    pickle_in.close()
    print("Score loaded:" + str(highScore))

loadScore()
while running:
    # -----The game over scene.-----
    while gameOver:
        scoreLabel = myfont.render(("Score:"+str(score)), False, (0,0,0))
        highScoreLabel = myfont.render(("High Score:"+str(highScore)), False, (0,0,0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                # pygame.quit only uninitializes the pygame modules and
                # doesn't quit the program.
                pygame.quit()
                # This will quit the whole program. You need to import sys.
                sys.exit()
            elif event.type == pygame.KEYUP:  # event.type not pygame.event.type
                if event.key == pygame.K_SPACE:
                    # Change it to False to break out of the loop.
                    gameOver = False
                    # Reset the game. You could reset the position of the
                    # `evil` object or instantiate a new one.
                    x = 350
                    evil.c = random.randint(1,3)
                    evil.y = 0
                    evil2.c = random.randint(1,3)
                    evil2.y = random.randint(-300,0)
                    evil3.c = random.randint(1,3)
                    evil3.y = random.randint(-600,20)
                    evil4.c = random.randint(1,3)
                    evil4.y = random.randint(-3000,-2500)
                    evil5.c = random.randint(1,3)
                    evil5.y = random.randint(0,300)
                    score = 0
                elif event.key == pygame.K_s:
                    saveScore()
                    print("Score saved:"+str(highScore))

        highScoreLabel = myfont.render(("High Score:"+str(highScore)), False, (0,0,0))
        win.blit(gameover, (0,0))
        win.blit(scoreLabel,(0,0))
        win.blit(highScoreLabel, (0,30))
        pygame.display.update()
        clock.tick(60)  # You need to call tick in this loop as well.

    # ------------------------------
    # -----The main scene.-----
    highScoreLabel1 = myfont.render(("High Score:"+str(highScore)), False, (255,255,255))
    scoreLabel1 = myfont.render(("Score:"+str(score)), False, (255,255,255))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_RIGHT and corn.x < 450:
                corn.x += 100
            elif event.key == pygame.K_LEFT and corn.x > 250:
                corn.x -= 100

    win.fill((0,0,0))
    win.blit(bg, (bgx, bgy))
    evil.draw(win)
    evil2.draw(win)
    evil3.draw(win)
    evil4.draw(win)
    evil5.draw(win)
    win.blit(scoreLabel1,(0,0))
    win.blit(highScoreLabel1, (0,30))
    dist = math.hypot(evil.x - corn.x, evil.y - corn.y)
    dist2 = math.hypot(evil2.x - corn.x, evil2.y - corn.y)
    dist3 = math.hypot(evil3.x - corn.x, evil3.y - corn.y)
    dist4 = math.hypot(evil4.x - corn.x, evil4.y - corn.y)
    dist5 = math.hypot(evil5.x - corn.x, evil5.y - corn.y)
    if dist <= 50 or dist2 <= 50 or dist3 <= 50 or dist4 <= 50 or dist5 <= 50:
        print("Game Over!")
        gameOver = True
    corn.draw(win)
    pygame.display.update()
    clock.tick(60)

1 Ответ

0 голосов
/ 29 октября 2018

Это проблема переменной области. Хотя вы определили как score и highScore как глобальные переменные (вне какой-либо функции), вы затем присваиваете значение highScore в saveScore() и loadScore(). Когда вы выполняете присваивание, Python интерпретирует переменную как local для функции . Чистый результат для saveScore() все еще работает. Фактически, вы можете присвоить score значение и увидеть, что оно сохранено правильно. Но когда вы используете loadScore(), значение читается из файла, затем присваивается highScore, но только в локальной области действия функции : после завершения функции значение теряется.

Два способа это исправить.

Самым простым было бы просто добавить оператор global highScore внутри функции loadScore(), чтобы не было двусмысленности. Это работает, но не очень рекомендуется.

Второй и наиболее подходящий способ сделать это - немного реструктурировать переменную область видимости и внести изменения, такие как:

  1. Пусть saveScore() принимает параметр, то есть значение, которое вы хотите сохранить
  2. Пусть loadScore() возвращает загруженное значение в операторе return
  3. отслеживайте score и highScore внутри основного цикла и сохраняйте / загружайте при необходимости

Также, для лучшего и более полного объяснения, ознакомьтесь с этим руководством по Глобальным, Локальным и нелокальным переменным . Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...