karcianka w C++ i wykorzystanie wzorców

0

witajcie! potrzebna mi porada.
Zabieram się za napisanie karcianki w C++ i SFML, już wcześniej pisałem inną grę w tym języku ale to było na wariata.
Będzie to gra podobna do tej
W nowym projekcie chciałbym wykorzystać kilka wzorców w ramach nauki. Postanowiłem, że wykorzystam singletony, które dadzą mi dostęp do renderera i eventow.
Karcianka musi mieć ładnie wyglądające karty: z opisem, obrazkiem, ramką i ikonkami, tu bym wykorzystał dekorator. Karty będą proste: atak lub odbuduj wieżę. I chyba jakiś wzorzec fabryka do tworzenia tych kart. Wiadomo też, że karcianka to gra turowa ale jakoś sobie poradzę z taką mechaniką. Każda karta będzie też posiadała obiekt wektor2D aby mogła swobodnie poruszać się po stole.
Zależy mi na tym aby napisać sensowny kod źródłowy. Jakie wzorce wykorzystać?

4

W nowym projekcie chciałbym wykorzystać kilka wzorców w ramach nauki. Postanowiłem, że wykorzystam singletony

Dlaczego sobie to robisz? To jest anty-wzorzec, staraj się go nie używać właśnie, szczególnie jako obiektu globalnego.

Ogółem nie fiksuj się na zastosowaniu konkretnych wzorców.

2
kq napisał(a):

W nowym projekcie chciałbym wykorzystać kilka wzorców w ramach nauki. Postanowiłem, że wykorzystam singletony

Dlaczego sobie to robisz? To jest anty-wzorzec, staraj się go nie używać właśnie, szczególnie jako obiektu globalnego.

Dodajesz do konstruktora singletona parametr bool którego nawet nie używasz, dajesz mu domyślną wartość false czyli w kodzie używasz dokładnie jak poprzednio.
Z tym że już nie masz anti-wzorca singletona tylko dobry wzorzec Property.
To się nazywa paranoja lub totalne zwycięstwo teoretyzowania nad zdrowym rozsądkiem.

3

Też kiedyś chciałem koniecznie używać wzorców w swoich projektach, żadnego takiego projektu nie skończyłem. Jak chcesz zrobić karciankę skup się na faktycznych, technicznych problemach jakie masz i nie twórz sobie nowych, których nie masz. Prawdopodobnie już wiesz jak programować i potrafisz myśleć sam za siebie, nie zakładaj że jakiś programistyczny teoretyk, który niczego w życiu nie dostarczył wie lepiej jak pisać gry od Ciebie.

0

@Krwawy Ork:

Będzie to gra podobna do tej

Na pewno odradzam stosowanie wzorca "a co mi tam, ekran opcji zrobię w standardowym windowsowym UI", chyba że chcesz ten klimat gier pod Windows z lat 90-tych ;D

0

Ja na UI zaproponuje QML, trochę ofert pracy na to jest warto poznać. Przeczytaj książkę martina "czysty kod".

2

Wiesz, że gry mają swoje własne wzorce? Poczytaj https://gameprogrammingpatterns.com/contents.html jest też polskie tłumaczenie wydane w postaci książkowej https://helion.pl/ksiazki/programowanie-gier-robert-nystrom,e_1kxq.htm

Opisują też i twoje singletony:

This chapter is an anomaly. Every other chapter in this book shows you how to use a design pattern. This chapter shows you how not to use one.

Despite noble intentions, the Singleton pattern described by the Gang of Four usually does more harm than good. They stress that the pattern should be used sparingly, but that message was often lost in translation to the game industry.

Like any pattern, using Singleton where it doesn’t belong is about as helpful as treating a bullet wound with a splint. Since it’s so overused, most of this chapter will be about avoiding singletons, but first, let’s go over the pattern itself.

4

Singleton to takie złoto głupców.
Wydaje się prosty w zrozumieniu i każdy początkujący się nim zachwyca "o mamo, singleton, używam wzorców projektowych".
Jak już wspomniano, to jest antywzorzec (wynika to bardziej z jego nadużywania i złego stosowania).

A zapewniam cię, że używasz wzorców projektowych, nie będąc nawet tego świadom.
Np użycie strategii

std::sort(a.begin(), a.end(), std::greater<>{});

Np użycie builder:

std::ostringstream a;
a << "las " << x << ',' << y << " ma " << (width * hieght) << "m2";
setDesc(a.str());

Jeśli miałeś kontakt z przyzwoitym kodem, na pewno widziałeś, używałeś i pisałeś swój (choć nieświadomie) wzorzec: obserwator, fabryka

0

witam!
dziękuję za odpowiedzi.
Wcześniej korzystałem z moich własnych rozwiązań, jakieś zmienne globalne trzymałem w namespace Globals, coś na podobieństwo fabryki też używałem, np. Monster* monster = Globals::CreateMonster(...). Może było małe spaghetti w kodzie ale gra hulała bez glitchy i wycieków pamięci. Wzorce projektowe chciałem wykorzystać aby podczas szukania pracy ktoś mógł zobaczyć w kodzie, że korzystam z jakiś standardów. Tam ktoś podał link do książki z księgarni Helion - czytałem to już wcześniej po angielsku, szkoda, że na helionie jest tylko e-book.
Co do GUI to wykorzystam TGUI. Ogólnie to w tej chwili staram się tak pisać kod aby funkcje były bardzo małe i dużo rzeczy rozbijam na małe klasy. Pozdrawiam.

2

To jak chcesz się poduczyć to masz nowe zadanie: zrób cały silnik gry bez użycia zmiennych globalnych (stałe są ok). Zmusi Cię to do innego zaprojektowania całej architektury.

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