poniedziałek, 28 sierpnia 2017

AI vs AI i statystyki

Postanowiłem przekodować nieco aplikację abym mógł uruchomić grę AI vs AI z pominięciem tego co widzimy na kliencie, czyli z pominięciem wszystkich animacji itp. Z perwspektywy programowania taka funkcjonalność ma 3 następujące zalety:
- Pozwala wykryć błędy zwązane z wywoływaniem funkcji nie na tym sprzęcie co trzeba (przykładowo okazało się, że niektóre fragmenty kodu były wywoływane zarówno na serwerze jak i kliencie, mimo iż powinny być wywoływane tylko na kliencie),
- Przy wielokrotnym uruchomieniu gry AI vs AI pozwala szybko wykryć błędy które występują w bardzo specyficznych sytuacjach.
- Pozwala sprawdzić optymalność kodu, czyli ile gier na sekundę byłby w stanie utrzymać serwer (gdyby był moim laptopem).

Statystyki


Po załataniu kilku błędów postanowiłem pójść o krok naprzód i zacząłem zbierać statystyki z tych gier. Zbierałem 3 rodzaje statystyk:
- Win ratio kart żetonów.
- Win ratio kombinacji par kart żetonów w zestawach.
- Win ratio kart żetonów przeciwko innym określonym kartom żetonów.

Właściwie to nie do końca było to prawdziwe "win ratio". Zamiast tego wszystkie podstawowe wartości ustawiłem na 0.5, a po każdej grze mnożyłem odpowiednie wartości przez 0.999, oraz dodawałem 0.001 w przypadku wygranych. Od zwykłego win ratio różni się tym, że największy wpływ na statystyki mają najnowsze gry, dzięki czemu można szybko obserwować zmiany wynikłe ze zmian w balansie/AI, ale jednocześnie statystyki nie wahają się zbytnio wskutek losowości. Alternatywnym rozwiązaniem byłoby zapamiętywanie historii tylko 1000 ostatnich gier, przy początkowym wypełnieniu ich naprzemiennymi wygranymi i przegranymi, ale takie rozwiązanie nie byłoby praktyczne.

Takie statystyki są bardzo pomocne. Jeśli jakaś karta ma zbyt duże win ratio, to znaczy że albo AI nie potrafi sobie z nią radzić, albo ta karta jest zbyt silna. Jeśli jakaś karta ma zbyt niskie win ratio, to albo AI nie potrafi z niej poprawnie korzystać, albo jest zbyt słaba. Dzięki tym statystykom szybko zorientowałem się po ostatniej zmianie w działaniu umiejętności dającej bonusową turę właścicielowi AI nie posługiwało się nią prawidłowo, więc szybko mogłem naprawić ten problem.

Mimo iż statystyki obejmowały wiele gier, to nie uznawałem je za zbyt wartościowe. Powód jest prosty: karty żetonów posiadają różną skuteczność w zależności od tego jakie ma się pozostałe karty w zestawie. Przykładowo jeśli posiadamy żeton który wzmacnia przyrost punktacji sąsiednich żetonów, to będzie on znacznie lepiej sobie radził jeśli będziemy posiadali umiejętności które generują wiele żetonów.

Poprawiony generator zestawów kart żetonów

Skoro już zebrałem statystyki dotyczące synergii żetonów, postanowiłem je wykorzystać. Dotychczas zestawy były generowane w taki sposób, aby w pierwszej kolumnie były losowe żetony którymi opłaca się rozpocząć grę, a prócz tego jedyną zasadą był brak powtórek kart - wszystkie miały tę samą wagę. Postanowiłem to zmienić i przerobiłem algorytm tak, aby wagi wszystkich dostępnych kart były wymnażane przez win ratio każdej dodawanej do zestawu talii. Innymi słowi jeśli jakaś karta nie zgrywa się z tymi które już wylosowaliśmy, to mieliśmy mniejszą szansę na jej otrzymanie.

Ku moim oczekiwaniom po wprowadzeniu tej zmiany win ratio poszczególnych elementów zmieniło się. Jeśli jakiś element wymagał synergii, to jego win ratio wzrosło, bo zwyczajnie rzadziej zdażały się sytuacje w których ta synergia nie występowała. Co więcej zmiana ta spowodowała nieustanne zmiany w win ratio wszystkich kart - jeśli jakaś karta okazywała się słaba, zaczęła występować rzadziej, a wtedy karty przeciwko którym była skuteczna zaczęły występować częściej, ponieważ zginęło ich naturalne zagrożenie. Elementy papier-kamień-nożyce w tej grze są dosyć mocne, więc takie zmiany mogą zachodzić niemal bez końca.

