i

Lösungsbeispiel für die Klasse Figur

ACHTUNG: Spoiler Alarm!

Diese Seite solltet ihr in der Regel schnellstmöglich weiterklicken! Sie dient vor allem eurer Lehrkraft bzw. eurem Scrum Master als mögliche Hilfestellung, damit dieser euch mit fundierten Hinweisen und Tipps versorgen kann. Auf keinen Fall solltet ihr von hier abschreiben, oder euch diese Lösungen auch nur "mal eben kurz" anschauen!

Diese Lösung ist natürlich auch nicht als das einzig und universell richtige Produkt zu verstehen. Eure spezifischen User Stories können durchaus strukturelle Änderungen an dem hier gezeigten Code erfordern. Der hier gezeigte Code ist eine einfache Bauernschachimplementierung mit En Passant und dem Gedanken an eine spätere Erweiterung auf vollständiges Schach. Es sind jedoch keine Extras oder Zusatzfeatures wie Bedenkzeitlimit oder Zugzurücknahme implementiert, um den Code möglichst einfach, übersichtlich und universell zu halten. Auch ist diese Version nicht an die vereinfachte Implementierung des Backend angepasst. Euer Scrum Master wird den Code trotzdem verstehen.

Auflösung Code (Mit einigen Tests)
class Figur():    
    def __init__(self, position, farbe):
        self.positionX = position[0]
        self.positionY = position[1]
        self.farbe = farbe
    
    def schlagen(self):
        self.positionX = -1
        self.positionY = -1

    def zug_Validieren(self, position2, brett, letzterZug):
        raise NotImplementedError("Methode nicht implementiert!")
        
    def ziehen(self, position2, brett, letzterZug):
            valid = self.zug_Validieren(position2, brett, letzterZug)
            if valid[0]:
                self.positionX = position2[0]
                self.positionY = position2[1]
                if valid[1] == (-1, -1):
                    return True
                else:
                    zuSchlagen = valid[1]
                    zuSchlagenX = zuSchlagen[0]
                    zuSchlagenY = zuSchlagen[1]
                    brett[zuSchlagenX][zuSchlagenY].schlagen()
                    return True
            else:
                return False

            #der eigentliche Zugvorgang. Das ist die Methode die vom Backend zum ziehen aufgerufen wird. 
            #Diese Methode ruft natürlich zuerst die Validieren-Methode auf, dannach führt sie den Zug durch
            #Diese Methode ruft auch das schlagen der jeweiligen in der evtl. zu schlagenden gegnerischen Figurinstanz auf. 
            #Da diese Methode für viele Figuren gleich sein wird (aber für Bauer und König? wegen Sonderfällen (z.B. letzterZug/Rochade) anders?), 
            #überschreiben wir die Methode aus der Superklasse hier aktuell.Eventuell ist das aber auch eher was für die Superklasse und der letzteZug wird halt von allen außer Bauer ignoriert. 
            #Vorteil ist dann, wir sparen Redundanz und sowohl das trennen von ziehen und Validieren, als auch Vererbung schaffen Übersicht, Abstraktion und vermeiden Redundanz. 
            #außerdem wird hier natürlich die Variable letzterZug entsprechend überschrieben. 

    def getPosition(self):
        position = (self.positionX, self.positionY)
        return position
    
    def getFarbe(self):
        return self.farbe
    
    
