Snake Multiplayer Spiel

Code-Stücke können hier veröffentlicht werden.
Antworten
Dark_Skorpion
User
Beiträge: 3
Registriert: Freitag 14. Februar 2014, 18:45

Hallo liebe Python Community

Generell bin ich ein ziemlicher Anfänger in Sachen programmieren.
Ich möchte euch mein Snake Multiplayer Spiel zeigen und gerne erfahren was ihr darüber denkt.(Kritik, Verbesserungsvorschläge, alles woraus ich was lernen kann :D )

Code: Alles auswählen

from tkinter import *
import random

class Snake:
    
    def Right(self, event):
        self._Richtung = "Right"

    def Up(self, event):
        self._Richtung = "Up"

    def Left(self, event):
        self._Richtung = "Left"

    def Down(self, event):
        self._Richtung = "Down"
        
    def Laufe(self):
        if self._Richtung == "Right":
            canvas.create_line (self._x, self._y, self._x + 2, self._y, fill = self._color, width = 1)
            self._x = self._x + 2

        if self._Richtung == "Up":
            canvas.create_line (self._x, self._y, self._x, self._y - 2, fill = self._color)
            self._y = self._y - 2

        if self._Richtung == "Left":
            canvas.create_line (self._x, self._y, self._x - 2, self._y, fill = self._color)
            self._x = self._x - 2

        if self._Richtung == "Down":
            canvas.create_line (self._x, self._y, self._x, self._y + 2, fill = self._color)
            self._y = self._y + 2

        self._Koordinate = str(self._x) + "/" + str(self._y)
        if self._Koordinate in Spiel._Speicher or self._x < 0 or self._x > 800 or self._y < 0 or self._y > 800:
            if self._Leben > 0:
                self._Leben -= 1
                Anzeige.delete(self._Leben_Menge)
                self._Leben_Menge = Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
                canvas.after(self._Geschwindigkeit, self.Laufe)
            else:
                self._Text = self._Farbe + " hat Verloren!"
                canvas.create_text(400, 400, text = self._Text, font = ("Arial", 70), fill = "white")
                Snake1._Check = True
                Snake2._Check = True
                Spiel.Punkte(self._Farbe)
        elif self._Check == False:
            if str(self._Koordinate + "Leben") in Spiel._Speicher:
                self._Leben += 1
                Anzeige.delete(self._Leben_Menge)
                self._Leben_Menge = Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
                Spiel.Leben_eingesammelt()
            Spiel._Speicher.append(self._Koordinate)
            if Spiel._Pausiert != True:
                canvas.after(self._Geschwindigkeit, self.Laufe)
            else:
                self.Pausiert()
            
    def Pausiert(self):
        if Spiel._Pausiert == True:
            canvas.after(100, self.Pausiert)
        else:
            self.Laufe()



class Snake1(Snake):

    def __init__(self):
        self._Richtung = "Right"
        self._x = 500
        self._y = 400
        self._color = "red"
        self._Farbe = "Rot"
        self._Check = False
        self._Leben = 0
        self._x_Lebensanzeige = 200
        self._Geschwindigkeit = 30

        self._Leben_Menge = Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
        
        fenster.bind("<Right>", self.Right)
        fenster.bind("<Up>", self.Up)
        fenster.bind("<Left>", self.Left)
        fenster.bind("<Down>", self.Down)
        self.Laufe()


class Snake2(Snake):

    def __init__(self):
        self._Richtung = "Left"
        self._x = 300
        self._y = 400
        self._color = "green"
        self._Farbe = "Grün"
        self._Check = False
        self._Leben = 0
        self._x_Lebensanzeige = 150
        self._Geschwindigkeit = 30

        self._Leben_Menge = Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
        
        fenster.bind("<d>", self.Right)
        fenster.bind("<w>", self.Up)
        fenster.bind("<a>", self.Left)
        fenster.bind("<s>", self.Down)
        self.Laufe()