Balans na podstawie statystyk

Karty żetonów które mocno wychodziły na plus postanowiłem osłabić, a karty które radziły sobie okropnie postanowiłem wzmocnić. Zmieniałem tylko te karty, które odstawały najmocniej, a następnie analizowałem zmiany. Zmienione karty albo pozostawały słabe/silne (choć w nieco mniejszym stopniu), albo stawały się przeciętne, co pozwala mi sądzić że zmiany były w miarę rozsądne.

Wraz z wprowadzaniem zmian można było zauważyć, że zmiana najbardziej skrajnych kart sprawiała tylko, że mniej skrajne karty zajmowały ich miejsce, co jest dysyć przewidywalne, bo jeśli jakiś element przestał być słabszy od innego elementu, to prawdopodobnie będzie teraz z nim wygrywać.

Inną przewidywalną zależnością było dążenie statystyk do małej liczby kart z pozytywnym win ratio, przy jednoczesną nieznaczną pozytywnością. Win ratio żadnej karty nie przekroczyło 53%, a większość pozytywnych kart miała w przybliżeniu 51% win ratio, z kolei siła słabych kart była bardzo różnorodna i potrafiła sięgać nawet 37%. Powód tego był prosty: najlepsze karty występowały w zestawach częściej, a więc "wygrani grali z wygranymi". Nawet gdyby któraś karta początkowo miała 90% win ratio, to po rozegraniu dużej liczby gier z przeciwnikiem na tym samym poziomie win ratio zbliżyłoby się do 50%. Z kolei słabsze karty rzadko miały okazję grać naprzeciw słabszym kartom, a więc ich win ratio spadało w dół.

Przy całej tej zabawie najbardziej rzuciło mi się w oczy, że karta z żetonem o wartości 9 (dotychczas 8) dająca bonusową turę przeciwnikowi na przemian miała neutralne i negatywne win ratio. Gdy jej win ratio stawało się neutralne, win ratio kart które mogły wypchnąć ten żeton poza planszę wzrastało. Gdy wzrastało win ratio kart przemieszczających, to win ratio karty z bonusową turą dla przeciwnika malało, a gdy zmalało, to win ratio kart wypychających znowu spadało. Spośród wszystkich kart ta jest chyba najbardziej ryzykowna.

Oto grafika przedstawiająca zebrane dane: po lewej jest win ratio poszczególnych kart, po środku jest win ratio ich kombinacji, a po prawej jest win ratio ich potyczek:


Czysty żółty kolor oznacza 50% win ratio, czysty zielony 60% win ratio, czysty czerwony oznacza 40% win ratio, a czysty fiolet oznacza 30% win ratio. Kolory pośrednie to oczywiście wartości pośrednie.

Póki co zagwozdkę dla mnie stanowią karty które mają inną skuteczność mimo iż różnią się tylko obszarem umiejętności, nawet jeśli obszar umiejętności obejmuje tyle samo pól. O ile w przypadku umiejętności przemieszczających łatwo zrozumieć dlaczego tak się dzieje (umiejętności przemieszczające po skosie częściej natrafiają na sytuacje w której mogą coś wypchnąć poza planszę), to w przypadku innych umiejętności nie jest to takie jasne. Różnica ta jest najbardziej widoczna w przypadku umiejętności przejmującej, która w działaniu skośnym ma lepsze wyniki. Przypuszczam że jest to związane z żetonem który co turę właściciela rani wrogów w linii pionowej/poziomej - wtedy przejęcie żetonów po skosie jest dla nas bardziej opłacalne, ponieważ można przejąć więcej żetonów przy jednoczesnym nie narażaniu ich na obrażenia.

No cóż, pozostaje mi posiedzieć jeszcze nad sztuczną inteligencją. Obecnie unika ona stawiania wartościowych żetonów w obszarze obrażeń wieżyczek, więc to może być przyczyną niektórych zaburzeń. Niedługo dojdzie jeszcze nieco nowych kart, które także mogą zamieszać w balansie.

piątek, 25 sierpnia 2017

Aktualizacja 0.9.0

