Seite 1 von 1

Probleme beim abspielen eines Codes

Verfasst: Montag 28. Dezember 2020, 20:31
von JonBach18
Hallo Leute ich habe leider ein kleines Problem bezüglich eines Codes. Es läuft alles gut und nach ein paar Sekunden kommt nur die Maus die nur durchgehen lädt und das "Fenster" hat sich dan aufgehängt.
Ich hoffe ihr könnt mir helfen :) Und mir sagen was ich falsch gemacht habe und mir eine Lösung geben:)

Code: Alles auswählen

import turtle

window = turtle.Screen()
window.bgcolor("black")
window.setup(width=700, height=700)
window.title("Ein Labyrinth Spiel")
#window.tracer(0)
#window.mainloop()


#Create Pen
class Pen(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self)
        self.shape("square")
        self.color("white")
        self.penup()
        self.speed(0)

class Player(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self)
        self.shape("square")
        self.color("blue")
        self.penup()
        self.speed(0)

def go_up(self):
    self.goto(self.xcor(), self.ycor() +24)

def go_down(self):
    self.goto(self.xcor(), self.ycor() -24)

#Create levels list
levels =[""]

#Define first level
level_1 = [
"XXXXXXXXXXXXXXXXXXXXXXXXX",
"XP XXXXXXX          XXXXX",
"X  XXXXXXX  XXXXXX  XXXXX",
"X       XX  XXXXXX  XXXXX",
"X       XX  XXX        XX",
"XXXXXX  XX  XXX        XX",
"XXXXXX  XX  XXXXXX  XXXXX",
"XXXXXX  XX    XXXX  XXXXX",
"X  XXX        XXXX  XXXXX",
"X  XXX  XXXXXXXXXXXXXXXXX",
"X         XXXXXXXXXXXXXXX",
"X                XXXXXXXX",
"XXXXXXXXXXXX     XXXXX  X",
"XXXXXXXXXXXXXXX  XXXXX  X",
"XXX  XXXXXXXXXX         X",
"XXX                     X",
"XXX          XXXXXXXXXXXX",
"XXXXXXXXXX   XXXXXXXXXXXX",
"XXXXXXXXXX              X",
"XX   XXXXX              X",
"XX   XXXXXXXXXXXXX  XXXXX",
"XX    XXXXXXXXXXXX  XXXXX",
"XX          XXXX        X",
"XXXX                    X",
"XXXXXXXXXXXXXXXXXXXXXXXXX",
]

#Add maze to mazes list
levels.append(level_1)

#Create Level setup Function
def setup_maze(level):
    for y in range(len(level)):
        for x in range(len(level[y])):
            #Get the charecter at each x,y coordinate
            #Note the order of y and x in the next line
            charecter = level[y][x]
            #Calculate the screen x, y cooednites
            screen_x = -288 + (x*24)
            screen_y = 288 - (y*24)

            #Check if it is an X (representing a wall)
            if charecter == "X":
                pen.goto(screen_x, screen_y)
                pen.stamp()

            #Check if it is an P(representing the Player)
            if charecter == "P":
                player.goto(screen_x, screen_y)


#Create class instances
pen = Pen()
player = Player()

#Set up the level
setup_maze(levels[1])

#Main Game Loop
while True:
    pass

Re: Probleme beim abspielen eines Codes

Verfasst: Montag 28. Dezember 2020, 20:56
von noisefloor
Hallo,

du hast am Ende eine Endlosschleife, die nichts macht, als deine CPU zu beschäftigen.

Gruß, noisefloor

Re: Probleme beim abspielen eines Codes

Verfasst: Montag 28. Dezember 2020, 21:25
von JonBach18
wenn ich aber die Endlosschleife weg lasse schließt sich das Fenster schon direkt nach ein paar Sekunden

Re: Probleme beim abspielen eines Codes

Verfasst: Montag 28. Dezember 2020, 21:46
von __blackjack__
@JonBach18: Die Schleife am Ende darf nicht sein. Die verbrät einfach nur 100% CPU-Zeit ohne irgendetwas zu machen. Insbesondere läuft auch die GUI-Hauptschleife nicht, so dass das System nach einiger Zeit in der Dein Programm deswegen keine Ereignisse mehr verarbeitet, den Eindruck haben kann, das Programm sein tot. Und der Benutzer natürlich auch weil ohne GUI-Hauptschleife das Fenster nicht mehr aktualisiert wird.

Wenn Du alles aufgesetzt hast, gibt es die `turtle.done()`/`turtle.mainloop()`-Funktion. In der Dokumentation des Moduls beispielsweise gleich im ersten Beispiel („Turtle star“) zu sehen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Am unübersichtlichen ist es wenn man den Code vom Hauptprogramm auf Modulebene mit Funktionsdefinitionen mischt und Konstanten nicht als solche kenntlich macht und auch mitten drin definiert.

`levels` (also eigentlich `LEVELS`) wird auch sehr komisch/umständlich erstellt. Da würde man einfach gleich die Liste mit den Leveln direkt hinschreiben und ohne einen komischen und vom Typ her so unregelmässigen Platzhalter als erstes Element. Die Zählung fängt bei 0 an.