class Spiel:

    def __init__(self):
        self._Speicher = ["L", "L", "L", "L"]
        self._x = 0
        self._y = 0
        self._Geschwindigkeit = 30
        self._Pausiert = False
        self._Punkte_Rot = 0
        self._Punkte_Grün = 0
        self._Turbo_Zähler_rot = 3
        self._Turbo_Zähler_grün = 3

        Anzeige.create_text(50, 25, text = "Leben:", font = ("Elephant", 20))
        
        Anzeige.create_rectangle(50, 50, 250, 250, fill = "yellow", outline = "darkgreen", width = 5, tags = "Nochmal")
        Anzeige.create_text(150, 150, text = "NOCHMAL", font = ("Chiller", 40), tags = "Nochmal")
        Anzeige.tag_bind("Nochmal", "<1>", self.Nochmal)
        fenster.bind("<space>", self.Nochmal)

        Anzeige.create_text(150, 300, text = "Geschwindigkeit:", font = ("Elephant", 20))
        Anzeige.create_text(150, 330, text = "x1/1000 Sekunde pro Pixel", font = ("Arial", 10))
        Anzeige.create_line(50, 350, 250, 350)
        self._Geschwindigkeitszahl = Anzeige.create_text(150, 370, text = "30", font = ("Arial", 15))
        self._Knopf = Anzeige.create_rectangle(40 + self._Geschwindigkeit, 340, self._Geschwindigkeit + 60, 360, fill = "lightblue", tags = "Geschwindigkeitsregler")
        Anzeige.tag_bind("Geschwindigkeitsregler", "<1>", self.Geschwindigkeit_einstellen_Press)
        Anzeige.tag_bind("Geschwindigkeitsregler", "<B1-Motion>", self.Geschwindigkeit_einstellen_Motion)

        Anzeige.create_rectangle(220, 10, 290, 40, fill = "yellow", outline = "darkgreen", width = 3, tags = "Lebensreset")
        Anzeige.create_text(255, 25, text = "Reset", font = ("Arial", 18), tags = "Reset")
        Anzeige.tag_bind("Reset", "<ButtonPress-1>", self.Reset)

        Anzeige.create_rectangle(50, 400, 250, 440, fill = "yellow", outline = "darkgreen", width = 3, tags = "Pause")
        self._Pause = Anzeige.create_text(150, 420, text = "Pause", font = ("Elephant", 20), tags = "Pause")
        Anzeige.tag_bind("Pause", "<1>", self.Pause)
        fenster.bind("<p>", self.Pause)
        Anzeige.tag_bind("Weiter", "<1>", self.Weiter)
        fenster.bind("<Return>", self.Weiter)

        Anzeige.create_line(20, 490, 280, 490, width = 3)
        Anzeige.create_line(150, 470, 150, 530, width = 3)
        Anzeige.create_text(200, 480, text = "ROT", font = ("Elephant", 16), fill = "red")
        Anzeige.create_text(100, 480, text = "GRÜN", font = ("Elephant", 16), fill = "green")
        self._Punkte_Grün_Anzeige = Anzeige.create_text(100, 510, text = self._Punkte_Grün, font = ("Chiller", 30))
        self._Punkte_Rot_Anzeige = Anzeige.create_text(200, 510, text = self._Punkte_Rot, font = ("Chiller", 30))

        Anzeige.create_text(50, 570, text = "Turbo:", font = ("Elephant", 20))
        self._Turbo_rot_1 = Anzeige.create_rectangle(100, 560, 150, 570, fill = "red")
        self._Turbo_rot_2 = Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
        self._Turbo_rot_3 = Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        self._Turbo_grün_1 = Anzeige.create_rectangle(100, 580, 150, 590, fill = "green")
        self._Turbo_grün_2 = Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
        self._Turbo_grün_3 = Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        fenster.bind("<Shift_L>", self.Turbo_grün)
        fenster.bind("<0>", self.Turbo_rot)

        self.Leben()

    def Turbo_rot(self, event):
        if self._Turbo_Zähler_rot != 0:
            if Snake1._Geschwindigkeit > 20:
                Snake1._Geschwindigkeit -= 20
            else:
                Snake1._Geschwindigkeit = 1
            if self._Turbo_Zähler_rot == 3:
                Anzeige.delete(self._Turbo_rot_3)
            if self._Turbo_Zähler_rot == 2:
                Anzeige.delete(self._Turbo_rot_2)
            if self._Turbo_Zähler_rot == 1:
                Anzeige.delete(self._Turbo_rot_1)
            self._Turbo_Zähler_rot -= 1
            canvas.after(3000, self.Turbo_ende)

    def Turbo_grün(self, event):
        if self._Turbo_Zähler_grün != 0:
            if Snake2._Geschwindigkeit > 20:
                Snake2._Geschwindigkeit -= 20
            else:
                Snake2._Geschwindigkeit = 1
            if self._Turbo_Zähler_grün == 3:
                Anzeige.delete(self._Turbo_grün_3)
            if self._Turbo_Zähler_grün == 2:
                Anzeige.delete(self._Turbo_grün_2)
            if self._Turbo_Zähler_grün == 1:
                Anzeige.delete(self._Turbo_grün_1)
            self._Turbo_Zähler_grün -= 1
            canvas.after(3000, self.Turbo_ende)

    def Turbo_ende(self):
        Snake1._Geschwindigkeit = self._Geschwindigkeit
        Snake2._Geschwindigkeit = self._Geschwindigkeit

    def Punkte(self, Farbe):
        if Farbe == "Rot":
            self._Punkte_Grün += 1
        elif Farbe == "Grün":
            self._Punkte_Rot += 1
        Anzeige.delete(self._Punkte_Grün_Anzeige, self._Punkte_Rot_Anzeige)
        self._Punkte_Grün_Anzeige = Anzeige.create_text(100, 510, text = self._Punkte_Grün, font = ("Chiller", 30))
        self._Punkte_Rot_Anzeige = Anzeige.create_text(200, 510, text = self._Punkte_Rot, font = ("Chiller", 30))
        
            

    def Weiter(self, event):
        self._Pausiert = False
        Anzeige.delete(self._Pause)
        self._Pause = Anzeige.create_text(150, 420, text = "Pause", font = ("Elephant", 20), tags = "Pause")

    def Pause(self, event):
        Anzeige.delete(self._Pause)
        self._Pause = Anzeige.create_text(150, 420, text = "Weiter", font = ("Elephant", 20), tags = "Weiter")
        self._Pausiert = True
        self.Warten()

    def Warten(self):
        if self._Pausiert == True:
            Anzeige.after(100, self.Warten)

    def Reset(self, event):
        Snake1._Leben = 0
        Snake2._Leben = 0
        Anzeige.delete(Snake1._Leben_Menge, Snake2._Leben_Menge)
        Snake1._Leben_Menge = Anzeige.create_text(Snake1._x_Lebensanzeige, 25, text = str(Snake1._Leben), font = ("Elephant", 20), fill = Snake1._color)
        Snake2._Leben_Menge = Anzeige.create_text(Snake2._x_Lebensanzeige, 25, text = str(Snake2._Leben), font = ("Elephant", 20), fill = Snake2._color)
        self._Punkte_Grün = 0
        self._Punkte_Rot = 0
        Anzeige.delete(self._Punkte_Grün_Anzeige, self._Punkte_Rot_Anzeige)
        self._Punkte_Grün_Anzeige = Anzeige.create_text(100, 510, text = self._Punkte_Grün, font = ("Chiller", 30))
        self._Punkte_Rot_Anzeige = Anzeige.create_text(200, 510, text = self._Punkte_Rot, font = ("Chiller", 30))
        if self._Turbo_Zähler_grün == 2:
            self._Turbo_grün_3 = Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 1:
            self._Turbo_grün_2 = Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 0:
            self._Turbo_grün_1 = Anzeige.create_rectangle(100, 580, 150, 590, fill = "green")
            self._Turbo_grün_2 = Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_rot == 2:
            self._Turbo_rot_3 = Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 1:
            self._Turbo_rot_2 = Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 0:
            self._Turbo_rot_1 = Anzeige.create_rectangle(100, 560, 150, 570, fill = "red")
            self._Turbo_rot_2 = Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        self._Turbo_Zähler_grün = 3
        self._Turbo_Zähler_rot = 3

    def Geschwindigkeit_einstellen_Press(self, event):
        self._Knopf_x = event.x
    def Geschwindigkeit_einstellen_Motion(self, event):
        delta_x = event.x - self._Knopf_x
        if 50 < event.x < 250:
            Anzeige.move(self._Knopf, delta_x, 0)
            Anzeige.delete(self._Geschwindigkeitszahl)
            self._Geschwindigkeitszahl = Anzeige.create_text(150, 370, text = str(event.x - 50), font = ("Arial", 15))
            Snake1._Geschwindigkeit = str(event.x - 50)
            Snake2._Geschwindigkeit = str(event.x - 50)
        self._Knopf_x = event.x

    def Nochmal(self, event):
        for item in canvas.find_all():
            canvas.delete(item)

        self._Speicher = ["L", "L", "L", "L"]

        Snake1._x = 500
        Snake1._y = 400
        Snake1._Richtung = "Right"
        Snake1._Check = False

        if self._Turbo_Zähler_grün == 2:
            self._Turbo_grün_3 = Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 1:
            self._Turbo_grün_2 = Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 0:
            self._Turbo_grün_1 = Anzeige.create_rectangle(100, 580, 150, 590, fill = "green")
            self._Turbo_grün_2 = Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_rot == 2:
            self._Turbo_rot_3 = Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 1:
            self._Turbo_rot_2 = Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 0:
            self._Turbo_rot_1 = Anzeige.create_rectangle(100, 560, 150, 570, fill = "red")
            self._Turbo_rot_2 = Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        self._Turbo_Zähler_grün = 3
        self._Turbo_Zähler_rot = 3
        
        Snake2._x = 300
        Snake2._y = 400
        Snake2._Richtung = "Left"
        Snake2._Check = False

        Snake1.Laufe()
        Snake2.Laufe()
        
        self.Leben()
        

    def Leben(self):
        self._x = random.randint(0, 798)
        self._y = random.randint(0, 798)
        self._Leben = canvas.create_rectangle(self._x, self._y, self._x, self._y, outline = "blue", fill = "blue")
        self._Speicher.insert(0, str(self._x) + "/" + str(self._y) + "Leben")
        self._Speicher.insert(1, str(self._x + 1) + "/" + str(self._y) + "Leben")
        self._Speicher.insert(2, str(self._x) + "/" + str(self._y + 1) + "Leben")
        self._Speicher.insert(3, str(self._x + 1) + "/" + str(self._y + 1) + "Leben")
        
    def Leben_eingesammelt(self):
        canvas.delete(self._Leben)
        del self._Speicher[:4]
        self.Leben()

