Jak wdrożyć „karty efektów specjalnych” gry karcianej?

16

Próbuję napisać tutaj rodzaj gry karcianej, w pewien sposób jest ona podobna do Magic The Gathering lub Yu-Gi-Oh! gra karciana.

Dla tych z was, którzy nie są zaznajomieni z nią, w zasadzie istnieje specjalny rodzaj karty (karty Zaklęć / karty Pułapek itp.), Które mają efekty specjalne, które mogą zagiąć reguły gry. Nie mam pojęcia, jak zaimplementować logikę tych kart. Mam pomysł na przechowywanie danych karty z pewnymi flagami, które mogą sygnalizować, jaką ma zdolność, ale byłoby to bardzo ograniczone w tym, co może zrobić (może tylko prosta modyfikacja statystyk).

Aby dać Ci wyobrażenie o tym, jakie efekty mogą mieć te karty, oto przykład efektów kart zaklęć obecnych w Yu-Gi-Oh! gra karciana:

  • Ożyw stwora, który został zniszczony
  • Przejmij kontrolę nad stworzeniem przeciwnika
  • Zmodyfikuj statystyki stworzenia w oparciu o niektóre warunki (np. Liczba stworzeń o określonych nazwach, które zostały zniszczone)
  • Specjalne przywołaj określone stworzenia, jeśli spełnione zostaną określone warunki.
  • Połącz dwa lub więcej stworzeń w silniejsze stworzenie.
  • Odporność na działanie niektórych kart specjalnych.

Konami stworzył kilka gier wideo, w tym AI i tysiące różnych kart. Nie wydaje mi się, żeby można było na stałe zakodować całą bazę danych, prawda?

Oczywiście, to, co próbuję zrobić, nie jest tak skomplikowane jak te gry, ale jestem ciekawy, jak je wdrażają?

hndr
źródło

Odpowiedzi:

17

Istnieje kilka tego typu projektów typu open source, z różnymi podejściami do wdrażania zasad. Oto wpis na blogu od twórcy jednej z bardziej znanych implementacji MtG, CardForge. To może nie być pełna lista, ale zawiera kilka projektów typu open source, w których można po prostu przeglądać kod lub odwiedzać fora w celu uzyskania szczegółowych pytań.

Rzeczywista odpowiedź: najlepszym rozwiązaniem dla solidnego frameworka jest ścisłe zastosowanie programowania obiektowego. Każda akcja, każdy wyzwalacz, każda umiejętność jest przedmiotem. Strefy takie jak Ręka, Biblioteka również są obiektami, nie trzeba dodawać. W silniku reguł nigdy nie omijaj głupich obiektów, takich jak łańcuchy lub liczby całkowite, aby opisać obiekty gry, a jedynie swoje obiekty.

Każda akcja umieszcza na stosie pewną liczbę wyzwalaczy, gdzie każda inna umiejętność może sprawdzić, czy dba o ten konkretny wyzwalacz, a jeśli tak, uruchamiają własne działania, potencjalnie tworząc nowe wyzwalacze i tak dalej.

Następnie opracowujesz stosy zgodnie z zasadami gry, aż stos będzie pusty, w którym to momencie można podjąć nowe akcje itp.

Idealnie, jeśli doskonale wdrażasz zasady gry, kod reguł nie zawiera jednej zakodowanej na stałe karty. Karty na stałe mogą tworzyć wygodne skróty, ale na dłuższą metę spowoduje to wzdęcie twojego kodu i potencjalne pułapki, na przykład w przypadku wydania nowych kart, które będą oddziaływać z tymi kartami w nowatorski sposób. W grze takiej jak MtG z ponad 12 000 unikalnych kart i bez końca, WIELE takich interakcji.

Hackworth
źródło
1
Dobra odpowiedź. Jeśli chodzi o funkcjonalny świat programowania, chciałbym, aby każda karta była zamknięta w środowisku gry, aby była jeszcze bardziej absurdalnie ogólna. Na przykład karta może w akceptowalny sposób utworzyć nowy „Obszar”, dodając listę kart do listy obszarów. Konkretnie: Zombie Monster Mayhem: Wszystkie pokonane stwory są ożywione na nowym „Cmentarzu Komunalnym” bez ich specjalnych umiejętności i losowo atakują gracza na podstawie rzutu kostką.
Brice
Dodatkowy link: github.com/Fluorohydride/ygopro-core dla słynnej implementacji YGO typu open source, ponieważ w pytaniu wspomniano również o YGO.
SK19
2

Daremne jest próba włączenia tego wszystkiego w same przełączniki i zmienne. Będziesz musiał albo zastosować twardy kod funkcji, albo, co bardziej prawdopodobne, mieć skrypt, który będzie interpretowany podczas działania. Udostępniałbyś niezbędne funkcje do sprawdzania stanu tablicy, talii i cmentarzysk w skrypcie oraz funkcje do wykonywania akcji i tak dalej. Skrypt jest więc tylko prostym ciągiem do przechowywania wraz z innymi zmiennymi powiązanymi z kartą.

Toni
źródło
Lub, jak sugerował hackworth, posiadanie pewnego rodzaju wspólnych bloków, które są łączone, aby uzyskać wymagane zachowanie. Myślę, że wymagałoby to również pewnych bloków logicznych oprócz tego, co zasugerował. Posiadanie wspólnych bloków zachowania może ułatwić filtrowanie w poszukiwaniu kart o wspólnych cechach.
Toni
1

Planuję również grę karcianą przy użyciu języków internetowych z mysql db. Obecnie wybieram bardzo ogólną konfigurację, dzięki czemu jest ona bardzo elastyczna w stosunku do nowych unikalnych kart. Na przykład zamiast:

reduceHitPoints() { } 
reduceMana() { }
reduceSpeed() { }

łatwo może to być:

reduce($attacker, $target, $reduceWhat, $amount) { }
massReduce($attacker, Array $targets, $reduceWhat, $amount) { }

zastosowanie tej koncepcji do wszystkich działań uprości klasy, pozwoli na tworzenie nowych kart poprzez dodanie jednego wiersza do tabeli kart.

Wszystkie opcje i umiejętności zostaną zdefiniowane w db w tym pojedynczym rzędzie.

appthat
źródło