Отображение списка рекордов для отображения поверхности Pygame - PullRequest
0 голосов
/ 18 февраля 2020

Я делаю список High_Name_Score (имя игрока и рекорд), который будет отображаться на экране «Over Game» (show_go_screen). Я могу сохранить и загрузить список, отсортировать его по количеству очков и перенести его на экран, но у меня есть две проблемы:

1) он отображает все на одной строке, и я хотел бы иметь каждого игрока / счет в новой строке

2) показаны скобки и цитаты, например, HIGH SCORE ['3580 AABB CC', '3508 CCBBAA'], и я бы хотел, чтобы он был чище

I Поиск в интернете безуспешно, пока я говорю, как это сделать:

import pygame
import random
import sys
import json
from pygame.locals import *

def (main):
    try:
        with open('High_Name_Score.txt', 'r') as file:
            High_Name_Score = json.load(file)
            High_Name_Score.sort()
    except FileNotFoundError:
        High_Name_Score = []

    High_Score = 0
    PURPLE = (139, 0, 139)

    arial = pygame.font.match_font('arial')

    pygame.init()
    CLOCK = pygame.time.Clock()
    DS = pygame.display.set_mode((W, H))
    pygame.display.set_caption("Racing Fury")

    def events():
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()

    def draw_text(surf, text, size, x, y, fonts, color):
        font = pygame.font.Font(fonts, size)
        text_surface = font.render(text, True, color)
        text_rect = text_surface.get_rect()
        text_rect.midtop = (x, y)
        surf.blit(text_surface, text_rect)

    def high_name():
        High_Name = ""
        Enter_Name = True
        while Enter_Name:
            DS.fill(WHITE)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYUP:
                    if event.key == K_a:
                        High_Name += 'A'
                    if event.key == K_b:
                        High_Name += 'B'
                    if event.key == K_c:
                        High_Name += 'C'
                    if event.key == K_RETURN:
                        High_Name_Score.append(str(High_Score) + " " + High_Name)
                        with open('High_Name_Score.txt', 'w') as file:
                            json.dump(High_Name_Score, file)
                        main()
            draw_text(DS, "HIGH SCORE: " + str(High_Name), 18, W / 2, 700, arial, PURPLE)
            pygame.display.flip()

    def show_go_screen():
        DS.fill(WHITE)
        Bckgrnd = [Summer, Winter, Desert, Space]
        Bckgrnd_Img = random.choice(Bckgrnd)
        if Bckgrnd_Img == Space:
            color = WHITE
        else:
            color = BLACK
        DS.blit(Bckgrnd_Img, (0, 0))
        for i in range(3):
            draw_text(DS, "RACING FURY!", 64, W / 2 + (i + 1), H / 4 - 60 + (i + 1), bodoni, color)
        draw_text(DS, "RACING FURY!", 64, W / 2, (H / 4 - 60), bodoni, PURPLE)
        draw_text(DS, "Summer Track (S)", 18, W / 2, (HH - 70), arial, color)
        draw_text(DS, "Winter Track (W)", 18, W / 2, (HH + 0), arial, color)
        draw_text(DS, "Desert Track (D)", 18, W / 2, (HH + 70), arial, color)
        for i in High_Name_Score:
            draw_text(DS, "HIGH SCORE: " + str(High_Name_Score), 18, W / 2, (H / 4 - 160), arial, PURPLE)

        pygame.display.flip()
        waiting = True
        while waiting:
            global TRACK
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                keystate = pygame.key.get_pressed()
                if keystate[pygame.K_s]:
                    TRACK = 1
                    waiting = False

Это, я думаю, вся необходимая часть кода. Нет необходимости говорить, что при пересечении линии fini sh вычисляется High_Score, а затем вызывается high_name () для ввода имени игрока. Все работает хорошо, имя игрока и счет сохраняются, и помещаются в список, только когда я перетаскиваю его на экран, я получаю скобки и цитаты, которые я не хочу видеть, и все это отображается в одной строке

Любые предложения будут высоко оценены

1 Ответ

0 голосов
/ 21 февраля 2020

