i

Lösungsbeispiel für die Klasse Frontend

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.

Die hier gezeigte Frontendklasse ist insbesondere bei der Ausgabe so einfach wie möglich gehalten, um den Code nicht unnötig aufzublähen. Auch bringt ein schöneres Frontend nicht unbedingt ein besser gelungenes Projekt oder Technikverständnis. Daher kann diese Klasse alles, was für ein einfaches Bauernschach wichtig ist, aber auch nicht mehr!

Auflösung der Klasse Frontend: Code (Mit einigen Tests)
class Frontend():
    def eingabeFordern(self, farbe):
        #Fordert vom Benutzer die Zugeingabe ein und schreibt diese in den String eingabe. 
        eingabe = ""
        print("Eingabeformat für Züge Beispiel: A2-A3")
        if farbe == "weiß":
            eingabe = input("Weiß ist am Zug, bitte gebe den Zug ein: ")
        else:
            eingabe = input("Schwarz ist am Zug, bitte gebe den Zug ein: ")

        return eingabe
        
    def eingabeParsen(self, eingabe):
        #Prüft ob die Eingabe ein gültiges Format darstellt
        #Erweiterungsmöglichkeit: Eingaben auch mit Kleinbuchstaben oder anderen Trennzeichen tolierieren

        """
        >>> f = Frontend()
        >>> f.eingabeParsen("A0-B1")
        False
        >>> f.eingabeParsen("C7-B1")
        True
        >>> f.eingabeParsen("A1-B1")
        True
        >>> f.eingabeParsen("X")
        False
        >>> f.eingabeParsen("")
        False        
        >>> f.eingabeParsen(" ")
        False        
        >>> f.eingabeParsen("     ")
        False        
        >>> f.eingabeParsen("A3-X")
        False
        >>> f.eingabeParsen("XDDDSDSDERLKFLSSF")
        False        
        >>> f.eingabeParsen("Z3-X9")
        False        
        >>> f.eingabeParsen("Z3-A1")
        False       
        >>> f.eingabeParsen("A9-B4")
        False         
        >>> f.eingabeParsen("A2+B1")
        False        
        >>> f.eingabeParsen(111)
        False

        """
        if type(eingabe) == str:
            if len(eingabe) == 5:
                a = eingabe[0]
                b = eingabe[3]
                c = eingabe[2]
                d = eingabe[1]
                e = eingabe[4]
                if a == "A" or a == "B" or a == "C" or a == "D" or a == "E" or a == "F" or a == "G" or a == "H":
                    if b=="A" or b=="B" or b=="C" or b=="D" or b=="E" or b=="F" or b=="G" or b=="H":
                        if d=="1" or d=="2" or d=="3" or d=="4" or d=="5" or d=="6" or d=="7" or d=="8":
                            if e=="1" or e=="2" or e=="3" or e=="4" or e=="5" or e=="6" or e=="7" or e=="8":
                                if c == "-":
                                    return True
        return False

    def buchstabenKonvert(self, buchstabe):
        #konvertiert einen eingegebenen Buchstaben in eine für das Backend lesbare X-Koordinate auf dem Schachfeld

        """
        >>> f = Frontend()
        >>> f.buchstabenKonvert("1")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.buchstabenKonvert("A")
        0
        >>> f.buchstabenKonvert("AA")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.buchstabenKonvert(1)
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.buchstabenKonvert("11")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.buchstabenKonvert("a")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.buchstabenKonvert("A2+B1")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        """

        if type(buchstabe) == str:
            if buchstabe == "A":
                return 0
            if buchstabe == "B":
                return 1
            if buchstabe == "C":
                return 2
            if buchstabe == "D":
                return 3
            if buchstabe == "E":
                return 4
            if buchstabe == "F":
                return 5
            if buchstabe == "G":
                return 6
            if buchstabe == "H":
                return 7
        raise ValueError('Ungültiger Wert')

    def ziffernKonvert(self, z):
        #konvertiert eine eingegebenen Ziiffer in eine für das Backend lesbare Y-Koordinate auf dem Schachfeld

        """
        >>> f = Frontend()
        >>> f.ziffernKonvert("1")
        0
        >>> f.ziffernKonvert("8")
        7
        >>> f.ziffernKonvert("11")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.ziffernKonvert("a")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.ziffernKonvert("9")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.ziffernKonvert(1)
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        >>> f.ziffernKonvert("A2+B1")
        Traceback (most recent call last):
         ...
        ValueError: Ungültiger Wert
        """

        if type(z) == str:
            if z=="1" or z=="2" or z=="3" or z=="4" or z=="5" or z=="6" or z=="7" or z=="8":
                zI = int(z)
                zI = zI-1
                return zI
        raise ValueError('Ungültiger Wert')

    def eingabeKonvert(self, eingabe):
        #Konvertiert die Benutzereingabe in ein 4-er Koordinaten-Tupel (übliche Zugdarstellung im Backend)
        zug0 = self.buchstabenKonvert(eingabe[0])
        zug1 = self.ziffernKonvert(eingabe[1])
        zug2 = self.buchstabenKonvert(eingabe[3])
        zug3 = self.ziffernKonvert(eingabe[4])
        zug = (zug0, zug1, zug2, zug3)
        return zug

    def zugEingabeVeranlassen(self, farbe):
        #ruft die entsprechenden Methoden im Frontend zum einholen, parsen und konvertieren der Eingabe auf, 
        #gibt die fertige Eingabe dann als 4er-Tupel zurück. 
        roh = self.eingabeFordern(farbe)
        if(self.eingabeParsen(roh)):
            zug = self.eingabeKonvert(roh)
            return zug
        else:
            return (-1, -1, -1, -1)
    
    def darstellen(self, brett, geschlageneFiguren):
        #Wir bekommen hier ein 2D-BrettArray und eine Liste mit den geschlagenen Figuren, das müssen wir nur noch darstellen
        visualBrett = [[0]*9 for _ in range(9)]
        feldFarbe = 0
        for i in range(1,9):
            for j in range(1,9):
                if feldFarbe%2 == 0:
                    visualBrett[i][j] = '\u25AF'
                else: 
                    visualBrett[i][j] = '\u25AE'
                feldFarbe = feldFarbe+1
                if brett[i-1][j-1] != 0:
                    farbe = brett[i-1][j-1].getFarbe()
                    if farbe == "weiß":
                        visualBrett[i][j] = "W"
                    else:
                        visualBrett[i][j] = "S"
            feldFarbe = feldFarbe+1             

        for i in range(1,9):
            visualBrett[0][i] = i
        
        visualBrett[0][0] = " "    
        visualBrett[1][0] = "A"
        visualBrett[2][0] = "B"
        visualBrett[3][0] = "C"
        visualBrett[4][0] = "D"
        visualBrett[5][0] = "E"
        visualBrett[6][0] = "F"
        visualBrett[7][0] = "G"
        visualBrett[8][0] = "H"

        for i in range(8,-1,-1):
            print(visualBrett[0][i], visualBrett[1][i], visualBrett[2][i], visualBrett[3][i], visualBrett[4][i], visualBrett[5][i], visualBrett[6][i], visualBrett[7][i], visualBrett[8][i])
                
        end = len(geschlageneFiguren)
        weißGeschlagen = 0
        schwarzGeschlagen = 0
        for i in range(0,end):
            figur = geschlageneFiguren.pop()
            if figur.getFarbe() == "weiß":
                weißGeschlagen = weißGeschlagen + 1
            else:
                schwarzGeschlagen = schwarzGeschlagen + 1
        
        print("Geschlagene weiße Bauern: " + str(weißGeschlagen))
        print("Geschlagene schwarze Bauern: " + str(schwarzGeschlagen))


    def rueckmeldungGeben(self, meldung):
        print(meldung)

"""    
f = Frontend()
rohEingabe = f.eingabeFordern(True)
eingabe = [[0,0],[0,0]]
print(rohEingabe)
print(f.eingabeParsen(rohEingabe))
if (f.eingabeParsen(rohEingabe)):
    eingabe = f.eingabeKonvert(rohEingabe)
    print(eingabe)
else:
    print("ungültige Eingabe")
if not(f.zugUnbewegt(eingabe)):
    print("ungültiger Zug")
"""

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

Quellen

Suche

v
9.4.4.2.4.1.6
https://inf-schule.de/software/ScrumSchach/DerErsteSprint/Durchfuehrung/ModellierungFrontend_Main/lernstrecke/schritt6
https://inf-schule.de/9.4.4.2.4.1.6
https://inf-schule.de/@/page/SweMbiQt84EaPUcQ

Rückmeldung geben