
Jak działa rzut kością? Dlaczego to nie jest takie proste, jak się wydaje?
Komputer jest deterministyczny co oznacza że zawsze daje ten sam wynik dla tych samych danych. Jak więc sprawić, aby wirtualny rzut kością był jak najbardziej losowy i uczciwy?
Rzut kością w RPG Books
Jak to właściwie działa? I czy da się zrobić to uczciwie?
Komputer jest przewidywalny. I to jest problem.
Komputery działają deterministycznie. Znaczy to po prostu tyle, że jeżeli dasz komputerowi te same dane, zawsze dostaniesz ten sam wynik. Zawsze. Zero niespodzianek.
To fundamentalna cecha jeśli tworzysz algorytmy które zawsze mają działać w oczekiwany sposób, natomiast fatalna jeśli chcesz losować rzuty kością.
Jak działa losowość w grach komputerowych?
Losowość opiera się na czymś co nazywamy generatorem liczb pseudolosowych (ang. pseudo-random number generator). To algorytm który bierze jakieś dane wejściowe (zwane seedem) i przetwarza je na ciąg liczb, które wyglądają na losowe, ale skąd one się biorą? Skąd ten seed?
Jednym z popularnych źródeł jest czas który daje pewną losowość, bo nikt nie wie dokładnie kiedy klikniesz przycisk. Czas jest liczony w milisekundach od pewnego momentu (np. Unix time czyli ile minęło sekund od 1 stycznia 1970 roku). Każda sekunda to inna liczba, więc teoretycznie każdy rzut mógłby być inny.
Do tego dochodzi jeszcze entropia systemu, czyli różne dane które komputer zbiera o swoim otoczeniu i które mogą być użyte do zwiększenia losowości.
Dlaczego to nie jest idealne?
Gdyby rzut k20 opierał się tylko na tym kiedy kliknąłeś przycisk, to teoretycznie dwie osoby klikające dokładnie w tej samej sekundzie dostałyby identyczny wynik.
Dużo większe znaczenie ma gdy rzucam jednocześnie 5k20 czyli 5 rzutów kością 20 oczkową, to szansa że wyniki wypadną podobne jest większa.
Jak rzuca się prawdziwą kością?
Gdy rzucasz fizyczną kością po stole, wynik zależy od mnóstwa rzeczy naraz:
- Powierzchni po której toczy się kość
- Siły rzutu z jaką rzucisz, delikatnie czy z większą siłą
- Wektoru czyli strony w którą kość zostanie rzucaona i jak zacznie się obracać
- Samej kości jak jest zbudowana, jej wagi, wyważenia czy powierzchni
To cztery niezależne zmienne, które razem tworzą nieprzewidywalny wynik. Żaden gracz nie kontroluje ich wszystkich naraz. I właśnie dlatego rzut jest losowy.
Seed, czyli jak gry komputerowe oszukują losowość
Jeśli grasz w gry komputerowe, pewnie spotkałeś się z pojęciem seeda przy generowaniu map albo startowym świecie. Wpisujesz jakieś słowo, a gra generuje na jego podstawie określony wynik, zawsze taki sam dla tego samego słowa.
Skąd to się bierze? Bo komputer wszystko przelicza na liczby. Gdy wpiszesz słowo "kot", komputer widzi tak naprawdę 107 111 116, każda litera ma swój kod numeryczny. I te liczby stają się punktem startowym dla wszystkich obliczeń.
Jak to rozwiązałem w RPG Books?
Postanowiłem żeby seed tworzył się sam z zachowania gracza podczas rzutu. Dwie zmienne które biorę pod uwagę to siła rzutu (jak długo przytrzymujesz przycisk rzutu) oraz wektor rzutu (gdzie dokładnie na przycisku kliknąłeś). Można powiedzieć że do każdego rzutu dodajesz cząstkę Twojej unikalności.
Do zobaczenia przy następnym rzucie!