Ну, это немного длинно, но следующий код сохранит ваши первые 3 балла в порядке от высшего к низшему и всегда будет корректироваться, если кто-либо получит новый высокий балл в топ-3 (полностью опустив # 3)

    def high_name():
        High_Name = ""
        Enter_Name = True
        try:
            with open('HS1.txt', 'r') as f1:
                HS1 = json.load(f1)
            with open('HS2.txt', 'r') as f2:
                HS2 = json.load(f2)
            with open('HS3.txt', 'r') as f3:
                HS3 = json.load(f3)
            with open('HN1.txt', 'r') as f4:
                HN1 = json.load(f4)
            with open('HN2.txt', 'r') as f5:
                HN2 = json.load(f5)
            with open('HN3.txt', 'r') as f6:
                HN3 = json.load(f6)
        except FileNotFoundError:
            HS1 = 0
            HS2 = 0
            HS3 = 0
            HN1 = ""
            HN2 = ""
            HN3 = ""

        while Enter_Name:
            DS.fill(WHITE)
            if Winner == 1:
                draw_text(DS, "Congrats Player1, Enter Your Name", 18, W / 2, 650, arial, PURPLE)
            elif Winner == 2:
                draw_text(DS, "Congrats Player2, Enter Your Name", 18, W / 2, 650, arial, PURPLE)
            if len(High_Name) >= 7:
                High_Name = High_Name[:-1]
                draw_text(DS, "Only 6 Characters", 18, W / 2, 750, arial, PURPLE)
                pygame.display.flip()
                pygame.time.delay(2000)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    if event.key >= K_a and event.key <= K_z:
                        High_Name += chr(event.key)
                    elif event.key >= K_0 and event.key <= K_9:
                        High_Name += chr(event.key)
                    elif event.key == K_BACKSPACE:
                        High_Name = High_Name[:-1]
                    elif event.key == K_RETURN:
                        High_Name = High_Name.capitalize()
                        if High_Score >= HS1:
                            HS3 = HS2
                            HN3 = HN2
                            HS2 = HS1
                            HN2 = HN1
                            HS1 = High_Score
                            HN1 = High_Name
                        elif High_Score >= HS2:
                            HS3 = HS2
                            HN3 = HN2
                            HS2 = High_Score
                            HN2 = High_Name
                        elif High_Score >= HS3:
                            HS3 = High_Score
                            HN3 = High_Name
                        with open('HS1.txt', 'w') as f1:
                            json.dump(HS1, f1)
                        with open('HS2.txt', 'w') as f2:
                            json.dump(HS2, f2)
                        with open('HS3.txt', 'w') as f3:
                            json.dump(HS3, f3)
                        with open('HN1.txt', 'w') as f4:
                            json.dump(HN1, f4)
                        with open('HN2.txt', 'w') as f5:
                            json.dump(HN2, f5)
                        with open('HN3.txt', 'w') as f6:
                            json.dump(HN3, f6)
                        main()
            draw_text(DS, "HIGH SCORE: " + str(High_Name), 18, W / 2, 700, arial, PURPLE)
            pygame.display.flip()

После этого у меня на экране «Game Over» отображаются результаты:

    def show_go_screen():
        DS.fill(WHITE)
        Bckgrnd = [Summer, Winter, Desert, Space]
        Bckgrnd_Img = random.choice(Bckgrnd)
        if Bckgrnd_Img == Space:
            color = WHITE
        else:
            color = BLACK
        DS.blit(Bckgrnd_Img, (0, 0))
        for i in range(3):
            draw_text(DS, "RACING FURY!", 64, W / 2 + (i + 1), H / 4 - 60 + (i + 1), bodoni, color)
        draw_text(DS, "RACING FURY!", 64, W / 2, (H / 4 - 60), bodoni, PURPLE)
        draw_text(DS, "Summer Track (S)", 18, W / 2, (HH - 70), arial, color)
        draw_text(DS, "Winter Track (W)", 18, W / 2, (HH + 0), arial, color)
        draw_text(DS, "Desert Track (D)", 18, W / 2, (HH + 70), arial, color)
        for s in range(3):
            draw_text(DS, "HIGH SCORES", 24, W / 2 + (s + 1), H / 4 - 180 + (s + 1), arial, color)
        draw_text(DS, "HIGH SCORES", 24, W / 2, (H / 4 - 180), arial, PURPLE)
        draw_text(DS, str(HN1) + ": " + str(HS1), 18, W / 2, (H / 4 - 140), arial, PURPLE)
        draw_text(DS, str(HN2) + ": " + str(HS2), 18, W / 2, (H / 4 - 120), arial, PURPLE)
        draw_text(DS, str(HN3) + ": " + str(HS3), 18, W / 2, (H / 4 - 100), arial, PURPLE)

        pygame.display.flip()
        waiting = True
        while waiting:
            global TRACK
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                keystate = pygame.key.get_pressed()
                if keystate[pygame.K_s]:
                    TRACK = 1
                    waiting = False

И, конечно, вам нужно будет получить несколько массивов, таких как High_Score, из других частей вашей игры.

Если любой может сделать это в гораздо меньшем количестве кода, пожалуйста, дайте мне знать !!!

...