Nową wersję gry można pobrać pod tym adresem:
https://drive.google.com/open?id=0B_YKEPym2wKDVGJKZk9Vb0pPVk0

Zasady gry można znaleźć pod adresem:
http://tokenbattle.blogspot.com/2016/07/zasady-gry.html

Zmiany w żetonach:

- Od teraz umiejętność tworząca wrogie żetony będzie tworzyła własne zdradzieckie żetony, które generują punkty dla przeciwnika. Zapewni to większą jednolitość w grze i efekt nie będzie tworzył wątpliwości w trybie sandbox, w którym jest tylko 1 gracz.

Edytor zestawów kart żetonów:

- Naprawiono błąd który sprawiał, że nie dało się wczytać zestawu jeśli na kliencie nie miało się dostępu do dysku serweru.
- Od teraz można zapisywać także nieprzepisowe zestawy (czyli takie które nie mają co najmniej 2 kart w każdej kolumnie).
- Od teraz po zapisie zestawu nie będzie się już przekierowywanym do menu głównego, lecz dalej będzie się w edytorze zestawów.
- Od teraz można zmieniać nazwy zestawów kart żetonów.
- Od teraz w edytorze można generować losowe zestawy kart żetonów.
- Od teraz w edytorze można włączyć podgląd listy zestawów kart żetonów bez konieczności cofania się do menu.


Ustawienia:

- Od teraz w trakcie gry widoczna jest ikonka menu, które dotychczas można było otworzyć tylko skrótem F10.
- Od teraz wspomniane menu umożliwia dostęp do ustawień.
- Od teraz w ustawieniach można ustawić dla konta czas trwania animacji oraz odstępy między ruchami. Dzięki temu nowi gracze nie będą się gubić wskutek zbyt szybkich animacji, a weterani nie będą musieli tyle na nie czekać.

Zmiany ogólne:

- Zmieniono zestaw żetonów tworzony dla nowych kont na bardziej intuicyjny. Na pierwszych 2 stosach kart umieszczono tylko karty z obszarem obejmującym 2 pola, na trzecim stosie kart są umiejętności z obszarem obejmującym 3 pola, a na czwartym są umiejetności z obszarem obejmującym 4 pola. Zmiana ta nie ma wpływu na kolekcję kart, więc w edytorze zestawów można go zmodyfikować tak jak dotychczas.
- Od teraz komunikat o końcu meczu wyświetli się po zakończeniu wszystkich animacji.
- Od teraz rozmiar okienka komunikatu będzie dopasowywał się do długości jego tekstu.
- Od teraz aplikacja uniemożliwia rozpoczęcie gry jeśli wybrany/e zestaw(y) nie są zgodne z zasadami gry i wyświetla odpowiedni komunikat.
- Zmieniono wygląd graficzny menu głównego, menu wyboru trybu gry i menu w trakcie gry.

Omówienie nowych kart żetonów:


Umiejętność oznaczona tym symbolem zmienia wrogie żetony będące celem w zwykłe i zwiększa ich wartość o 1. Jest to mocny efekt jeśli przeciwnik posiada jakieś specjalne żetony których właściwość daje mu większą korzyść niż 1 pkt. wartości. Dodatkowo umiejętność ta jest doczepiona do żetonów o wartości 4 - opłaca się je wystawiać nawet jeśli nie mamy okazji do wykorzystania naszego efektu, pod warunkiem że w obszarze umiejętności nie będzie wrogich żetonów. Sprawia to, że w trakcie gry żetony będą mogły być trochę bardziej rozproszone, dzięki czemu będzie większa swoboda w wykorzystywaniu umiejętności obszarowych.

Umiejętność oznaczona tym symbolem podpala zwykłe żetony będące celem sprawiając, że otrzymują one 1 pkt. obrażeń po turach ich właściciela. W ten sposób można pozbywać się większych żetonów przeciwnika, ale trzeba to robić wcześnie, ponieważ efekt ten jest rozłożony w czasie. Dodatkowo w połączeniu z wyżej wymienioną umiejętnością możemy spalić dowolny żeton, ale będziemy potrzebowali do tego 2 ruchów.

No a to właśnie jest podpalony żeton, który otrzymuje 1 pkt. obrażeń po turach właściciela.



piątek, 18 sierpnia 2017

Aktualizacja 0.8.0

Nową wersję gry można pobrać pod tym adresem:
https://drive.google.com/open?id=0B_YKEPym2wKDVGJKZk9Vb0pPVk0

