Mam zamiar rozpocząć prostą grę RPG z tekstem przeglądarki, w której postacie mogą (pasywnie) walczyć z innymi ludźmi. Obejmuje to listę około 10 umiejętności, takich jak siła, zręczność itd., Z dodatkowymi umiejętnościami dla różnych rodzajów broni.
Czy istnieje lepszy sposób zaprojektowania tej klasy postaci niż posiadanie tych umiejętności jako atrybutu klasy? Wydaje się to łatwe, ale niechętnie, bo to niezręczność.
class Char(self):
int strength
int dexterity
int agility
...
int weaponless
int dagger
...
architecture
oop
Sven
źródło
źródło
Charactor
klasy?Odpowiedzi:
Tak długo, jak utrzymujesz swój system względnie prosty, powinno to działać. Ale kiedy dodasz takie tymczasowe modyfikatory umiejętności, wkrótce zobaczysz dużo zduplikowanego kodu. Będziesz także mieć problemy z różnymi rodzajami broni używającymi różnych umiejętności. Ponieważ każda umiejętność jest inną zmienną, będziesz musiał napisać inny kod dla każdego rodzaju umiejętności, który zasadniczo robi to samo (lub użyj brzydkich refleksów - pod warunkiem, że obsługuje je Twój język programowania).
Z tego powodu zaleciłbym przechowywanie zarówno umiejętności, jak i biegłości w asocjacyjnej strukturze danych, która odwzorowuje stałe umiejętności na wartości. Jak to zrobić elegancko różni się od języka programowania do języka programowania. Kiedy twój język to obsługuje, stałe powinny być w
enum
.Aby dać przykład, jak to działałoby w praktyce, kod do obliczania obrażeń od ataku wyglądałby następująco:
źródło
getSkill()
jest sprzeczne z podstawową zasadą programowania obiektowego .Dlaczego nie skorzystać z powiązanych tablic ?, daje to zaletę łatwego rozszerzenia (na przykład za pomocą PHP)
dla rzeczy takich jak broń, prawdopodobnie chciałbyś stworzyć pewne klasy podstawowe
Broń -> Broń biała, Broń dystansowa
i stamtąd stwórz swoją broń.
Ostatecznym rezultatem, do którego dążyłbym, jest klasa wyglądająca tak
Możesz również przechowywać wszystko w tablicy, jeśli naprawdę tego chcesz.
źródło
Postaram się odpowiedzieć na to pytanie w jak najbardziej OOP (a przynajmniej tak, jak sądzę, będzie). Może to być całkowicie przesada, w zależności od ewolucji, które widzisz na temat statystyk.
Możesz sobie wyobrazić klasę SkillSet (lub Stats ) (do tej odpowiedzi używam składni podobnej do C):
Wtedy bohater miałby wewnętrzne pole typu SkillSet. Broń może mieć także umiejętność modyfikatora.
Jest to oczywiście przykład, który da ci pomysł. Możesz również rozważyć użycie wzorca projektowego Decorator, aby modyfikatory statystyk działały jako „filtry”, które są stosowane jeden po drugim…
źródło
Najbardziej otwartym sposobem na zrobienie rzeczy prawdopodobnie byłoby zrobienie czegoś z dziedziczeniem. Twoją klasą podstawową (lub superklasą w zależności od języka) byłaby osoba, a może czarne charaktery i bohaterowie odziedziczą po klasie podstawowej. Wtedy twoi bohaterowie oparti na sile i bohaterowie lotni rozgałęziają się, ponieważ ich sposób transportu jest inny, na przykład. Ma to dodatkową zaletę, że gracze komputerowi mogą mieć tę samą klasę podstawową, co gracze będący ludźmi, i mam nadzieję, że uprości to twoje życie.
Inną kwestią dotyczącą atrybutów, a jest to mniej specyficzne dla OOP, byłoby reprezentowanie atrybutów postaci jako listy, więc nie musisz mieć ich wszystkich zdefiniowanych w kodzie. Więc może masz listę broni i listę atrybutów fizycznych. Stwórz jakąś klasę bazową dla tych atrybutów, aby mogły ze sobą współdziałać, aby każda z nich była zdefiniowana w kategoriach obrażeń, kosztów energii itp., Więc kiedy dwie osoby spotkają się razem, jest stosunkowo jasne, w jaki sposób nastąpi interakcja. Powtarzalibyśmy listę atrybutów każdej postaci i obliczali obrażenia zadawane drugiemu z pewnym prawdopodobieństwem w każdej interakcji.
Korzystanie z listy pomoże ci uniknąć przepisywania dużej ilości kodu, ponieważ aby dodać znak z atrybutem, o którym jeszcze nie pomyślałeś, musisz tylko upewnić się, że ma interakcję, która działa z istniejącym systemem.
źródło
Poleciłbym menedżera typów statystyk, wypełnionego z pliku danych (np. Używam XML) i obiektów Stat, z typem i wartością przechowywaną w insatnce znaku jako hashtable, z unikalnym identyfikatorem typu stat jako kluczem.
Edycja: Kod Psudo
źródło
StatType
klasa w niepotrzebny, wystarczy użyćname
zStatType
jako klucz. Tak jak #Grimston. To samo zStats
.Ι postaram się dać ci przykład, jak zaprojektować swój arsenał i zbrojownię.
Naszym celem jest oddzielenie bytów, dlatego broń powinna być interfejsem.
Załóżmy, że każdy gracz może posiadać tylko jedną broń, możemy jej użyć
Strategy pattern
w celu łatwej zmiany broni.Innym przydatnym wzorem byłby wzorzec zerowy na wypadek, gdyby gracz nie był uzbrojony.
Jeśli chodzi o zbrojownię, możemy nosić wiele ekwipunku obronnego.
Dla oddzielenia stworzyłem interfejs dla obrońcy.
I
Player
klasa.Dodajmy trochę rozgrywki.
Voila!
źródło