Autor Wątek: Wzór na ilość przeciwników dla danej fali/rundy  (Przeczytany 2757 razy)

Offline Ogniok

  • Użytkownik

# Styczeń 20, 2013, 19:35:38
Witam. :D

Aktualnie piszę sobie grę z gatunku "Tower Defense". Potrzebuję wzór, który pozwoli mi wyznaczyć ilość przeciwników na daną falę. Trzeba także uwzględnić, że są różne typy przeciwników.

Jedyne co przychodzi mi na myśl to ciąg Fibonacc'iego. Generował by on ilość przeciwników na rundę, a potem były by wybierane typy przeciwników na zasadzie prawdopodobieństw.

Byłbym wdzięczny za opinie na temat tego pomysłu, podrzucenie swoich lub jakiś linków zawierających informacje na ten temat. :)

(Mam nadzieję, że temat umieściłem w dobrym dziale.)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

  • +1
# Styczeń 20, 2013, 20:03:16
Nie, nie potrzebujesz takiego wzoru. Zrób zwykłą tabelkę na pierwsze 10 poziomów. Będziesz ją zmieniał jeszcze 10 razy podczas betatestów i balansowania poziomu trudności, więc podłożenie wzoru może zaczekać.

Jak bardzo chcesz wzór, to opcji masz wiele. Podstawowe dwie to wielomian i funkcja wykładnicza.

Offline Ogniok

  • Użytkownik

# Styczeń 20, 2013, 20:06:01
Ale tabelka to 10 poziomów tylko. A co jak ktoś dojdzie do 100?

Myślałem jeszcze o czymś takim: Rozpisać pierwsze np. 50 poziomów, i wtedy każdy następny to: przeciwnicy z fali n - 1 i przeciwnicy z fali n - 43, gdzie n to aktualna fala.

Offline Kos

  • Użytkownik
    • kos.gd

# Styczeń 20, 2013, 20:17:38
"Co jak ktoś dojdzie do 100" to problem na później. Problem na teraz to "ile powinno być przeciwników przez pierwsze 10 poziomów".

Jak już będziesz wiedział ile POWINNO być przez pierwsze 10 (czy ileś tam), to będziesz miał jakieś podstawy do dobrania wzoru, który przy podobnym wzroście poziomu trudności dobierze następne 10.

Offline Xirdus

  • Redaktor

# Styczeń 20, 2013, 21:35:07
Moja rada: wypełniaj te dane ręcznie. Nigdy nie uda ci się tego dobrze zbalansować jak zaprzęgniesz do roboty automat.

Nawet przy 50 planszach po 100 fal będzie to tylko 5000 pozycji. Na każdą poświęcisz 30 sekund (+ późniejszy osiemdziesięciokrotny balans, jednak w miarę prac balansować będzie się coraz prościej i szybciej).

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +3
# Styczeń 20, 2013, 22:30:38
Ale tabelka to 10 poziomów tylko. A co jak ktoś dojdzie do 100?
Jak zrobisz ciąg Fibonacciego, to gwarantuję Ci że do 100 nie dojdzie. ;)

Offline Ogniok

  • Użytkownik

# Styczeń 20, 2013, 22:59:50
Jak zrobisz ciąg Fibonacciego, to gwarantuję Ci że do 100 nie dojdzie. ;)

No tak ;D Trzeba przyznać, że 354224848179261915075 przeciwników to trochę dużo. xD

EDIT: Najprawdopodobniej zrobię te tabelkę. Wydaje się być najlepszą opcją i daje mi najwięcej możliwości.
Dzięki za pomoc. :D

Offline Santor

  • Użytkownik

# Styczeń 21, 2013, 01:07:50
mozna ustalic sobie liczbe punktow na runde (funkcja kwadratow) i tych punktow "kupować" jednostki, słabsze warte mniej pkt mocniejsze warte więcej.

Offline Cerberus

  • Użytkownik
    • Moja strona

# Styczeń 21, 2013, 01:52:30
Jak zostało wcześniej zasugerowane, zadaj sobie pytanie, czy koniecznie potrzebujesz na to wzór.

Ja też tworzę gdzieś tam z boku tower defence'a i zamierzam mieć skończoną liczbę poziomów, a ilości/rodzaje potworów na poziom/falę dobierać i balansować metodą testów tak długo, aż poziom trudności będzie się wydawał w miarę okej.

Offline hashedone

  • Użytkownik

  • +1
# Styczeń 21, 2013, 15:35:25
Zrób tabelkę najpierw, a wzór sobie zaimplementujesz później. Jak? Aproksymujesz sobie twoją tabelkę wielomianem. Co do wyboru przeciwników - najprościej żeby każdy przeciwnik miał jakąś wartość i wystawiać do poziomu przeciwnika o danej wartości.