fenster = Tk()
canvas = Canvas(fenster, width = 800, height = 800, background = "black")
Anzeige = Canvas(fenster, width = 300, height = 800, background = "white")

Spiel = Spiel()
Snake1 = Snake1()
Snake2 = Snake2()

canvas.pack(side = "left")
Anzeige.pack(side = "right")
fenster.mainloop()

Ich hoffe auf reichlich Feedback :wink:

Dark_Skorpion
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dark_Skorpion hat geschrieben:Ich hoffe auf reichlich Feedback :wink:
Ich habe nur ganz kurz daraufgeschaut (Pizza-Lieferdienst ist im Anflug, deshalb nur ein schnelles erstes Feedback), aber das reichte schon zum Erschrecken. :)

Die Klassen Snake1 und Snake2 sind sinnlos. Du solltest einfach zwei Instanzen von Snake erstellen und deren Attribute entsprechend setzen.

Grundsätzlich wissen deine Klassen zu viel über die Außenwelt. Du kannst Snake nicht einsetzen, wenn du auf globaler Ebene keinen Bezeichner namens "fenster" hast. Das gleiche gilt für die Klasse Spiel und "Anzeige".

Sternchen-Importe (From xyz import *) sind nicht schön. Man müllt sich damit den Namensraum zu.
Dark_Skorpion
User
Beiträge: 3
Registriert: Freitag 14. Februar 2014, 18:45