Bei den Kommentaren ist viel superoffensichtliches dabei. Dafür sind Kommentare nicht gedacht. Die beschreiben *warum* Code etwas so tut wie er es tut, sofern das nicht offensichtlich ist. Die beschreiben nicht *was* der Code macht, denn das steht da bereits deutlich lesbar als Code.

Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. `setup_maze()` braucht also noch `pen` und `player` als Argumente.

So ”magische” Werte wie die 24 die da sehr oft auftaucht, sollten als Konstante definiert werden.

Über die Einrückung von den ”Funktionen” die `self` als Argument haben, möchtest Du vielleicht noch mal nachdenken.

`charecter` sollte wohl `character` heissen.

Die Schleifen in `setup_maze()` sind ”unpythonisch”. Statt nur die Spielfeld-Koordinaten zu generieren, würde man mit `enumerate()` über die jeweiligen Listenelemente *und* die Spielfeld-Koordinaten iterieren.

`charecter` kann nur einen Wert annehmen, also ist das ein Fall für ``elif`` statt auch die Bedingung die niemals eintreten kann mit einem ``if`` zu prüfen.

Und an solchen Stellen ist ein ``else``-Zweig der den wirklich unmöglichen Fall prüft, sinnvoll, denn es ist erstaunlich wie häufig doch Sachen passieren die niemals eintreten dürften — wenn man denn keine Fehler machen würde.

Code: Alles auswählen

#!/usr/bin/env python3
import turtle

GRID_CELL_SIZE = 24
GRID_EXTEND = GRID_CELL_SIZE * 12
GRID_MARGIN = 62

LEVELS = [
    [
        "XXXXXXXXXXXXXXXXXXXXXXXXX",
        "XP XXXXXXX          XXXXX",
        "X  XXXXXXX  XXXXXX  XXXXX",
        "X       XX  XXXXXX  XXXXX",
        "X       XX  XXX        XX",
        "XXXXXX  XX  XXX        XX",
        "XXXXXX  XX  XXXXXX  XXXXX",
        "XXXXXX  XX    XXXX  XXXXX",
        "X  XXX        XXXX  XXXXX",
        "X  XXX  XXXXXXXXXXXXXXXXX",
        "X         XXXXXXXXXXXXXXX",
        "X                XXXXXXXX",
        "XXXXXXXXXXXX     XXXXX  X",
        "XXXXXXXXXXXXXXX  XXXXX  X",
        "XXX  XXXXXXXXXX         X",
        "XXX                     X",
        "XXX          XXXXXXXXXXXX",
        "XXXXXXXXXX   XXXXXXXXXXXX",
        "XXXXXXXXXX              X",
        "XX   XXXXX              X",
        "XX   XXXXXXXXXXXXX  XXXXX",
        "XX    XXXXXXXXXXXX  XXXXX",
        "XX          XXXX        X",
        "XXXX                    X",
        "XXXXXXXXXXXXXXXXXXXXXXXXX",
    ]
]


class Pen(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self)
        self.shape("square")
        self.color("white")
        self.penup()
        self.speed(0)


class Player(turtle.Turtle):
    def __init__(self):
        turtle.Turtle.__init__(self)
        self.shape("square")
        self.color("blue")
        self.penup()
        self.speed(0)


def go_up(self):
    self.goto(self.xcor(), self.ycor() + GRID_CELL_SIZE)


def go_down(self):
    self.goto(self.xcor(), self.ycor() - GRID_CELL_SIZE)


def setup_maze(pen, player, level):
    for y, row in enumerate(level):
        for x, character in enumerate(row):
            screen_x = -GRID_EXTEND + (x * GRID_CELL_SIZE)
            screen_y = GRID_EXTEND - (y * GRID_CELL_SIZE)
            if character == "X":
                pen.goto(screen_x, screen_y)
                pen.stamp()
            elif character == "P":
                player.goto(screen_x, screen_y)
            else:
                assert character == " ", "free cell expected"


def main():
    window = turtle.Screen()
    window.bgcolor("black")
    size = (GRID_EXTEND + GRID_MARGIN) * 2
    window.setup(width=size, height=size)
    window.title("Ein Labyrinth Spiel")
    pen = Pen()
    player = Player()
    setup_maze(pen, player, LEVELS[0])
    window.mainloop()


if __name__ == "__main__":
    main()

Re: Probleme beim abspielen eines Codes

Verfasst: Montag 28. Dezember 2020, 23:58
von JonBach18
Vielen Vielen Dank für die schnelle Antwort!!!
Eine Kleine Frage warum ist es nicht möglich nach oben oder nach unten zu gehen?

Re: Probleme beim abspielen eines Codes

Verfasst: Dienstag 29. Dezember 2020, 00:04
von JonBach18
Nochmal vielen vielen Dank für die perfekte ausführliche Antwort!! Hat mir sehr geholfen!!!
Hab noch eine Frage was bedeutet dieser Code? Den hast du in deinem Code drinnen gehabt :)

Code: Alles auswählen

else:
                assert character == " ", "free cell expected"

Re: Probleme beim abspielen eines Codes

Verfasst: Dienstag 29. Dezember 2020, 01:01
von __blackjack__
@JonBach18: Damit überprüfe ich ob `character` den Wert hat, den es an der Stelle haben sollte. Mit ``assert`` prüft man Sachen die auf jeden Fall wahr sind.