Wpis z mikrobloga

#python #programowanie #programista15k

Czy da się stworzyć "dynamiczną" funkcje?
Mam np stworzoną funkcje def fight(warrior,goblin): i to pobiera tylko wartości z obiektów warrior i goblin, a chciałbym żeby funkcja reagowała na to, jaką klasę postaci wybierze gracz na początku i to jaki przeciwnik się wylosuje na danym etapie, bo przecież nie będę tworzył 80 tych samych funkcji ale tylko z innymi zmiennymi bo to robota głupiego i mało wydajna.

def warrior_fight(warrior,goblin):
core = 5 + (warrior.strenght * 2) + (warrior.magic * 2) + (warrior.agility * 1) - (warrior.defense * 2)
crit_chance = ri(0,1)
if crit_chance == 0:
print(goblin.health - core)
if crit_chance == 1:
core = core * 2
print(goblin.health - core)
warrior_fight(warrior,goblin)
  • 13
@harnasiek: zastanów się co się zmienia między klasami a co pozostaje takie same. To co pozostaje takie same licz w jednym miejscu (np w klasie abstrakcyjnej po której dziedziczy zarówno Warior jak i Goblin), to co się zmienia zależnie od klas licz w tych klasach, to co się zmienia zależnie od kombinacji klas - licz w oddzielnej funkcji (sugeruję żeby nie należała do żadnej z klas) i w niej rozpisz if-else
@tell_me_more: znaczy i tak tworząc ten projekt to działam na paru plikach żeby utrzymać porządek w kodzie i same wizualne uporządkowanie. Mam jedną ogólną klase Character ze statystykami i jedynie wypisanie ich oraz pobranie bounty z każdych podklas jeśli chodzi o potwory. A w drugim pliku to stworzenie obiektów, które będa istniały dalej w grze
ale dlaczego masz w tej funkcji

def warriorfight(warrior,goblin)

konkretnie walczenie z goblinem a nie z dowolnym potworem? Czy te linijki będą inne jak będziesz walczył z wilkiem?

if crit
chance == 0:
print(goblin.health - core)
if crit_chance == 1:
core = core * 2
print(goblin.health - core)

bo jak będą takie same, to zrób zamiast tego jedną funkcję:

def fight(warrior, monster):
core = 5 + (warrior.strenght * 2) + (warrior.magic *
@harnasiek: osobne klasy robi się jak masz inną logikę. Ta sama logika -> ta sama klasa. Czym różni się młody wilk od starego? Bardzo często zamiast osobnej klasy wystarczą inne parametry przekazane w konstruktorze

No i lepiej poczytać o https://en.wikipedia.org/wiki/Entity_component_system . Generalnie tworzenie klas do wszystkiego to słaby pomysł, bo tak źle modeluje się świat. Lepiej skupić się na tworzeniu klas pozwalających na osiągnięcie jakiegoś efektu (rysowanie na ekranie, zwracanie loota,
  • 0
@Saly no jedynie to mam dodatkowe klasy z dziedziczeniem klasy Character dla każdego potwora ze względu na różny drop, exp itp, żebykm szybciej mógł Akurat coś zmienić dla tylko np wilka i goblina bez szukania w całym kodzie
Entity Component System to na później jak już się nauczy jak działa dziedziczenie i polimorfizm, nie ma sensu zaczynać od tego jak gość pisze taki kod :)

Tutaj wystarczy 2 klasy: Character i Monster.

Character by miał metodę

def fight(self, monster):
core = 5 + (self.strenght * 2) + (self.magic * 2) + (self.agility * 1) - (self.defense * 2)
critchance = ri(0,1)
monster.reactToCrir(crit
chance, core)

a Monster:

def reactToCrit(self, crit