Úgy gondoltam, lenne értelme megtanulni a C# programozási nyelvet. A lenti, szigetes feladat egészen jó alanynak tűnt ahhoz, hogy elkezdjem, úgyhogy a következő szigetest már c#-ban írtam meg, és – Geot felvetése kapcsán – gravitációval. Kifejtés és képek alant:
Archive for » július, 2009 «
Egy cikkben olvastam az előbb az alább idézett szöveget. Mindenféle további magyarázkodás nélkül, ezért szeretnék játékot írni:
“Take my father. Born in the 1950s, the only windows he knows about are on the front of his house. Computers were just never part of his life, but he is, in his own way, a gamer. The man loves chess and his biggest joy is playing people online. Why? To him it’s amazing that the computer lets him play a guy in Russia one minute and a guy in Thailand the next. The man types with two fingers, but he always asks where his opponent is from, and I’m not entirely sure he hasn’t marked them all off on a map somewhere. He even started getting up at obscene hours of the morning so he could play people in even further away places.”
Magyarra fordítva:
“Vegyük példának az apámat. Az 50-es években született, az ablakokról (windows) az jut eszébe, ami otthon az utcára néz. A számítógépek sosem játszottak fontos szerepet az életében, mégis, a maga módján megszállott játékos. Imádja a sakkot, és a legnagyobb öröme az, amikor online játszhat. Hogy miért? Mert teljesen lenyűgözőnek találja, hogy a számítógép segítségével az egyik percben még egy orosz fickóval játszik, a következőben pedig már Thaiföldről valaki mással. Két ujjal gépel, mégis mindig megkérdi az ellenfelét, hogy honnan játszik, és abban sem vagyok biztos, hogy nem jelölte meg őket valahol egy térképen. Mostanában már egyre furcsább időpontokban kel fel, hogy még távolabbi emberekkel játszhasson.”
Íme az első screenshot az “legközelebbi felé mozgunk és ha odaértünk, megállunk” viselkedéshez:

Egyszerű szomszédvizsgálat
A kék az alapszín, a világoskék a megtett utat jelzi, a sárgák pedig a “végpontok”, ahol a kis szigetek megállapodtak. A következő kísérletben megpróbálok egy olyan vizsgálatot beillesztni, ahol a kis szigetek mindig a környéken lévő legnagyobb sziget felé igyekeznek..
Mondanom sem kell, ez a kép is nagyszerűen mutatja, hogy ebből a szabályrendszerből csak egy valamivel rendezettebb káosz alakul ki, de egészen távol van attól, hogy egy valódi sziget alakuljon ki..
A lentebb említett emergence kapcsán gondolkoztam el azon, hogy pályaépítést szeretnék ahhoz hasonló módon csinálni. A lényeg a valószerűség. Vannak apró egységeim, amikre definiálok néhány szabályt, majd véletlenszerűen elhelyezem őket egy terepen. Innentől az egységek olyan módon módosítják lépésről lépésre az állapotukat, hogy a szabályok alapján kedvezőbb pozicióba kerüljenek. Minden lépésben minden egységre meghívom ezt az állapotjavító függvényt, és figyelem, hogy hány egység változtatott. Ha a passzív – elégedett – egységek száma elér egy bizonyos %-ot, mondjuk 80-at, akkor megállok, és ha elég ügyesen definiáltam a szabályokat, akkor a pályám kialakult – véletlenszerűen.
Nyilván itt is oda kell figyelni egy pár dologra:
- Megfelelően sok és szigorú szabállyal el lehet azt érni, hogy bármilyen kezdőállapot ugyanahhoz a végállapothoz vezessen. Ezt nem akarom.
- Ugyanakkor elég szigorú szabályok kellenek, hogy a végkifejlet megfeleljen az elvárásoknak, ne csak egy véletlenszerű kaotikus valami maradjon. Ezt legkönnyebben emberi aggyal lehet ellenőrizni.
- Lehetnek oszcilláló végállapotok. Ez azt eredményezi, hogy minden lépésben pontosan ugyanannyi egység mozog egy olyan állapotba, amiből aztán az előző állapotba kerül vissza. Így folyamatosan van változás minden lépésben, de összességében pontosan ugyanabban a helyzetben leszünk folyamatosan. Ha ez még azelőtt beáll, hogy elérnénk a kritikus passzív tömeget, akkor soha nem fejeződik be a generálás.
Nézzünk egy egyszerű példát:
- Tengeren akarok szigeteket alkotni. A magassággal nem törődöm, csak azzal, hogy az adott pont víz vagy szárazföld.
A kiindulási pontom egy óriási tengerszelet, amelyre pici – egységsugarú – úszó szigeteket helyezek el.
A szigeteknek a következő viselkedést definiálom:
- Ha nincs közvetlen szomszédod, nézd meg, merre van a legközelebbi kis sziget, és mozogj felé.
- Ha van közvetlen szomszédod, ne csinálj semmit.
Ez a viselkedési minta több következménnyel is jár:
1: nagyon sok olyan sziget lesz, ahol két pici szigetdarab tapad csak össze. Ez vsz nem megfelelő.
2: Nincs definiálva szabály arra, hogy mi történik, ha egyforma távolságban több sziget is van.
Ez a szabályrendszer a második pontnak megfelelő viselkedést produkál.
Ha kicsit átalakítjuk a szabályt úgy, hogy
- Ha van közvetlen szomszédod, számold meg őket, és ha látsz ennél nagyobb szigetet valahol, mozogj arra
Azzal viszont gyakorlatilag az egyes pontot érjük el, mert minden esetben a végállapotban valahol egy marhanagy sziget lesz.
Ebből a két egyszerű példából is látható, hogy némiképpen bonyolultabb a probléma, mint várnánk. Akarok egy kis testbed-et írni ennek a kipróbálására, egyszerű szabálynyelvvel. Ha lesznek eredmények, rakok fel screenshotokat. (csak ne feledjük: lusta.hu)
Egy MMO-hoz kapcsolódó cikk kapcsán olvastam a fenti kifejezést: Emergence. Mivel nem tudtam, mit is jelent pontosan, rákerestem, és találtam egy nagyon jó definíciót a wikipedian:
“In philosophy, systems theory and science, emergence is the way complex systems and patterns arise out of a multiplicity of relatively simple interactions. Emergence is central to the theories of integrative levels and of complex systems.”
Azaz, a lényeg magyarul az, hogy amikor viszonylag egyszerű cselekvésekből valami minta, összetett dolog következik, azt hívják így. Ez valahol pont a fordítottja annak, amire én törekszem, de hiszen én egy mintából szeretnék egy egyszerű viselkedést kihozni, de biztos, hogy van helye a játékok világában. Részletesebben ki fogom fejteni később, milyen szituációkat tudok én elképzelni, ahol ezt hasznosítani lehet..