class Bauer(Figur):
    def __init__(self, position, farbe):
        super().__init__(position, farbe)

    def zug_Validieren(self, position2, brett, letzterZug):
        """
        >>> b1w = Bauer((1,1), "weiß")
        >>> b2w = Bauer((2,6), "weiß")
        >>> b1s = Bauer((6,5), "schwarz")
        >>> b11s = Bauer((7,6), "schwarz")
        >>> brett1 = [[0]*8 for _ in range(8)]
        >>> brett1[1][1] = b1w
        >>> brett1[2][6] = b2w
        >>> brett1[6][5] = b1s
        >>> brett1[7][6] = b11s
        >>> letzterzug1 = (2,6,2,7)

        >>> b2s = Bauer((1,2), "schwarz")
        >>> b3s = Bauer((2,2),"schwarz")
        >>> b3w = Bauer((0,2),"weiß")
        >>> brett2 = [[0]*8 for _ in range(8)]
        >>> brett2[1][1] = b1w
        >>> brett2[1][2] = b2s
        >>> brett2[2][2] = b3s
        >>> brett2[0][2] = b3w
        >>> letzterzug2 = (1,3,1,2)

        >>> b4w = Bauer((5,4),"weiß")
        >>> b4s = Bauer((4,4),"schwarz")
        >>> b5w = Bauer((6,4),"weiß")
        >>> brett3 = [[0]*8 for _ in range(8)]
        >>> brett3[5][4] = b4w
        >>> brett3[4][4] = b4s
        >>> brett3[6][4] = b5w
        >>> letzterzug3 = (4,6,4,4)
        >>> letzterzug4 = (-1,-1,-1,-1)
        >>> letzterzug5 = (4,5,4,4)

        >>> b1w.zug_Validieren((1,2), brett1, letzterzug1)
        (True, (-1, -1))
        >>> b1w.zug_Validieren((0,2), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((2,1), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((3,1), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((1,3), brett1, letzterzug1)
        (True, (-1, -1))
        >>> b1w.zug_Validieren((4,1), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((0,2), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((9,9), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((0,0), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b2w.zug_Validieren((4,7), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b2w.zug_Validieren((2,7), brett1, letzterzug1)
        (True, (-1, -1))
        >>> b1s.zug_Validieren((6,2), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1s.zug_Validieren((0,2), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1s.zug_Validieren((6,4), brett1, letzterzug1)
        (True, (-1, -1))
        >>> b11s.zug_Validieren((7,4), brett1, letzterzug1)
        (True, (-1, -1))
        >>> b1s.zug_Validieren((2,1), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1s.zug_Validieren((0,2), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1s.zug_Validieren((9,9), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1s.zug_Validieren((0,0), brett1, letzterzug1)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((1,2), brett2, letzterzug2)
        (False, (-1, -1))        
        >>> b1w.zug_Validieren((1,3), brett2, letzterzug2)
        (False, (-1, -1))
        >>> b1w.zug_Validieren((2,2), brett2, letzterzug2)
        (True, (2, 2))
        >>> b1w.zug_Validieren((0,2), brett2, letzterzug2)
        (False, (-1, -1))
        >>> b3s.zug_Validieren((1,1), brett2, letzterzug2)
        (True, (1, 1))
        >>> b4w.zug_Validieren((4,5), brett3, letzterzug3)
        (True, (4, 4))
        >>> b4w.zug_Validieren((4,5), brett3, letzterzug4)
        (False, (-1, -1))
        >>> b4w.zug_Validieren((4,5), brett3, letzterzug5)
        (False, (-1, -1))        
        >>> b4w.zug_Validieren((6,5), brett3, letzterzug3)
        (False, (-1, -1))        
        >>> b1w.zug_Validieren((1,1), brett1, letzterzug3)
        (False, (-1, -1))

        >>> b1w.ziehen((1,2), brett1, letzterzug4)
        True
        """

        position2X = position2[0]
        position2Y = position2[1]

        abstandY = position2Y-self.positionY
        abstandX = position2X-self.positionX      
      
        #Längszüge, Fälle 1 und 2 mit leerem Zielfeld
        if abstandX == 0 and brett[position2X][position2Y] == 0:
            if self.farbe == "weiß":
                if abstandY == 2 and self.positionY == 1 and brett[position2X][position2Y-1] == 0:
                    return (True, (-1,-1))
                    #Längszug, Züge über zwei Felder werden nur auf der Startposition für jeweils weiße und schwarze Bauern geduldet
                elif abstandY == 1:
                    return (True, (-1,-1))
                #Normaler Längszug
                else:
                    return (False, (-1,-1))
            else:
                if abstandY == -2 and self.positionY == 6 and brett[position2X][position2Y+1] == 0:
                    return (True, (-1,-1))
                    #Längszug, Züge über zwei Felder werden nur auf der Startposition für jeweils weiße und schwarze Bauern geduldet
                elif abstandY == -1:
                    return (True, (-1,-1))
                    #Normaler Längszug. 
                else:
                    return (False, (-1,-1))

        #hier müssen Fälle 3 und 4 rein, für das schlagen. Wie organisieren wir die für weiße bzw. schwarze Bauern sinnvoll?
        if abstandX == 1 or abstandX == -1:
            if abstandY == 1 and self.farbe == "weiß" or abstandY == -1 and self.farbe == "schwarz":
                if brett[position2X][position2Y] != 0 and brett[position2X][position2Y].getFarbe() != self.farbe:
                    return (True, (position2X,position2Y))
                    #Fall 3 – es wird normal geschlagen. 
                elif brett[position2X][position2Y] == 0 and brett[position2X][self.positionY] != 0 and brett[position2X][self.positionY].getFarbe() != self.farbe and isinstance(brett[position2X][self.positionY], Bauer):
                    positionGlY = letzterZug[1]
                    abstandGY = self.positionY - positionGlY
                    if abstandGY == 2 and brett[position2X][self.positionY].getFarbe() == "weiß" or abstandGY == -2 and brett[position2X][self.positionY].getFarbe() == "schwarz":
                        return (True, (position2X,self.positionY))
                    #Fall 4 – En Passent. 
                else: 
                    return (False, (-1,-1))
            else:
                return (False, (-1,-1))
            #wenn Bauern 1 Feld quer ziehen dann auch ein Feld längs und nur zum schlagen
        return (False, (-1,-1))
        #Fall für Abstand Quer < 0 oder Zielfeld bei nicht-schlagen belegt

if __name__ == "__main__":
    import doctest
    doctest.testmod(verbose=True)
            
        
Auflösung Klassendiagramm

Quellen

Suche

v
9.4.4.2.2.1.8
https://inf-schule.de/software/ScrumSchach/DerErsteSprint/Durchfuehrung/ModellierungBackend_KLEIN/lernstrecke/schritt8
https://inf-schule.de/9.4.4.2.2.1.8
https://inf-schule.de/@/page/W30feVaN4nIe0JKp

Rückmeldung geben