Algorytm narzędzia do statystyk teorii na podstawie gry (League of Legends)

10

Chciałbym stworzyć symulator (zasadniczo do celów testowych) do gry (League of legends).

Podstawy gry:

masz bohatera, który ma kilka statystyk:

  • Punkt zdrowia
  • Obrażenia od ataku
  • Szybkość ataku
  • Zbroja
  • Penetracja pancerza
  • Prędkość ruchu

Bohater może mieć 4 umiejętności (dostajesz jeden punkt umiejętności na każdym poziomie) (Są one aktywowane ręcznie, przez większość czasu, ma czas odnowienia, obrażenia, stosunek siły ataku / skalowania obrażeń ataku i poziom umiejętności) + umiejętność pasywna

Możesz zabijać wrogich bohaterów lub neutralne potwory, mają one te same statystyki:

  • Punkt zdrowia
  • Obrażenia od ataku
  • Szybkość ataku
  • Zbroja

Co chciałbym zrobić:

Utwórz narzędzie do testowania, czy określony przedmiot lub określony wzrost statystyk przyspieszy twoją moc / szybkość zabijania.

mapa: http://evtron.com/Evtron-Alpha/wp-content/uploads/2011/02/Summoners-Rift.jpg

Przykłady statystyk:

  • Hp: 420
  • Ogłoszenie: 55
  • AttackSpeed: 0,613 (ataki / s -> każdy atak w 1 / 0,613 s)
  • penetracja pancerza: 25

Postać automatycznie zaatakuje wroga z prędkością 1 / ataku i zadając obrażenia atakiem (istnieje formuła do obliczenia obrażeń, ale chyba nie jest to ważne w tej fazie), gdy są martwi, przechodzą do następnej z prędkością ruchu ( widać obozy na mapie, żółte czaszki)

Myślałem o algorytmie:

  1. Pomyślałem, że jeśli zrobię for z i = 0 do i = 30000 (zliczanie ms), więc mogę po prostu sprawdzić HP wroga i moje HP również przy każdym ms okazało się tak źle (całkiem ciężkie procesor, i chciałbym żeby dodać trochę losowości, więc powinienem być w stanie podsumować iterację 1k, co jest niemożliwe)

  2. Po drugie, pomyślałem, że powinienem zrobić od i = 1 do 30 i sprawdzać co sekundę, i sprawdzać, co się stało w ostatniej sekundzie, ale niektóre neutralne potwory są w dużym obozie (do 4 potworów) i w ten sposób kod stawał się skomplikowany i skomplikowany.

  3. Stworzę wątki dla każdego gracza / potworów, a kiedy skończą, odszukaj, kiedy umierają, i zmniejszę hp gracza.

Moje pytanie, czy to dobra droga?

TLDR: Chciałbym stworzyć narzędzie do analizy (iteruj 1k i obliczaj średnią) na temat gry, której wzrost statystyk sprawiłby, że postać zabijałaby szybsze neutralne potwory.

Wolałbym java, ale utknąłem w algorytmie.


@Karoly S: Tak, to moje złe, .com -> .eu

Pracowałem nad tym:

Sprawdzam pozostały czas na każdym obiekcie (umiejętność gracza, automatyczny atak, wzmocnienia) i zawsze wybieram najkrótszy czas, przechowuję ostatni czas i dodam od czasu do czasu, w następnej rundzie obliczam czas do ( ostatni raz)

Jeśli obiekt ma pozostały czas 0, zrobi wszystko, co trzeba.

Nie wiem, czy to efektywny sposób, czy nie, ale to najlepsze, co mogłem zrobić.

Tetrad
źródło
1
Możesz mieć więcej szczęścia, pytając w dziale rozwoju gry / stronie Stack Exchange, spróbuj zdobyć modyfikację, aby ją przenieść, ale są szanse, że i tak to zrobią. Interesujący byłby symulator dżunglowania, zastanowię się i zobaczę, co wymyślę.
Karoly S
Dzięki za szybką odpowiedź, twoja pomoc jest bardzo doceniana. Domyślam się, że ty też jesteś Węgrem?
Oczywiście, jest to coś, o czym myślałem, choć nie do końca tak głęboko, ale byłbym zainteresowany. Moje początkowe podejście polegałoby na sprawdzeniu, czy możliwa jest skuteczna, choć prostsza wersja twojego # 2. Chciałbym omówić to z wami bardziej szczegółowo. I tak, twoje przypuszczenia byłyby poprawne :)
Karoly S
Brzmi dla mnie fajnie, zostawię temat otwarty, może ktoś już o tym ma pomysł. mój e-mail (etheld at gwelican dot com)
Brzmi nieźle, zastanowię się nad tym i wyślemy ci trochę później.
Karoly S

Odpowiedzi:

1

Alternatywy dla symulacji klatka po klatce:

Można uzyskać pewnego rodzaju przybliżenie do symulacji za pomocą wzoru takiego jak

rawDamage = <some function of strength?)
Damage = rawDamage - enemyArmorReduction
DPS = (attackSpeed * Damage) * enemyArmorMod
myRemainingHP = myDPS / theirHP  - theirDPS / myHP

Możesz także utrzymywać kolejkę ruchów, aby symulować ruchy, a nie tyknięcia:

// my aspd = 4 attacks per second, his aspd = 3 attacks per second
0.0s : start battle
0.25s: I attack
0.33s: He attacks
0.50s: I attack again
...
1.00s: I attack
1.00s: He attacks
...
Jimmy
źródło
Kolejka ruchu będzie dokładniejsza, ponieważ poprawnie radzi sobie z tym, że obrażenia są dyskretne, a nie ciągłe. Na przykład, jeśli zadam 50 obrażeń w 0 sekund, a kolejne 50 w 1 sekundzie, Mój DPS wyniesie 50, ale zabiłbym cel 100 HP w ciągu 1 sekundy.
@hammar: to prawda. im krótsza walka, tym mniej dokładne będą szacunki oparte na DPS.
Jimmy
Fakt, że gra ma ogłuszenia i inne osłabienia sprawiłoby, że takie narzędzie jest naprawdę trudne do osiągnięcia, ponieważ różni gracze mogą mieć różne wyniki w zakresie szybkości zabijania. W każdym razie dobra odpowiedź.
Grimshaw