Frage dazu was im Code passiert

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Medds
User
Beiträge: 27
Registriert: Samstag 17. Oktober 2020, 19:19

Code: Alles auswählen

FARBEN = ['Herz', 'Karo', 'Kreuz', 'Pik']
RÄNGE = ['Ass', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'Bube', 'Dame', 'König']
karten_wert = {'Ass':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'Bube':10, 'Dame':10, 'König':10}

class Karte:
   def __init__(self, farbe, rang):
        self.farbe = farbe
        self.rang = rang
        
    def __repr__(self):
       return self.farbe + ' ' + self.rang
    
class Deck:
  def __init__(self):
        self.deck = []
        for farbe in FARBEN:
            for rang in RÄNGE:
                self.deck.append(Karte(farbe, rang))         
                                
                
    def mischen(self):
        random.shuffle(self.deck)    
        
        
    def austeilen(self):
        einzelkarte = self.deck.pop()
        return einzelkarte
    
    
    def __str__(self):
        return str(self.deck)      
    
class Hand:
   
    def __init__(self):
        self.karten = []    
        self.wert = 0       
        self.ass = False   
        
    def __str__(self):
        return str(self.karten)
    
    def karte_ziehen(self, karte): 
        self.karten.append(karte)

        if karte.rang == "Ass":
            self.ass = True
        self.wert += karten_wert[karte.rang]

    
Hallo liebes Forum,

leider hab ich wiedermal eine Frage die wahrscheinlich für alle sehr einfach sein wird. Was passiert in der letzten Zeile?
Also in der Zeile:

Code: Alles auswählen

self.wert += karten_wert[karte.rang]
Also genauer gefragt. Ich weiß woher das self.wert kommt und auch woher das karten_wert kommt. Aber ich verstehe nicht wie aus der karte (die später durch deck.austeilen() definiert wird) ein Dictionary wird (Wenn es überhaupt so ist). Also bei der Deck erstellung wird jede Karte einzeln geholt von der Klasse Deck, aber da wird das Deck nur so erstellt das es keinen Wert hat, sondern beispielsweise nur ein String "Herz 7" ist. Falls man das irgendwie in einem Satz erklären kann wie die karte zu seinem wert kommt, wäre ich sehr dankbar.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@Medds: da ist im Code so einiges Durcheinander. karten_wert sollte eine Konstante sein, also KARTEN_WERT. RÄNGE ist eigentlich überflüssig, weil das ja das selbe ist, wie die Schlüssel von KARTEN_WERT. __repr__ sollte eine Ausgabe für Debuggingzwecke sein, das was Karte.__repr__ macht, ist aber eher das, was Karte.__str__ machen sollte. Dagegen ist das bei Deck.__str__ und Hand.__str__ geht eher in Richtung __repr__, weil Du die Repräsentation einer Liste benutzt, dazu fehlt aber noch ein die Ausgabe der Klasse.

Code: Alles auswählen

import random
FARBEN = ['Herz', 'Karo', 'Kreuz', 'Pik']
KARTEN_WERTE = {'Ass':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, '10':10, 'Bube':10, 'Dame':10, 'König':10}

class Karte:
   def __init__(self, farbe, rang):
        self.farbe = farbe
        self.rang = rang
        
    def __str__(self):
       return f"{self.farbe} {self.rang}"

class Deck:
  def __init__(self):
        self.deck = []
        for farbe in FARBEN:
            for rang in KARTEN_WERTE:
                self.deck.append(Karte(farbe, rang))

    def mischen(self):
        random.shuffle(self.deck)

    def austeilen(self):
        return self.deck.pop()

    def __str__(self):
        return ', '.join(map(str, self.deck))

    
class Hand:   
    def __init__(self):
        self.karten = []
        self.wert = 0
        self.ass = False
        
    def __str__(self):
        return ', '.join(map(str, self.karten))
    
    def karte_ziehen(self, karte): 
        self.karten.append(karte)
        if karte.rang == "Ass":
            self.ass = True
        self.wert += KARTEN_WERTE[karte.rang]
Aus `karte` wird doch kein Wörterbuch. Wie kommst Du denn darauf? Eine Karte hat ein Attribut rang, das ist alles.
Medds
User
Beiträge: 27
Registriert: Samstag 17. Oktober 2020, 19:19

Scheint als wäre der Online Kurs den ich mache in sachen Syntax nicht der beste ist. Vielen Dank erstmal für die Antwort.
Werd mal langsam alles vergleichen und versuchen zu verstehen. Sind ja doch ein paar Änderungen die du gemacht hast.
Medds
User
Beiträge: 27
Registriert: Samstag 17. Oktober 2020, 19:19

Zu diesem korrigiertem Code hätte ich noch eine Frage.
Die Konstante RÄNGE wurde entfernt. Dazu hätte ich folgende Frage:

Code: Alles auswählen

class Deck:
  def __init__(self):
        self.deck = []
        for farbe in FARBEN:
            for rang in KARTEN_WERTE:
                self.deck.append(Karte(farbe, rang))
Ist hier das rang schon ein Wörterbuch? (Also z.b. 'Ass':1)
Wenn ja wieso wird der Wert in

Code: Alles auswählen

print(str(deck))
nicht mit ausgegeben?
Oder ist es so, dass mit rang

Code: Alles auswählen

for rang in KARTEN_WERTE:
    self.deck.append(Karte(farbe, rang))
nur der Schlüssel des Wörterbuchs abgerufen wird?

Beziehungsweise vielleicht anders gefragt, falls ich meine Frage unverständlich geschrieben habe:
Wieso gibt:

Code: Alles auswählen

return ', '.join(map(str, self.deck))
den Wert der Karte nicht mit aus?
Antworten