Prośba o ocenę kodu

Prośba o ocenę kodu
K1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1
0

Poniżej wklejam mój kod. Co o nim sadzicie? Jest OK? Co i jak można poprawić?

Kopiuj
import random

class OrganizmAkwariowy:
    def __init__(self, nazwa, zdrowie):
        self._nazwa = nazwa
        self._zdrowie = zdrowie

    def rosnij(self):
        self._zdrowie += 1
        print(f"{self._nazwa} rośnie. Zdrowie: {self._zdrowie}")

    def odzywiaj_sie(self, ofiara=None):
        pass

    def pokaz_zdrowie(self):
        return self._zdrowie

    def pokaz_nazwe(self):
        return self._nazwa

class RoslinaWodna(OrganizmAkwariowy):
    def rosnij(self):
        self._zdrowie += 1
        print(f"Roślina {self._nazwa} rośnie. Zdrowie: {self._zdrowie}")

    def odzywiaj_sie(self, _=None):
        pass

class RybkaRoslinozerna(OrganizmAkwariowy):
    def rosnij(self):
        self._zdrowie += 2
        print(f"{self._nazwa} rośnie (roślinożerna). Zdrowie: {self._zdrowie}")

    def odzywiaj_sie(self, roslina):
        if isinstance(roslina, RoslinaWodna):
            self._zdrowie += 3
            print(f"{self._nazwa} zjada roślinę {roslina._nazwa}. Zdrowie: {self._zdrowie}")

class RybkaDrapiezna(OrganizmAkwariowy):
    def rosnij(self):
        self._zdrowie += 3
        print(f"{self._nazwa} rośnie (drapieżna). Zdrowie: {self._zdrowie}")

    def odzywiaj_sie(self, ofiara):
        if isinstance(ofiara, RybkaRoslinozerna) and ofiara._zdrowie > 0:
            self._zdrowie += 5
            ofiara._zdrowie = 0
            print(f"{self._nazwa} zjada {ofiara._nazwa}. Zdrowie: {self._zdrowie}")

rosliny = [RoslinaWodna(f"Roślina{i}", random.randint(5, 10)) for i in range(3)]
ryby_roslinozerne = [RybkaRoslinozerna(f"Roślinożerna{i}", random.randint(5, 10)) for i in range(2)]
ryby_drapiezne = [RybkaDrapiezna(f"Drapieżna{i}", random.randint(5, 10)) for i in range(1)]

for cykl in range(3):
    print(f"\n--- Cykl {cykl + 1} ---")

    for r in rosliny:
        r.rosnij()

    for ryba in ryby_roslinozerne:
        ryba.rosnij()
        if rosliny:
            roslina = random.choice(rosliny)
            ryba.odzywiaj_sie(roslina)

    for drapieznik in ryby_drapiezne:
        drapieznik.rosnij()
        if ryby_roslinozerne:
            ofiara = random.choice(ryby_roslinozerne)
            if ofiara.pokaz_zdrowie() > 0:
                drapieznik.odzywiaj_sie(ofiara)

print("\n--- Stan końcowy ---")
for organizm in rosliny + ryby_roslinozerne + ryby_drapiezne:
    print(f"{organizm.pokaz_nazwe()}: zdrowie = {organizm.pokaz_zdrowie()}")
lion137
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 5023
2

Polskie nazwy nie są Ok i testów nie ma, skąd wiesz, że to działa?

kiyo
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: JVM
  • Postów: 179
3
Kopiuj
print(f"{self._nazwa} rośnie. Zdrowie: {self._zdrowie}")

Nie odwoływałbym się bezpośrednio przez nazwę pola _nazwa tylko przez metodę pokaz_nazwe()

Kopiuj
print(f"{self.pokaz_nazwe()} rośnie. Zdrowie: {self.pokaz_zdrowie()}")

przy ewentualnej zmianie łatwiej będzie zmienić implementację jednej metody.

  1. RoslinaWodna.odzywiaj_sie można wywalić. Metoda jest dziedziczona z OrganizmAkwariowy gdzie już jest pusta.
Kopiuj
if ofiara.pokaz_zdrowie() > 0:
    drapieznik.odzywiaj_sie(ofiara)

Drapieżnik tutaj próbuje zjeść roślinożercę tylko wtedy jeśli ma zdrowie > 0 dodałbym jakiegoś else'a, żeby obsłużyć sytuację kiedy roślinożerca był już martwy.

  1. Dodałbym metodę, która będzie jasno mówiła, czy organizm żyje bo niby zdrowie = 0 to martwy, ale nie zawsze jest to oczywiste.
Kopiuj
def czy_zyje(self):
    return self._zdrowie > 0
  1. Brakuje obsługi sytuacji, gdy brakuje roślin lub ofiar
  2. Poprawiłbym też losowanie bo teraz możesz też wybrać losowo martwą ofiarę.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.