/me hat geschrieben: Grundsätzlich wissen deine Klassen zu viel über die Außenwelt. Du kannst Snake nicht einsetzen, wenn du auf globaler Ebene keinen Bezeichner namens "fenster" hast. Das gleiche gilt für die Klasse Spiel und "Anzeige".
Versteh ich nicht ganz... :K
BlackJack

@Dark_Skorpion: Ab Zeile 332 werden ein paar Namen auf Modulebene definiert auf die von den anderen Objekten einfach so zugegriffen wird. Damit sind die nicht so unabhängig von ihrer Umgebung wie sie sein sollten. Steck mal alles ab der Zeile in eine Funktion, dann wirst Du sehen, dass das Programm nicht mehr funktioniert.
Dark_Skorpion
User
Beiträge: 3
Registriert: Freitag 14. Februar 2014, 18:45

Also wäre das jetzt besser? :)

Code: Alles auswählen

from tkinter import *
import random


class Schlange1:

    def __init__(self, fenster, canvas, Anzeige):
        self._fenster = fenster
        self._canvas = canvas
        self._Anzeige = Anzeige
        self._Richtung = "Right"
        self._x = 500
        self._y = 400
        self._color = "red"
        self._Farbe = "Rot"
        self._Check = False
        self._Leben = 0
        self._x_Lebensanzeige = 200
        self._Geschwindigkeit = 30

        self._Leben_Menge = self._Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
        
        self._fenster.bind("<Right>", self.Right)
        self._fenster.bind("<Up>", self.Up)
        self._fenster.bind("<Left>", self.Left)
        self._fenster.bind("<Down>", self.Down)
        self.Laufe()

    def Right(self, event):
        self._Richtung = "Right"

    def Up(self, event):
        self._Richtung = "Up"

    def Left(self, event):
        self._Richtung = "Left"

    def Down(self, event):
        self._Richtung = "Down"
        
    def Laufe(self):
        global Spiel
        if self._Richtung == "Right":
            self._canvas.create_line (self._x, self._y, self._x + 2, self._y, fill = self._color, width = 1)
            self._x = self._x + 2

        if self._Richtung == "Up":
            self._canvas.create_line (self._x, self._y, self._x, self._y - 2, fill = self._color)
            self._y = self._y - 2

        if self._Richtung == "Left":
            self._canvas.create_line (self._x, self._y, self._x - 2, self._y, fill = self._color)
            self._x = self._x - 2

        if self._Richtung == "Down":
            self._canvas.create_line (self._x, self._y, self._x, self._y + 2, fill = self._color)
            self._y = self._y + 2

        self._Koordinate = str(self._x) + "/" + str(self._y)
        if self._Koordinate in Spiel._Speicher or self._x < 0 or self._x > 800 or self._y < 0 or self._y > 800:
            if self._Leben > 0:
                self._Leben -= 1
                self._Anzeige.delete(self._Leben_Menge)
                self._Leben_Menge = self._Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
                self._canvas.after(self._Geschwindigkeit, self.Laufe)
            else:
                self._Text = self._Farbe + " hat Verloren!"
                self._canvas.create_text(400, 400, text = self._Text, font = ("Arial", 70), fill = "white")
                Snake1._Check = True
                Snake2._Check = True
                Spiel.Punkte(self._Farbe)
        elif self._Check == False:
            if str(self._Koordinate + "Leben") in Spiel._Speicher:
                self._Leben += 1
                self._Anzeige.delete(self._Leben_Menge)
                self._Leben_Menge = self._Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
                Spiel.Leben_eingesammelt()
            Spiel._Speicher.append(self._Koordinate)
            if Spiel._Pausiert != True:
                self._canvas.after(self._Geschwindigkeit, self.Laufe)
            else:
                self.Pausiert()
            
    def Pausiert(self):
        if Spiel._Pausiert == True:
            self._canvas.after(100, self.Pausiert)
        else:
            self.Laufe()


