Пример #1
0
class Pygammon:
    def __init__(self):
        self.Wuerfel = []  # enthält beide Würfelinstanzen
        self.Wuerfel.append(Wuerfel(-10.0, 6, 0.0, 1))
        self.Wuerfel.append(Wuerfel(-20.0, 6, 3.0, 0))

        self.Spielsteine = []  # Liste der Spielsteininstanzen
        self.Spielfelder = []  # Liste der Spielfeldinstanzen
        self.Spielbrett = Spielbrett()  # Erzeugung des Spielbretts

        self.Graphic = Graphic(self)  # Erzeugung der Graphikinstanz

        self.initGame()  # Spiel wird initialisiert

        self.spieler = {"black": Spieler(), "white": Spieler()}

        self.actSpieler = "black"

        self.wuerfeln()
        self.Graphic.initGL()  # Initialiserung der OpenGL-Komponente

        # self.gameRound()

    def initGame(self):
        # Wir legen nun erstmal alle nötigen Spielobjekte an
        # self.Spielbrett.laenge=20

        self.einspiel = {}
        self.einspiel["black"] = Spielfeld(-1.75, 0.0, 9.0, 0)
        self.einspiel["white"] = Spielfeld(-1.75, 0.0, -9.0, 24)
        self.ausspiel = {}
        self.ausspiel["black"] = Spielfeld(7.75, 0.0, -9.0, 24)
        self.ausspiel["black"].breite = 2.5
        self.ausspiel["white"] = Spielfeld(7.75, 0.0, 9.0, 0)
        self.ausspiel["white"].breite = 2.5

        self.Spielfelder.append(self.einspiel["white"])
        for i in range(6):
            self.Spielfelder.append(Spielfeld(5.4 + i * -1.20, 0.0, 9.0, len(self.Spielfelder)))
        for i in range(6):
            self.Spielfelder.append(Spielfeld(-2.9 + i * -1.20, 0.0, 9.0, len(self.Spielfelder)))
        for i in range(6):
            self.Spielfelder.append(Spielfeld(-8.95 + i * 1.20, 0.0, -9.0, len(self.Spielfelder)))
        for i in range(6):
            self.Spielfelder.append(Spielfeld(-0.6 + i * 1.20, 0.0, -9.0, len(self.Spielfelder)))
        self.Spielfelder.append(self.einspiel["black"])

        weisse = []
        schwarze = []

        for i in range(15):
            x = Spielstein(0.0, 0.0, 0.0, "black")
            self.Spielsteine.append(x)
            schwarze.append(x)

        for i in range(15):
            x = Spielstein(0.0, 0.0, 0.0, "white")
            self.Spielsteine.append(x)
            weisse.append(x)

        def giveWhite():
            i = weisse[0]
            weisse.remove(i)
            self.Graphic.weisseSteine.append(i)
            return i

        def giveBlack():
            i = schwarze[0]
            schwarze.remove(i)
            self.Graphic.schwarzeSteine.append(i)
            return i

        for i in range(2):
            self.Spielfelder[24].insertStein(giveWhite())
        for i in range(5):
            self.Spielfelder[19].insertStein(giveBlack())
        for i in range(3):
            self.Spielfelder[17].insertStein(giveBlack())
        for i in range(5):
            self.Spielfelder[13].insertStein(giveWhite())
        for i in range(5):
            self.Spielfelder[12].insertStein(giveBlack())
        for i in range(3):
            self.Spielfelder[8].insertStein(giveWhite())
        for i in range(5):
            self.Spielfelder[6].insertStein(giveWhite())
        for i in range(2):
            self.ausspiel["black"].insertStein(giveBlack())

    def whichField(self, stein):
        # Diese Methode prüft anhand der Koordinaten des gedraggten Spielsteins, über welchem Spielfeld er gerade liegt.
        # Die Prüfung, ob der Zug auf dieses Feld erlaubt ist, findet anderswo statt
        # Übergeben wird eine Spielsteininstanz
        print stein.koordinaten
        print stein.X
        for i in self.Spielfelder:
            if stein.Z < 0 and i.Z < 0:
                if stein.X - 0.2 < i.X and stein.X - 0.2 > i.X - i.breite:
                    return i
            elif stein.Z > 0 and i.Z > 0:
                if stein.X - 0.2 < i.X and stein.X - 0.2 > i.X - i.breite:
                    return i
        """        
        i=self.ausspiel['black']
        if stein.Z>0 and i.Z>0:        
              if stein.X-0.2<i.X and stein.X-0.2>i.X-i.breite:
                    return i

        i=self.ausspiel['white']
        if stein.Z<0 and i.Z<0:        
              if stein.X-0.2<i.X and stein.X-0.2>i.X-i.breite:
                    return i
        """
        print "Stein wurde über keinem Spielfeld abgelegt"

    def gameRound(self):
        # Diese Methode wird nach jedem Spielzug aufgerufen und prüft diverse Spielbedingungen

        # Checken wir, ob jemand gewonnen hat
        if self.spieler[self.actSpieler].wievielAusgespielt >= 15:
            # der Kerl hat gewonnen
            pass

        # Die Runde ist erst zuende, wenn beide Würfel benutzt wurden

        if self.Wuerfel[0].zahl == 0 and self.Wuerfel[1].zahl == 0 and not self.Graphic.gewurfelt:
            pass
        else:
            print "Gewuerfelt sind " + str(self.Wuerfel[0].zahl) + " und " + str(self.Wuerfel[1].zahl)
            return 0

        self.wuerfeln()

        if self.actSpieler == "black":
            self.actSpieler = "white"
            print "Spieler Weiss ist am Zug"
        else:
            self.actSpieler = "black"
            print "Spieler Schwarz ist am Zug"

    def checkAll(self, stein, feld):
        # Diese Methode wird aufgerufen, bevor ein Spielzug vom System akzeptiert wird.
        # Sie prüft, ob das Setzen des Steins nach den Spielregeln erlaubt ist

        if feld == None:
            return 0

        if (
            feld.size() >= 2
        ):  # checkt, ob das Zielfeld belegt ist; dazu muss nur der letzte Stein geprüft werden, wenn das Feld mehr oder gleich zwei Steine bereits beinhaltet
            if feld.Spielsteine[feld.size() - 1].farbe != stein.farbe:
                print "Spielfeld von anderem Spieler blockiert"
                return 0

        if (
            self.actSpieler == "black"
        ):  # je nachdem welcher spieler am zug ist durch negieren links-oder rechtsherum gehen
            wuerfel = [-self.Wuerfel[0].zahl, -self.Wuerfel[1].zahl]
        else:
            wuerfel = [self.Wuerfel[0].zahl, self.Wuerfel[1].zahl]

        zug = [stein.spielfeld.nr, feld.nr]

        print "Zug von Spielfeld " + str(stein.spielfeld.nr) + " nach Spielfeld " + str(feld.nr)
        weg = []  # liste mit moeglichen kombinationen die mit den gewuerfelten zahlen moeglich sind
        lenwuerfel = len(wuerfel)
        if lenwuerfel == 1:  ###
            weg.append([wuerfel[0]])  #
        elif lenwuerfel == 2:  #
            weg.append([wuerfel[0]])  #
            weg.append([wuerfel[1]])  # erstellen der liste weg, doppelte kombinationen werden nicht
            weg.append([wuerfel[0], wuerfel[1]])  # ausgeschlossen, dies wird spaeter behandelt
            weg.append([wuerfel[1], wuerfel[0]])  #
        else:  # wenn len(wuerfel)>2 ist wird von einem pasch ausgegangen
            for i in range(1, len(wuerfel) + 1):  #
                weg.append(wuerfel[0:i])

        zuglaenge = zug[0] - zug[1]  # betrag der laenge des weges von start nach ziel

        nWeg = []

        for i in wuerfel:  #
            if (
                i == zuglaenge
            ):  #  wegkombinationen mit denen das ziel von der laenge her nciht zu erreichen ist entfernen
                nWeg.append(i)  #
        weg = nWeg

        if len(weg):  ###
            for i in weg:  # sind immer noch erlaubte kombinationen uebrig, so werden die noetigen zuege fuer die
                if self.Wuerfel[0].zahl == abs(i):
                    self.Wuerfel[0].zahl = 0
                else:
                    self.Wuerfel[1].zahl = 0
                break
        else:
            print "Zielfeld nicht mit diesen Würfelzahlen erreichbar"
            return 0

        self.gameRound()
        return 1

    def wuerfeln(self):
        zahl1 = self.Wuerfel[0].wuerfeln()
        zahl2 = self.Wuerfel[1].wuerfeln()
        start_new_thread(wurfel_timer, (self.Graphic,))
        self.Graphic.gewurfelt = 1
        print "Gewuerfelt wurden " + str(zahl1) + " und " + str(zahl2)

    def checkAfter(self, stein):
        # Diese Methode soll einige Fälle prüfen, die nach dem Ziehen eines Steins eintreten können

        # Wir prüfen, ob ein Stein rausgeschubst wurde
        if stein.spielfeld.size() == 2:
            first = stein.spielfeld.Spielsteine[0]
            if first.farbe != stein.farbe:
                first.spielfeld.removeStein(first)
                self.einspiel[first.farbe].insertStein(first)

    def isDragable(self, stein):  # Diese Funktion überpüft, ob ein Stein bewegt werden kann
        if not stein.isDragable():
            return 0
        if not self.actSpieler == stein.farbe:
            return 0
        return 1