Losowo generowane poziomy – jak matematyka tworzy gry wideo?

Wiele razy na przeróżnych targach, prezentacjach, czy też konferencjach deweloperzy chwalą się, że ich gra będzie zawierała treść generowaną proceduralnie. W teorii takie rozwiązanie powinno posiadać niemalże same plusy. Mniej pracy dla deweloperów, którzy zamiast bawić się w projektowanie questów, przedmiotów i lokacji mogliby oddać się w pełni projektowaniu silnika gry, oraz potencjalnie nieskończona ilość zawartości, jaką raczeni byliby gracze. Rzeczywistość nie wygląda oczywiście tak kolorowo i do takiego wygenerowanego świata wkrada się często masa błędów. Nawet jeśli się ich pozbędziemy – przynajmniej w większości przypadków – to rezultat proceduralnego generowania zawartości nie będzie – może poza skalą – robił na graczach takiego wrażenia jak pięknie zaprojektowany świat. Niemniej, rozwiązania kryjące się za grami z losowo generowaną treścią są bardzo fascynujące i dziś postaram się przybliżyć wam w jak najprostszych słowach, pewne ciekawe sposoby na wykorzystanie matematyki i liczb „losowych” (użycie cudzysłowu uzasadnię w następnym akapicie) do generowania treści.

Zacznijmy od generowania liczby losowej.

A raczej pseudolosowej. Komputer bowiem jest maszyną bez uczuć, stworzoną wyłącznie do liczenia. Problemu nie stanowi natomiast wygenerowanie liczby, która będzie udawała losową. Liczbę pseudolosową od losowej odróżnić możemy tym, że ta pierwsza generowana jest przy użyciu pewnej wartości początkowej, przez co możemy wygenerować „jedynie” skończoną ilość ciągów liczb. Wygenerowanie takie liczby jest banalnie proste i współczesne języki programowania dysponują wieloma funkcjami pozwalającymi obliczyć je bardzo szybko, a wygenerowane w ten sposób liczby – choć nie są prawdziwie losowe – w pełni wystarczą, aby spełnić potrzeby gier.

Gdzie można używać liczb losowych?

W przypadku gier wideo – właściwie wszędzie. Zacznijmy od najprostszego przykładu – statystyk w grach RPG. Są one proste do pojęcia, ponieważ zazwyczaj reprezentowane są przez liczby całkowite. Gdy zdecydujemy się na generowanie losowego lootu w grze, powinniśmy na początku określić power level itemka danej rzadkości na konkretny poziom doświadczenia. Obliczanie bazowych statystyk dla przedmiotów, takich jak liczba punktów ataku broni, czy pancerz fizyczny zbroi bardzo często wykorzystują informacje o poziomie gracza. Rozrzut w liczbie punktów pancerza w zbrojach dla tej samej klasy na identycznym poziomie doświadczenia jest zazwyczaj bardzo mały, ponieważ liczby te są losowane w pewnym przedziale zależnym od poziomu postaci. Sam level gracza jest także niczym innym, jak formułą matematyczną. Zastanawialiście się kiedyś, dlaczego z każdym kolejnym poziomem potrzebuje coraz więcej expa? Zazwyczaj za obliczanie poziomu doświadczenia odpowiadają funkcje logarytmiczne, choć w tym przypadku ogranicza nas jedynie pomysłowość deweloperów. Niektórzy podczas eksperymentów z kodem w swoich grach chwalą się np. wykorzystaniem ciągu Fibonacciego, który obliczany jest w programach komputerowych zazwyczaj poprzez rekurencję. Skutkuje to stałym, lecz niezbyt dużym skokiem statystyk i liczby expa co level.

Pillars of Eternity 2

Statystyki bazowe to jednak nie wszystko.

Dlaczego czasami zdarza nam się wydropić nagolenniki z odpornością na ogień, a innym razem otrzymamy itemek dodający siłę ciosu krytycznego? Cóż, zazwyczaj każdy z przedmiotów na określonym poziomie mocy posiada przedefiniowaną ilość bonusów, jakie przydzielane są w momencie zabicia potwora. W wielu grach MMO każdy bonus w przedmiocie ma swój koszt i program dba o to, aby podczas generowania nie przesadzić z mocą itemka, sprawdzając z każdym dodanym bonusem, czy przypadkiem nie została przekroczona liczba punktów, aby nie stworzyć przesadzonego dropu.