Offline Paweł

  • Użytkownik

# Styczeń 22, 2013, 00:40:34
Tabelkę możesz też aproksymować metodą najmniejszych kwadratów (wzorki straszą ale w dziesięciu linijkach implementacja powinna się zmieścić). Tylko pamiętaj, że wynikiem jest funkcja liniowa, więc równie dobrze mógłbyś ją wpisać ręcznie.

Też miałem (mam) ten sam problem, z tym że u mnie ilość przeciwników jest stała, ale z każdą falą są mocniejsze i jakoś nie widzi mi się tabelkowanie tego.
Zastanawiam się nad podejściem "iteracyjnym", tzn. obliczyć ile złota zarobił gracz na nowe budowle w poprzednim poziomie, na podstawie tego wyznaczyć o ile mogłaby powiększyć się "siła" obrony gracza, i o tyle plus jakaś stała powiększyć "siłę" ataku (fali). Tańsze upgardy wieżyczek mogłyby rekompensować "siłę" wprowadzoną przez dodaną stałą.

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Styczeń 22, 2013, 21:06:14
Proponuję uprościć sprawę w ten sposób: Daną wejściową jest numer poziomu (jedna liczba), daną wyjściową jest pewna trudność tego poziomu (też jedna liczba). Ta zależność może być opisana jakąś prostą funkcją, w której a, b, c to będą parametry które dobierzesz eksperymentalnie próbując przechodzić grę (albo lepiej dając ją do przetestowania innym).

y = a*x + b - funkcja liniowa
y = a*x*x + b*x + c - funkcja kwadratowa
y  a^x - funkcja wykładnicza

Teraz mając obliczoną "trudność" danego poziomu musisz wybrać, ile i jakich potworków do niego utworzyć. Tutaj potrzebne będzie rozpisanie jak trudny jest dany potworek (np. zależnie od tego ile ma życia) i tą trudność poziomu trzeba będzie rozdzielić między ileś potworków jakiegoś rodzaju (różnego albo tylko tego samego).

Offline zephyr

  • Użytkownik

# Styczeń 31, 2013, 09:09:24
IMO to jest do działu design a nie matematyka

Trudność poziomu to coś co musisz ustalić testując, a nie wpisując magiczna funkcję
(a już na pewno nie ciąg fibonachiego, wykładnicza trudność to bardzo słaby pomysł)

Wg teorii którą słyszałem dobrze dobrana trudność uczenia się gry jest logarytmiczna - bardzo nieprecyzyjne stwierdzenie które obrazuje że szybko ogarnia się podstawy, a potem postępy są coraz trudniejsze więc nie ma co szaleć z trudnością.

Warto też zrobić tryb "tutorial" - bez idiotycznych porad tylko łatwy poziom, żeby nowy gracz miał gdzie ogarnąć podstawy. Chodzi o to żeby było gdzie się nauczyć gry ale żeby gracz który zna grę nie musiał się nudzić przez pierwsze parę plansz.

Potem można dać tych przeciwników właśnie po funkcji logarytmicznej, tyle że pierwszy poziom ustalić na jakąś wartość jak już ten logarytm trochę urośnie, i można dać regulację graczowi - ustawia sobie stałą przez którą jest mnożony logarytm. Można predefiniować że np Easy to 0.5, Normal 1, a Hard 1.4

mobCnt=floor (DifficultyConst*log(Level*progressSpeed+5) );

Tylko to wszystko trzeba przetestować i dopasować do mechaniki gry. Jak ustawiłem wieżyczkę ze splashem to i ten fibonachi nie pomoże jak zdejmuję wszystkie moby z całego obszaru. I moby muszą się robić coraz silniejsze bo obrona gracza robi się coraz silniejsza, a to subiektywna trudność powinna powoli rosnąć a nie ilość przeciwników.

I tower defense miewa kulę śnieżną - ustawisz dobrze wieżyczki to kasa sama wpada, coś skopiesz -> tracisz moby -> trasisz kasę -> masz gorsze wieżyczki -> mniej kasy -> gorsze wieżyczki -> itd. IMO lepiej mieć parę różnych poziomów trudności z mniejszą liczbą plansz niż mega długą grę której wynik będzie znany już w połowie. (przynajmniej ja wolę taki design) Jak masz parę plansz to ustawiasz je tabelkami. Zwłaszcza że możesz wtedy ustawiać wrednie plansze po kolei które wymagają innego typu obrony i plansze z bossem który wymaga jeszcze innego ustawienia.
« Ostatnia zmiana: Styczeń 31, 2013, 09:23:53 wysłana przez zephyr »