Seite 1 von 1

Snake Multiplayer Spiel

Verfasst: Freitag 14. Februar 2014, 19:16
von Dark_Skorpion
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

Re: Snake Multiplayer Spiel

Verfasst: Freitag 14. Februar 2014, 19:23
von /me
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.

Re: Snake Multiplayer Spiel

Verfasst: Freitag 14. Februar 2014, 19:41
von Dark_Skorpion
/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

Re: Snake Multiplayer Spiel

Verfasst: Freitag 14. Februar 2014, 20:19
von 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.

Re: Snake Multiplayer Spiel

Verfasst: Freitag 14. Februar 2014, 21:30
von Dark_Skorpion
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()

Re: Snake Multiplayer Spiel

Verfasst: Freitag 14. Februar 2014, 22:20
von 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.

Re: Snake Multiplayer Spiel

Verfasst: Samstag 15. Februar 2014, 09:52
von Hyperion
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.