Problem mit dem pygame highscore

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
luug22
User
Beiträge: 3
Registriert: Mittwoch 24. Juni 2020, 20:37

Hey Leute! Ich habe gerade neu mit Python begonnen. Für ein Schuleprojekt versuchen wir jetzt(halb selber und die komplizierten Sachen aus dem Internet)ein Spiel zu machen. Also besser gesagt Snake. Eigentlich lief ja alles ganz gut - bis auf den highscore. Zuerst hat er nie reagiert, wenn man ihn geknackt hat und jetzt, wo er endlich mal reagiert, wird einfach eine Null über den Highscore geschrieben und er wir nicht ersetzt. Ebenso wie die highscore Text Datei, welch auch nicht verändert wird. Ich würde mich freuen, wenn jemand eine Lösung für das Problem hat.

Liebe Grüsse
luug22

PS: Wenn ihr den Code bei euch ausführen wollt, müsst ihr euch die highscore Textdatei noch erstellen.

Code: Alles auswählen

 import random
import pygame

pygame.init()

white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (0, 0, 136)
gold = (212, 175, 55)

dis_width = 1500
dis_height = 800

dis_width2 = 1500
dis_height2 = 1000

dis_width3 = 1500
dis_height3 = 1200

dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snake')

clock = pygame.time.Clock()

snake_block = 50
snake_speed = 10

font_style = pygame.font.SysFont("bahnschrift", 50)
score_font = pygame.font.SysFont("comicsansms", 40)


def highscore(score):
    with open('highscore', 'r+') as hs:
        try:
            hs_score = int(hs.read())
            value = score_font.render("Highscore: " + str(hs_score), True, gold)
            dis.blit(value, [0, 60])
            if score > hs_score:
                hs_score = score
                hs.write(hs_score)
        except:
            hs_score = 0
            value = score_font.render("Highscore: " + str(hs_score), True, gold)
            dis.blit(value, [0, 60])
    return hs_score


def Your_score(score):
    user_score = score
    value = score_font.render("Score: " + str(score), True, white)
    dis.blit(value, [0, 0])


def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, green, [x[0], x[1], snake_block, snake_block])


def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width / 6, dis_height / 3])


def message2(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width2 / 6, dis_height2 / 3])


def message3(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width3 / 6, dis_height3 / 3])


def gameLoop():
    game_over = False
    game_close = False

    x1 = dis_width / 2
    y1 = dis_height / 2

    x1_change = 0
    y1_change = 0

    snake_List = []
    Length_of_snake = 1

    foodx = round(random.randrange(0, dis_width - snake_block) / 50.0) * 50.0
    foody = round(random.randrange(0, dis_height - snake_block) / 50.0) * 50.0

    while not game_over:

        while game_close == True:
            pygame.mixer.music.stop()
            dis.fill(blue)
            message("Du hast verloren!", red)
            message2("\"C\" um nochmal zu spielen", white)
            message3("\"Q\" um das Spiel zu verlassen", white)
            Your_score(Length_of_snake - 1)
            highscore(Length_of_snake - 1)
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        gameLoop()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN:
                    y1_change = snake_block
                    x1_change = 0

        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            game_close = True
        x1 += x1_change
        y1 += y1_change
        dis.fill(blue)
        pygame.draw.rect(dis, red, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]

        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True

        our_snake(snake_block, snake_List)
        Your_score(Length_of_snake - 1)
        highscore(Length_of_snake - 1)

        pygame.display.update()

        if x1 == foodx and y1 == foody:
            foodx = round(random.randrange(0, dis_width - snake_block) / 50.0) * 50.0
            foody = round(random.randrange(0, dis_height - snake_block) / 50.0) * 50.0
            Length_of_snake += 1

        clock.tick(snake_speed)

    pygame.quit()
    quit()


gameLoop()
Benutzeravatar
sparrow
User
Beiträge: 4237
Registriert: Freitag 17. April 2009, 10:28

Ohne jetzt den Code im Detail angeschaut zu haben:

Du hast in highscore() einen "nackten Except". Das heißt, egal was als Fehler in dem try-Block auftritt, landet dort. Und dort wird der Highscore auf 0 gesetzt.
Ich würde sagen, dass es in dem try-Block zu einer Ausnahme kommt. Da du die aber "verschluckst" weißt du das gar nicht.
Sirius3
User
Beiträge: 17831
Registriert: Sonntag 21. Oktober 2012, 17:20

Auf oberster Ebene sollten nur Konstanten und (Funktions-)Definitionen stehen. Konstanten schreibt man komplett gross: WHITE, YELLOW, ...
In `highscore` wird die Datei mit Modus r+ geöffnet. Das ist für Text-Dateien nie sinnvoll. Der Default r wäre richtig. Am besten auch noch ein Encoding angeben, da aber eh nur eine Zahl drinsteht, reicht ASCII. Zum Schreiben wird die Datei dann auch neu geöffnet. Damit hast Du auch nicht das Problem, dass, wenn die Datei nicht existiert (sollte man abftagen), gar nichts gemacht wird. Es ist auch nicht sinnvoll ständig die Datei zu lesen und zu schreiben. Lies sie einmal am Anfang des Spiels und schreibe einmal am Ende des Spiels.
So wie jetzt würdest Du jeweils eine neue Zahl hinten anhängen, aus 1 und 2 wird 12 und wenn dann der Score auf 13 wächst wird 1213, da wird der Highscore ziemlich schnell ziemlich groß. Zahlen kann man nicht schreiben, daher der Fehler und daher landest Du immer im except-Part. Nakte excepts ohne Ausgabe des Fehlers machen jede Fehlersuche unmöglich.
Strings setzt man nicht mit + zusammen, sondern nutzt Formatstrings.
In `Your_score` (richtige Schreibweise display_your_score; gibt es eigentlich auch ein our_score?) wird user_score gar nicht benutzt.
Wenn es ein our_snake gibt, wo ist dann das your_snake?
Die drei Message-Funktionen machen das selbe, wenn man ihnen width und Height als Parameter übergeben würde.

In der `while game_close` (das == True ist überflüssig) wird rekursiv gameLoop aufgerufen, das sollte nicht sein. Es muß also nocheinmal eine Schleife außenrum um die game_over-Schleife (am besten mit mehreren Funktionen) und das was in der game_close-Schleife passiert, sollte eigentlich nach der game_over-Schleife stehen und nicht innerhalb.
luug22
User
Beiträge: 3
Registriert: Mittwoch 24. Juni 2020, 20:37

Vielen Danke dür die schnelle Antwort! Ich versuche den Fehler zu beheben und melde mich dann zurück.
luug22
User
Beiträge: 3
Registriert: Mittwoch 24. Juni 2020, 20:37

Also nochmals vielen Dank! Mit eurer Hilfe konnten die Fehler behoben werden und alles läuft jetzt einwandfrei.
Antworten