Zasady gry można znaleźć pod adresem:
http://tokenbattle.blogspot.com/2016/07/zasady-gry.html

Nowości:
- Od teraz w trakcie gry po wejściu w historię ruchów można kliknąć na dowolną miniaturkę planszy aby zobaczyć jak wyglądała plansza przed wykonaniem ruchu związanego z tą miniaturką. Dzięki tej funkcjonalności gracz będzie mógł przypomnieć sobie jak plansza wyglądała parę tur wcześniej.
- Od teraz żetony i umiejętności mają swoje nazwy.
- 5 nowych kart żetonów.

Zmiany w żetonach i umiejętnościach:
- Od teraz umiejętność dająca ekstra turę przeciwnikowi zapewnia extra turę wszystkim przeciwnikom zamiast następnemu graczowi, który w przypadku trybu sandboxu był graczem używającym umiejętność.
- Od teraz umiejętność dająca ekstra turę właścicielowi wymaga objęcia obszarem umiejętności 4 żetony, zamiast obejmować wszystkie możliwe pola. Dzięki tej zmianie działanie umiejętności jest bardziej intuicyjne, oraz ułatwia to aktywację nowego żetonu który ma obszar działania 8 pól.
- Od teraz żetony raniące co turę pierwsze napotkane żetony w orientacji pionowej/poziomej będą to robić tylko po turach właściciela.

AI:
- Od teraz AI nie będzie się wieszało w sytuacji gdy 4 wieżyczki biją się wzajemnie.
- AI teraz dokładniej określa ryzyko związane z umieszczaniem żetonów w pobliżu krawędzi.

UI:
- W edytorze zestawów żetonów zamieniono miejscami kolekcję kart z zestawem żetonów, aby ułożenie odpowiadało standardom w dzisiejszych grach (gdzie zwykle kolekcja kart jest po lewej stronie lub na górze, a budowany przez graczy zestaw jest po prawej stronie lub na dole).

Tooltipy:
- Dotychczas na małych rozdzielczościach gry tooltipy mogły wychodzić poza górną krawędź ekranu. Aby temu zapobiec od teraz tooltipy wyświetlają się z boku kursora gdy nie mieszczą się wyżej.
- Od teraz tooltipy nie zasłaniają obiektu który opisują. Jeśli obiekt jest fragmentem innego obiektu (np. ikona umiejętności jest fragmentem całej karty), to cały obiekt nie będzie zasłoniony.
- Tooltipy teraz poprawnie wyświetlają się po najechaniu myszką na obiekty w podglądzie historii meczów i zestawów żetonów w trakcie gry.

Naprawione błędy:
- Od teraz żeton odpychający będzie poprawnie się szarzał gdy jego efekt nie zadziała na żeton.

Omówienie nowych kart żetonów:



Żeton ten generuje punkty dla przeciwnika. W pewnym sensie jest to żeton o wartości ujemnej, bo zamiast ułatwiać nam zwycięstwo utrudnia nam je. Jednak im słabszy żeton, tym mocniejsze umiejętności przypisane do karty, a więc wprowadzenie tego żetonu znacznie zwiększyło możliwości projektowania gry.



Umiejętność oznaczona tym symbolem przejmuje kontrolę nad żetonami które są celem umiejętności, ale wzmacnia żeton który sami postawiliśmy o wartość przejętych żetonów. Umiejętność tą posiadają tylko żetony generujące pukty dla przeciwnika, więc odzyska należącą do niego wartość. Umiejętność świetnie się sprawdza to przejmowania żetonów specjalnych, których główną zaletą jest ich umiejętność, a nie wartość, ale sprawdza się także w sytuacjach w których chcemy przejąć żetony o dużej sumie wartości.


Ta umiejętność kradnie 1 pkt. wartości od naszych przyjaznych żetonów w obrębie działania umiejętności. Pozwala nam ona na pozbycie się naszych żetonów o niskich wartościach bez ponoszenia konsekwencji, a samo odblokowanie pól może zaskoczyć przeciwnika, odsłaniając jego słabe strony. Dodatkowo dzięki tej umiejętności możemy zredukować nieco wartość żetonów które generują punkty przeciwnikowi.

Powrót do pracy.

Przez jakiś czas znowu będę mógł pracować nad projektem, dlatego uważam go za wznowiony.