class Schlange2:

    def __init__(self, fenster, canvas, Anzeige):
        self._fenster = fenster
        self._canvas = canvas
        self._Anzeige = Anzeige
        self._Richtung = "Left"
        self._x = 300
        self._y = 400
        self._color = "green"
        self._Farbe = "Grün"
        self._Check = False
        self._Leben = 0
        self._x_Lebensanzeige = 150
        self._Geschwindigkeit = 30

        self._Leben_Menge = self._Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
        
        self._fenster.bind("<d>", self.Right)
        self._fenster.bind("<w>", self.Up)
        self._fenster.bind("<a>", self.Left)
        self._fenster.bind("<s>", self.Down)
        self.Laufe()

    def Right(self, event):
        self._Richtung = "Right"

    def Up(self, event):
        self._Richtung = "Up"

    def Left(self, event):
        self._Richtung = "Left"

    def Down(self, event):
        self._Richtung = "Down"
        
    def Laufe(self):
        global Spiel
        if self._Richtung == "Right":
            self._canvas.create_line (self._x, self._y, self._x + 2, self._y, fill = self._color, width = 1)
            self._x = self._x + 2

        if self._Richtung == "Up":
            self._canvas.create_line (self._x, self._y, self._x, self._y - 2, fill = self._color)
            self._y = self._y - 2

        if self._Richtung == "Left":
            self._canvas.create_line (self._x, self._y, self._x - 2, self._y, fill = self._color)
            self._x = self._x - 2

        if self._Richtung == "Down":
            self._canvas.create_line (self._x, self._y, self._x, self._y + 2, fill = self._color)
            self._y = self._y + 2

        self._Koordinate = str(self._x) + "/" + str(self._y)
        if self._Koordinate in Spiel._Speicher or self._x < 0 or self._x > 800 or self._y < 0 or self._y > 800:
            if self._Leben > 0:
                self._Leben -= 1
                self._Anzeige.delete(self._Leben_Menge)
                self._Leben_Menge = self._Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
                self._canvas.after(self._Geschwindigkeit, self.Laufe)
            else:
                self._Text = self._Farbe + " hat Verloren!"
                self._canvas.create_text(400, 400, text = self._Text, font = ("Arial", 70), fill = "white")
                Snake1._Check = True
                Snake2._Check = True
                Spiel.Punkte(self._Farbe)
        elif self._Check == False:
            if str(self._Koordinate + "Leben") in Spiel._Speicher:
                self._Leben += 1
                self._Anzeige.delete(self._Leben_Menge)
                self._Leben_Menge = self._Anzeige.create_text(self._x_Lebensanzeige, 25, text = str(self._Leben), font = ("Elephant", 20), fill = self._color)
                Spiel.Leben_eingesammelt()
            Spiel._Speicher.append(self._Koordinate)
            if Spiel._Pausiert != True:
                self._canvas.after(self._Geschwindigkeit, self.Laufe)
            else:
                self.Pausiert()
            
    def Pausiert(self):
        if Spiel._Pausiert == True:
            self._canvas.after(100, self.Pausiert)
        else:
            self.Laufe()



