Problem z klasami (atrybutami) w małym projekcie - gra w karty

0

Mam prośbę byście spojrzeli na mój kod i wyjaśnili mi pewną sprawę. Kod ten jest częścią małego programu, który będzie grą w karty. Potworzyłem klasy i mam klasę Wojna_Hand(), który między innymi ma właściwość total liczącą wartość kart. Wartość ta jest obliczana na podstawie atrybutu RANKS klasy Card(), konkretnie jest to index listy. Wszystko fajnie działa jak karta jest od trójki wzwyż, ale dlaczego nie wyświetla się liczba punktów, dla karty "dwójki". Ona powinna mieć wartość 0.

class Hand(object):
    """ Ręka - wszystkie karty trzymane przez gracza. """
    def __init__(self):
        self.cards = []

    def __str__(self):
        if self.cards:
           rep = ""
           for card in self.cards:
               rep += str(card) + "\t"
        else:
            rep = "<pusta>"
        return rep

    def add(self, card):
        self.cards.append(card)

class Card(object):
    """ Karta do gry. """
    RANKS = ["2", "3", "4", "5", "6", "7", "8",
             "9", "10", "J", "Q", "K", "A"]
    SUITS = ["pik", "kier", "trefl", "karo"]

    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __str__(self):
        rep = self.rank + str(" ") + self.suit
        return rep

class Wojna_Card(Card):
    """ Karta do wojny. Ustawienie wartości kart. """

    @property
    def value(self):
        v = Wojna_Card.RANKS.index(self.rank)
        return v

class Wojna_Hand(Hand):
    """ Ręka w wojnie. """
    def __init__(self, name):
        super(Wojna_Hand, self).__init__()
        self.name = name

    def __str__(self):
        rep = self.name + ":\t" + super(Wojna_Hand, self).__str__()
        if self.total:
            rep += "(ma " + str(self.total) + " punktów)" 
        return rep

    @property
    def total(self):
        t = 0
        for card in self.cards:
            t += card.value
        return t 

card1 = Wojna_Card("3", "pik")
print("karta: " + str(card1) + ". Jej wartość wynosi: " + str(card1.value))

card2 = Wojna_Card("2", "kier")
print("karta: " + str(card2) + ". Jej wartość wynosi: " + str(card2.value))

reka = Wojna_Hand("Tomasz")
reka.add(card1)
print(reka)

reka = Wojna_Hand("Jan")
reka.add(card2)
print(reka)

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")
1

self.total wynosi 0, przez co warunek if self.total: nie jest spełniony, w wyniku czego rep += "(ma " + str(self.total) + " punktów)" nie jest wykonany.

0
CaliforniaDreaming napisał(a):

self.total wynosi 0, przez co warunek if self.total: nie jest spełniony

Dzięki wielkie. Ponad tydzień szukałem błędu, od momentu jak wychwyciłem, że coś jest nie tak. Myślałem, że to znów jakaś "dziwna" koncepcja w Pythonie, a tu taki szkolny błąd. Wiedziałem, że na kogoś zawsze można liczyć na tym forum:)

0


'''

                            Online Python Interpreter.
                Code, Compile, Run and Debug python program online.
Write your code in this editor and press "Run" button to execute it.

'''

class Hand: # nie programuj w python2 tylko w python3 (python2 ma tylko wsparcie do konca roku)
    """ Ręka - wszystkie karty trzymane przez gracza. """
    def __init__(self):
        self.cards = []

    def __str__(self):
        if self.cards:
           rep = ""
           for card in self.cards:
               rep += str(card) + "\t"
        else:
            rep = "<pusta>"
        return rep

    def add(self, card: "Card") -> None: # dodawaj typowanie argumentow i to co funkcja zwraca 
        self.cards.append(card)

class Card:
    """ Karta do gry. """
    RANKS = ["2", "3", "4", "5", "6", "7", "8",
             "9", "10", "J", "Q", "K", "A"]
    SUITS = ["pik", "kier", "trefl", "karo"]

    def __init__(self, rank, suit):
        self.rank = rank
        self.suit = suit

    def __str__(self):
        rep = f"{self.rank} {self.suit}" # poczytaj co to f stringi  :) 
        return rep

class WarCard(Card): # piszemy kod po angielsku. nazwy klas sa uppercase czyli WarCard nigdy War_Card to jest mic uppercase z snakecase
    """ Karta do wojny. Ustawienie wartości kart. """

    @property
    def value(self) -> int:
        value = WarCard.RANKS.index(self.rank)
        return value # co to znaczy v? staraj sie pisac doslowniej, bo kiedys sie zgubisz w wiekszysc kodzie

class WarHand(Hand): # tu tak samo jak wyzej
    """ Ręka w wojnie. """
    def __init__(self, name):
        super().__init__() # w python3 nie musisz do super przekazywac klasy 
        self.name = name

    def __str__(self):
        rep = f"{self.name}    {super(WarHand, self).__str__()}"
        if self.total:
            rep += f"(ma {self.total} punktów)"
        return rep

    @property
    def total(self) -> int:
        t = 0
        for card in self.cards:
            t += card.value
        return t 

card1 = WarCard("3", "pik")
print("karta: " + str(card1) + ". Jej wartość wynosi: " + str(card1.value))

card2 = WarCard("2", "kier")
print("karta: " + str(card2) + ". Jej wartość wynosi: " + str(card2.value))

reka = WarHand("Tomasz")
reka.add(card1)
print(reka)

reka = WarHand("Jan")
reka.add(card2)
print(reka)

input("\n\nAby zakończyć program, naciśnij klawisz Enter.")

dalem Ci pare wskazowek plus tutaj WarHand/WarCard jest zbedne i dziedziczenie po Hand/Card mozesz spokojnie w tych klasach te metody z War klas przeniesc

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0