Pomysł na listę obiektów (stworów etc.), na wzór, której można tworzyć faktyczne obiekty

0

Witam. Coś mnie tknęło, nudzę się i zacząłem pisać mini RPG w konsoli. Nie wiem jak porządnie to zaimplementować, mianowicie chciałbym zrobić jakoś listę potworów występujących w grze czyli np.: wilk, troll, demon itd. To mają być "obiekty" wzorcowe, czyli wilk ma ileś tam życia, demon trochę więcej i na podstawie takich predefiniowanych obiektów tworzyć faktyczne, które są już konkretnym stworem łażącym po mojej planszy itd. Myślę, myślę i tylko wymyśliłem stały obiekt wzorcowy, którego będę klonować. Hmm, imo głupie rozwiązanie, wymyśliłem też każdy potwór ma swoją klasę - też zły pomysł, 50 potwórów = 50 klas i praktycznie każda ma to samo, tylko inne wartości. No i 3., że będę miał znów stały obiekt trzymający dane jednego stwora i w konstruktorze klasy głównej stwora, będę sprawdzał if'ami nazwy, jeżeli "wolf" to przypisuje odpowiednie wartości jak stały obiekt wolf ma.

Tyle opisu. W sumie każda gra takie coś musi mieć. Proszę was i jakieś pomysły jak to można wykonać, może ktoś już coś podobnego robił? Z góry dziękuję za pomoc.

1
  1. Wywal obiekt wzorcowy, albo zmień nazwę na CreatureFactory lub coś. Bo to fabryka obiektów powinna być, która tworzy odpowiednie obiekty w zależności od parametrów
  2. 50 klas dla różnych potworów dziedziczących po jednej klasie to wcale nie jest zły pomysł. Mogą mieć co prawda takie same właściwości, ale różne zachowania. Jest to zgodne z zasadami OOP.
2

W "prawdziwych" grach, przy takiej ilości obiektów, najczęściej porzuca się statyczne, mocne typowanie na rzecz dynamicznego ładowania typów obiektów z pliku, np. XML. Jeżeli oprócz parametrów mają się one czymś różnić (akcje) to oskryptowuje się je oddzielnie (np. poprzez LUA).

0

Dziękuję za odpowiedzi, poradziłem sobie mniej więcej tak: mam klasę Creature i w konstruktorze wstawiam stały obiekt, który reprezentuje danego potwora (taki ala enum):

new Creature(Monsters.Wolf, new Point(10, 15));
new Creature(Monsters.Demon, new Point(5, 5));
// itd.

Z ciekawości chyba zajrzę ponownie do kodu silnika serwera do T... Tibii :)

0
Sarrus napisał(a)

50 klas dla różnych potworów dziedziczących po jednej klasie to wcale nie jest zły pomysł. Mogą mieć co prawda takie same właściwości, ale różne zachowania. Jest to zgodne z zasadami OOP.

To jest glupi pomysl moim zdaniem. Lepiej napisac obiekt ktoremu bedzie mozna definiowac wlasciwosci i zachowania a pozniej dopiero tworzyc rozne rodzaje stworkow. Chodzi o to zeby za kazdym razem nie kompilowac programu przy dodawaniu nowego rodzaju stworka, wtedy wrzucimy do programu tylko opis stworka w formie np. pliku a reszta zrobi sie sama.

Druga sprawa jest taka ze w tych 50 klasach na pewno pojawi sie powtarzajacy sie kod (np dla stworkow majace podobne zachowania), to tez nie jest koszer.

Natomiast koszty napisania i przetestowania 50 klas z stworkami na pewno przekrocza koszt napisania i przetestowania jednej konkretnej klasy potrafiacej oblsuzyc stworka z pliku .dat

0
EgonOlsen napisał(a)

Druga sprawa jest taka ze w tych 50 klasach na pewno pojawi sie powtarzajacy sie kod (np dla stworkow majace podobne zachowania), to tez nie jest koszer.

Dobrze zaprojektowana hierarchia klas powinna eliminować takie rzeczy. Jak ja mam pisać taką samą metodę jak inna podobna klasa, to wolę wypchnąć kod do klasy bazowej lub klasy pomocniczej niż kopiować.

EgonOlsen napisał(a)

Natomiast koszty napisania i przetestowania 50 klas z stworkami na pewno przekrocza koszt napisania i przetestowania jednej konkretnej klasy potrafiacej oblsuzyc stworka z pliku .dat

No dobrze, a potem jednak stwierdzimy, że ten musi zachowywać się inaczej niż inne, bo ma specjalne super moce. Potem jeszcze jeden wyjątek, jeszcze jeden i jeszcze jeden. No to jak zmieniamy tutaj, to trzeba to uwzględnić tu, tu i tam. I potem wychodzi z tego misz masz i nie można się już w tym połapać.
Z drugiej strony można mieć zajebi**cie zaprojektowany system. Super konfigurowalny i przejrzysty, że cudo miudo. Po odpaleniu wszystkich modułów okazuje się jednak, że jest tak wolny, że nie da się na nim pracować. Wszystko zależy od potrzeb.
EDIT
Aha i nie powiedziane, że trzeba implementować 50 klas dla wszystkich absolutnie stworów. Można implementować klasy dla grupy np. zwierzaki, żywioły, olbrzymy itd...

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