class Game:

    def __init__(self, fenster, canvas, Anzeige):
        self._fenster = fenster
        self._canvas = canvas
        self._Anzeige = Anzeige
        self._Speicher = ["L", "L", "L", "L"]
        self._x = 0
        self._y = 0
        self._Geschwindigkeit = 30
        self._Pausiert = False
        self._Punkte_Rot = 0
        self._Punkte_Grün = 0
        self._Turbo_Zähler_rot = 3
        self._Turbo_Zähler_grün = 3

        self._Anzeige.create_text(50, 25, text = "Leben:", font = ("Elephant", 20))
        
        self._Anzeige.create_rectangle(50, 50, 250, 250, fill = "yellow", outline = "darkgreen", width = 5, tags = "Nochmal")
        self._Anzeige.create_text(150, 150, text = "NOCHMAL", font = ("Chiller", 40), tags = "Nochmal")
        self._Anzeige.tag_bind("Nochmal", "<1>", self.Nochmal)
        self._fenster.bind("<space>", self.Nochmal)

        self._Anzeige.create_text(150, 300, text = "Geschwindigkeit:", font = ("Elephant", 20))
        self._Anzeige.create_text(150, 330, text = "x1/1000 Sekunde pro Pixel", font = ("Arial", 10))
        self._Anzeige.create_line(50, 350, 250, 350)
        self._Geschwindigkeitszahl = self._Anzeige.create_text(150, 370, text = "30", font = ("Arial", 15))
        self._Knopf = self._Anzeige.create_rectangle(40 + self._Geschwindigkeit, 340, self._Geschwindigkeit + 60, 360, fill = "lightblue", tags = "Geschwindigkeitsregler")
        self._Anzeige.tag_bind("Geschwindigkeitsregler", "<1>", self.Geschwindigkeit_einstellen_Press)
        self._Anzeige.tag_bind("Geschwindigkeitsregler", "<B1-Motion>", self.Geschwindigkeit_einstellen_Motion)

        self._Anzeige.create_rectangle(220, 10, 290, 40, fill = "yellow", outline = "darkgreen", width = 3, tags = "Lebensreset")
        self._Anzeige.create_text(255, 25, text = "Reset", font = ("Arial", 18), tags = "Reset")
        self._Anzeige.tag_bind("Reset", "<ButtonPress-1>", self.Reset)

        self._Anzeige.create_rectangle(50, 400, 250, 440, fill = "yellow", outline = "darkgreen", width = 3, tags = "Pause")
        self._Pause = self._Anzeige.create_text(150, 420, text = "Pause", font = ("Elephant", 20), tags = "Pause")
        self._Anzeige.tag_bind("Pause", "<1>", self.Pause)
        self._fenster.bind("<p>", self.Pause)
        self._Anzeige.tag_bind("Weiter", "<1>", self.Weiter)
        self._fenster.bind("<Return>", self.Weiter)

        self._Anzeige.create_line(20, 490, 280, 490, width = 3)
        self._Anzeige.create_line(150, 470, 150, 530, width = 3)
        self._Anzeige.create_text(200, 480, text = "ROT", font = ("Elephant", 16), fill = "red")
        Anzeige.create_text(100, 480, text = "GRÜN", font = ("Elephant", 16), fill = "green")
        self._Punkte_Grün_Anzeige = self._Anzeige.create_text(100, 510, text = self._Punkte_Grün, font = ("Chiller", 30))
        self._Punkte_Rot_Anzeige = self._Anzeige.create_text(200, 510, text = self._Punkte_Rot, font = ("Chiller", 30))

        self._Anzeige.create_text(50, 570, text = "Turbo:", font = ("Elephant", 20))
        self._Turbo_rot_1 = self._Anzeige.create_rectangle(100, 560, 150, 570, fill = "red")
        self._Turbo_rot_2 = self._Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
        self._Turbo_rot_3 = self._Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        self._Turbo_grün_1 = self._Anzeige.create_rectangle(100, 580, 150, 590, fill = "green")
        self._Turbo_grün_2 = self._Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
        self._Turbo_grün_3 = self._Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        self._fenster.bind("<Shift_L>", self.Turbo_grün)
        self._fenster.bind("<0>", self.Turbo_rot)

        self.Leben()

    def Turbo_rot(self, event):
        global Snake1, Snake2
        if self._Turbo_Zähler_rot != 0:
            if Snake1._Geschwindigkeit > 20:
                Snake1._Geschwindigkeit -= 20
            else:
                Snake1._Geschwindigkeit = 1
            if self._Turbo_Zähler_rot == 3:
                self._Anzeige.delete(self._Turbo_rot_3)
            if self._Turbo_Zähler_rot == 2:
                self._Anzeige.delete(self._Turbo_rot_2)
            if self._Turbo_Zähler_rot == 1:
                self._Anzeige.delete(self._Turbo_rot_1)
            self._Turbo_Zähler_rot -= 1
            self._canvas.after(3000, self.Turbo_ende)

    def Turbo_grün(self, event):
        global Snake1, Snake2
        if self._Turbo_Zähler_grün != 0:
            if Snake2._Geschwindigkeit > 20:
                Snake2._Geschwindigkeit -= 20
            else:
                Snake2._Geschwindigkeit = 1
            if self._Turbo_Zähler_grün == 3:
                self._Anzeige.delete(self._Turbo_grün_3)
            if self._Turbo_Zähler_grün == 2:
                self._Anzeige.delete(self._Turbo_grün_2)
            if self._Turbo_Zähler_grün == 1:
                self._Anzeige.delete(self._Turbo_grün_1)
            self._Turbo_Zähler_grün -= 1
            self._canvas.after(3000, self.Turbo_ende)

    def Turbo_ende(self):
        global Snake1, Snake2
        Snake1._Geschwindigkeit = self._Geschwindigkeit
        Snake2._Geschwindigkeit = self._Geschwindigkeit

    def Punkte(self, Farbe):
        if Farbe == "Rot":
            self._Punkte_Grün += 1
        elif Farbe == "Grün":
            self._Punkte_Rot += 1
        self._Anzeige.delete(self._Punkte_Grün_Anzeige, self._Punkte_Rot_Anzeige)
        self._Punkte_Grün_Anzeige = self._Anzeige.create_text(100, 510, text = self._Punkte_Grün, font = ("Chiller", 30))
        self._Punkte_Rot_Anzeige = self._Anzeige.create_text(200, 510, text = self._Punkte_Rot, font = ("Chiller", 30))
        
            

    def Weiter(self, event):
        self._Pausiert = False
        self._Anzeige.delete(self._Pause)
        self._Pause = self._Anzeige.create_text(150, 420, text = "Pause", font = ("Elephant", 20), tags = "Pause")

    def Pause(self, event):
        self._Anzeige.delete(self._Pause)
        self._Pause = self._Anzeige.create_text(150, 420, text = "Weiter", font = ("Elephant", 20), tags = "Weiter")
        self._Pausiert = True
        self.Warten()

    def Warten(self):
        if self._Pausiert == True:
            self._Anzeige.after(100, self.Warten)

    def Reset(self, event):
        global Snake1, Snake2
        Snake1._Leben = 0
        Snake2._Leben = 0
        self._Anzeige.delete(Snake1._Leben_Menge, Snake2._Leben_Menge)
        Snake1._Leben_Menge = self._Anzeige.create_text(Snake1._x_Lebensanzeige, 25, text = str(Snake1._Leben), font = ("Elephant", 20), fill = Snake1._color)
        Snake2._Leben_Menge = self._Anzeige.create_text(Snake2._x_Lebensanzeige, 25, text = str(Snake2._Leben), font = ("Elephant", 20), fill = Snake2._color)
        self._Punkte_Grün = 0
        self._Punkte_Rot = 0
        self._Anzeige.delete(self._Punkte_Grün_Anzeige, self._Punkte_Rot_Anzeige)
        self._Punkte_Grün_Anzeige = self._Anzeige.create_text(100, 510, text = self._Punkte_Grün, font = ("Chiller", 30))
        self._Punkte_Rot_Anzeige = self._Anzeige.create_text(200, 510, text = self._Punkte_Rot, font = ("Chiller", 30))
        if self._Turbo_Zähler_grün == 2:
            self._Turbo_grün_3 = self._Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 1:
            self._Turbo_grün_2 = self._Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = self._Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 0:
            self._Turbo_grün_1 = self._Anzeige.create_rectangle(100, 580, 150, 590, fill = "green")
            self._Turbo_grün_2 = self._Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = self._Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_rot == 2:
            self._Turbo_rot_3 = self._Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 1:
            self._Turbo_rot_2 = self._Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = self._Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 0:
            self._Turbo_rot_1 = self._Anzeige.create_rectangle(100, 560, 150, 570, fill = "red")
            self._Turbo_rot_2 = self._Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = self._Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        self._Turbo_Zähler_grün = 3
        self._Turbo_Zähler_rot = 3

    def Geschwindigkeit_einstellen_Press(self, event):
        self._Knopf_x = event.x
    def Geschwindigkeit_einstellen_Motion(self, event):
        global Snake1, Snake2
        delta_x = event.x - self._Knopf_x
        if 50 < event.x < 250:
            self._Anzeige.move(self._Knopf, delta_x, 0)
            self._Anzeige.delete(self._Geschwindigkeitszahl)
            self._Geschwindigkeitszahl = self._Anzeige.create_text(150, 370, text = str(event.x - 50), font = ("Arial", 15))
            Snake1._Geschwindigkeit = str(event.x - 50)
            Snake2._Geschwindigkeit = str(event.x - 50)
        self._Knopf_x = event.x

    def Nochmal(self, event):
        global Snake1, Snake2
        for item in self._canvas.find_all():
            self._canvas.delete(item)

        self._Speicher = ["L", "L", "L", "L"]

        Snake1._x = 500
        Snake1._y = 400
        Snake1._Richtung = "Right"
        Snake1._Check = False

        if self._Turbo_Zähler_grün == 2:
            self._Turbo_grün_3 = self._Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 1:
            self._Turbo_grün_2 = self._Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = self._Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_grün == 0:
            self._Turbo_grün_1 = self._Anzeige.create_rectangle(100, 580, 150, 590, fill = "green")
            self._Turbo_grün_2 = self._Anzeige.create_rectangle(160, 580, 210, 590, fill = "green")
            self._Turbo_grün_3 = self._Anzeige.create_rectangle(220, 580, 270, 590, fill = "green")
        if self._Turbo_Zähler_rot == 2:
            self._Turbo_rot_3 = self._Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 1:
            self._Turbo_rot_2 = self._Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = self._Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        if self._Turbo_Zähler_rot == 0:
            self._Turbo_rot_1 = self._Anzeige.create_rectangle(100, 560, 150, 570, fill = "red")
            self._Turbo_rot_2 = self._Anzeige.create_rectangle(160, 560, 210, 570, fill = "red")
            self._Turbo_rot_3 = self._Anzeige.create_rectangle(220, 560, 270, 570, fill = "red")
        self._Turbo_Zähler_grün = 3
        self._Turbo_Zähler_rot = 3
        
        Snake2._x = 300
        Snake2._y = 400
        Snake2._Richtung = "Left"
        Snake2._Check = False

        Snake1.Laufe()
        Snake2.Laufe()
        
        self.Leben()
        

    def Leben(self):
        self._x = random.randint(0, 798)
        self._y = random.randint(0, 798)
        self._Leben = self._canvas.create_rectangle(self._x, self._y, self._x, self._y, outline = "blue", fill = "blue")
        self._Speicher.insert(0, str(self._x) + "/" + str(self._y) + "Leben")
        self._Speicher.insert(1, str(self._x + 1) + "/" + str(self._y) + "Leben")
        self._Speicher.insert(2, str(self._x) + "/" + str(self._y + 1) + "Leben")
        self._Speicher.insert(3, str(self._x + 1) + "/" + str(self._y + 1) + "Leben")
        
    def Leben_eingesammelt(self):
        self._canvas.delete(self._Leben)
        del self._Speicher[:4]
        self.Leben()