Można sobie to wyobrazić w następujący sposób – podczas losowania przedmiotu program odpala wirtualnego „jednorękiego bandytę” z określoną ilością rolek na których znajdują się plansze z nagrodami w postaci bonusów do statystyk. Im więcej rolek i bonusów na nich – tym większa różnorodność możliwych dropów. Elementy losowe możemy umieścić także w samych bonusach, dzięki czemu czasami dostaniemy +6% odporności na jakiś żywioł – a czasami aż +8%.

Używając podobnej analogii można także wytłumaczyć tworzone proceduralnie questy.

Wyobraźmy sobie automat z 3 rolkami – pierwsza z nich definiuje, który NPC będzie dawał nam nagrodę za wykonaną misję. Następna rolka niech zawiera ilość przedmiotów, które powinniśmy mu przynieść, a na ostatniej znajdują się same przedmioty – szczurze ogony, języki jaszczurki, oraz gruczoły salamandry. W wielu grach każdy bohater niezależny i przedmiot mają swoje z góry określone ID, które możemy wykorzystać do procesu losowania questa – komputer będzie losował numery z określonego przedziału, które następnie przypisze do zdefiniowanych elementów.  ̶J̶e̶s̶z̶c̶z̶e̶ ̶t̶y̶l̶k̶o̶ ̶s̶p̶r̶a̶w̶i̶ć̶,̶ ̶a̶b̶y̶ ̶t̶a̶k̶i̶ ̶g̶e̶n̶e̶r̶a̶t̶o̶r̶ ̶w̶ ̶l̶o̶s̶o̶w̶y̶c̶h̶ ̶m̶o̶m̶e̶n̶t̶a̶c̶h̶ ̶s̶i̶ę̶ ̶z̶a̶w̶i̶e̶s̶z̶a̶ł̶,̶ ̶l̶u̶b̶ ̶d̶o̶p̶r̶o̶w̶a̶d̶z̶i̶ć̶ ̶d̶o̶ ̶”̶w̶y̶p̶a̶d̶a̶n̶i̶a̶”̶ ̶d̶a̶n̶y̶c̶h̶ ̶z̶n̶a̶j̶d̶u̶j̶ą̶c̶y̶c̶h̶ ̶s̶i̶ę̶ ̶n̶a̶ ̶w̶i̶r̶t̶u̶a̶l̶n̶y̶c̶h̶ ̶r̶o̶l̶k̶a̶c̶h̶ ̶i̶ ̶m̶o̶ż̶e̶m̶y̶ ̶a̶p̶l̶i̶k̶o̶w̶a̶ć̶ ̶d̶o̶ ̶B̶e̶t̶h̶e̶s̶d̶y̶.

Gdybyśmy chcieli stworzyć prawdziwie losowy i unikalny dla każdego gracza quest, nie obyło by się bez pomocy bota naśladującego ludzką mowę, aby dopasować dialogi do akcji podejmowanych przez gracza, oraz predefiniowanych warunków zadania. Nie jest to jednak – nawet z dzisiejszą technologią – osiągalne. Przede wszystkim, umieszczając całkowicie losowe słowa w ustach komputera powstała by z tego istna nieskładna breja (z̶u̶p̶e̶ł̶n̶i̶e̶ ̶j̶a̶k̶ ̶n̶a̶ ̶n̶i̶e̶k̶t̶ó̶r̶y̶c̶h̶ ̶p̶o̶r̶t̶a̶l̶a̶c̶h̶ ̶b̶r̶a̶n̶ż̶o̶w̶y̶c̶h̶). Zatem do takiego zadania trzeba by zaangażować bota, który będzie w stanie przekonać gracza o tym, że NPC z którym ten wszedł w dyskusję jest prawdziwym człowiekiem.

Tu zaczyna się problem – nie ma bowiem takiego bota. Już od dawna programiści z całego świata głowią się nad problemem stworzenia maszyny zdolnej przejść tzw. test Turinga. Polega on na zestawieniu rozmowy ze sztuczną inteligencją oraz człowiekiem i przekonaniu jak największej ilości sędziów, że rozmawiają oni z żywą osobą. Aby zaliczyć taki sprawdzian, AI powinna zostać wskazana jako żywa istota przez taką samą, lub wyższą liczbę sędziów, niż żywy człowiek przeprowadzający rozmowę testową. Do tej pory testu Turinga nie udało się zdać żadnej sztucznej inteligencji.

Cleverbot był jednym z programów biorącym udział w teście Turinga. Do zaliczenia zabrakło mu jednakże 4% głosów sędziów.

Generowane losowo mapy są już dużo bardziej problematyczne.

Podstawy łatwo jest pojąć, o ile operujemy w przestrzeni dwuwymiarowej. Weźmy konkretny przykład – jednym z najlepszych przykładów takiego prostego generowania losowej mapy jest the Binding of Isaac. Levele mają pewne określone stałe, takie jak liczba pokoi specjalnych czy pięter. Jednakże układ pomieszczeń jest generowany przy pomocy jednego z najprostszych algorytmów – składa się on bowiem z „klocków”, które komputer układa losowo na przestrzeni dwuwymiarowej. Podobnie generowanych jest wiele dungeon crawlerów, szczególnie tych staroszkolnych. Algorytmy generowania takich map korzystają z instrukcji warunkowych, określających w jakich momentach przykleić dany klocek w konkretne miejsce, a układ poziomów definiowany jest przez położenie kluczowych dla rozgrywki pomieszczeń takich jak koniec i początek levela.

the Binding of Isaac

Algorytmy trójwymiarowe to już wyższa szkoła jazdy.

Najpopularniejszą grą na świecie zawierającą losowo generowane mapy 3d jest niewątpliwie Minecraft. Zapewne wiecie, że aby wygenerować level w Minecrafcie potrzebny jest seed – to właśnie on definiuje jak wygenerowana zostanie mapa. Świetnie pokazuje to ideę pseudo losowości – choć odpalając nową grę, każdy gracz otrzyma swoją własną, indywidualną mapę, rozwlekającą się na niemożliwe wręcz do wyobrażenia połaciach terenu. Do tego, aby program wygenerował identyczny plik mapy ponownie, wystarczy pozornie krótki ciąg znaków.

Wracając jednak do samego procesu generowania trójwymiarowych przestrzeni – jest to proces skomplikowany, choć w dzisiejszych czasach na wyciągnięcie ręki mamy wiele gotowych algorytmów umożliwiających tworzenie takich cudeniek. Minecraft przy tworzeniu swoich mapek korzysta np. z algorytmu nazywanego Szumem Perlina, wynalezionego w 1983 roku. Aby uzyskać jak najlepszy efekt, należy oczywiście sporo eksperymentować. Dowiodły tego liczne modyfikacje, poszerzające świat Minecrafta o nowe biomy. Wyeliminowały one sporo błędów oryginalnych map, takich jak latające wysepki, czy dziwne formacje z gliny czy piasku. To wszystko dzięki temu, że autorzy takich modyfikacji użyli nieco lepiej dopasowanego do tego zadania algorytmu.

Minecraft

Jednakże nawet w przypadku złożonych, szczegółowych przestrzeni trójwymiarowych, kluczowe do ich powstania są klocki i bloki. Z nich układane są poziomy dzięki konkretnemu algorytmowi. Znacząco ułatwiają one projektowanie i implementowanie algorytmów, dzięki czemu twórca ma pewną kontrolę nad generowaną treścią, zapobiegając przed powstaniem prawdziwych koszmarków.

Losowe generowanie treści to nie zawsze dobry pomysł.

Na początku artykułu wspomniałem o tym, że komputer nie zna takiego pojęcia jak losowość. Jest to jednak coś, co z łatwością można zastąpić odpowiednimi formułami matematycznymi. Komputer nie jest jednak w stanie wygenerować wszystkiego – szczególnie, że gry są także pewnym osobliwym rodzajem sztuki. Jak na sztukę przystało, muszą one odznaczać się pewnym artyzmem, czymś, co jest komputerom zupełnie obce, choć pojawiły się już chociażby programy generujące obrazy na podstawie analizy setek dzieł najpopularniejszych malarzy.

Każda gra, nie ważne czy mówimy tutaj o tytułach wybitnych, czy kompletnych szrotach, ma jakiś zamysł i ogólnie przyjęty styl, łączący ze sobą w spójną całość muzykę, grafikę, historie, czy mechaniki rozgrywki. Choć możemy pozostawić generatorom pewne określone zadania do wykonania, nie będą one w stanie zastąpić dzieła ludzkiego, na które nie składają się tylko wklepane do C++ czy C# formułki matematyczne. I jest to myśl, z którą chciałbym pozostawić was, czytelników na koniec tego artykułu. Pamiętajmy o tym, kiedy następnym razem będziemy ekscytować się obietnicami „nieskończonej ilości generowanej losowo treści”. Czy nie lepiej czasem grać w mniej obszerne tytuły, ale przygotowane w sposób nieznany komputerowi?