def Start():
    global Spiel, Snake1, Snake2
    fenster = Tk()
    canvas = Canvas(fenster, width = 800, height = 800, background = "black")
    Anzeige = Canvas(fenster, width = 300, height = 800, background = "white")

    Spiel = Game(fenster, canvas, Anzeige)
    Snake1 = Schlange1(fenster, canvas, Anzeige)
    Snake2 = Schlange2(fenster, canvas, Anzeige)

    canvas.pack(side = "left")
    Anzeige.pack(side = "right")
    fenster.mainloop()

Start()
BlackJack

@Dark_Skorpion: Du hast immer noch zwei Klassen für die beiden Schlangen. Das sollte eine Klasse sein die eine Schlange modelliert und von der dann zwei Exemplare erstellt werden. Der Code ist doch im Grunde der gleiche bei jeder Schlange, die Unterschiede bestehen nur aus Daten. Und die können beim erstellen eines Exemplars als Daten übergeben werden.

Das Schlüsselwort ``global`` solltest Du am besten vergessen. Damit gibt es dann ja wieder Namen auf Modulebene von denen anderer Code anscheinend abhängig ist.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Und bitte lagere doch so umfangreichen Quellcode in ein Paste-bin aus! Wir haben eines im Forum eingebaut (s. die Oberste Menüleiste) oder Du benutzt gist.github.com. Bei letzterem kannst Du Deinen Code sogar aktualisieren, sprich der Link zum Code bleibt stets derselbe.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten