A
kalandjáték „lelke” – azaz legfontosabb, legbonyolultabb és legtöbbet
foglalkoztatott része – a beadott mondatokat értékelő programrész
(parancsértelmező, szövegértelmező, értelmező, fordító, vagy angolul
„parser”, „interpreter” stb.). Hiába a legkáprázatosabb szobor-kompozíció,
ha az egy bevakolt szobában, a látogatók elől elzárva hever, úgyhogy
kívülről senki sem férhet hozzá. Számunkra is egyik leglényegesebb
kérdés, hogy a programunkban tárolandó világba miképpen kapjon
betekintést a játékos. Egy kritikus megjegyzés szerint a kalandjátékok
a „néma gyereknek anyja sem érti a szavát” közmondáson alapulnak,
és ez eleinte valóban így is szokott lenni: ha valaki csak úgy
leül egy ilyen játék elé, az leginkább egy üres beviteli mezővel
találja magát szembe, és fogalma sincs róla, mit várnak el tőle.
A más helyeken általánosságban kialakult szokások ugyan segítenek
kissé eligazodni egy új programban is, de legjobb egy teljesen
laikus felhasználót feltételezni. Sohasem tudhatjuk előre, hogy
a – mienkétől esetleg teljesen elütő észjárású – kalandozónak
miféle ötletei támadnak, ezért a játékok intelligenciájának fokmérője,
hogy ugyanannak a szándéknak a megnyilvánulásait milyen sokféle
különböző formában képesek azonosítani. Például, ha egy ház kijárata
egy délkeletre nyíló ajtó, akkor nem elég a programot csak a DK,
DÉLKELET, MENJ DÉLKELETRE… stb. típusú parancsok fogadására fölkészíteni,
elvégre a szemfüles játékos teljes lelki békével nyilatkozhat
úgy is, hogy MENJ KI A KERTBE, HAGYD EL A HÁZAT, TÁVOZZ, LÉPJ
ÁT AZ AJTÓN… – és még hosszan sorolhatnánk ugyanannak a mozgásnak
a különféle megfogalmazásait. Minél több ilyen azonos értékű kifejezéssel
elboldogul, annál színvonalasabb lesz a programunk, és a játékosok
is annál jobban fogják élvezni! Régebben, amikor még a 16-, 48-,
64-kbyte-os mikroszámítógépek jelentették – a játékpiacon – az
általánosan elfogadott szintet, elegendő volt azok teljesítőképességére
hivatkozni, ami a játékok lehetőségeit is eleve behatárolta. Ma
viszont, amikor egy PC nemritkán akár 32-64 MB RAM-ot is rejteget,
s a processzorok sebessége is hihetetlen értékeket produkál, ráadásul
mindez folytonosan egyre tovább bővül (és ki tudja, hová vezet
mindez?!…), a fizikai korlátok egyszerűen megszűnnek létezni:
egy kalandjáték színvonalát most már egyedül a készítője lustasága,
vagy fantáziája, szókincsének bősége (vagy prózaibb okok közül:
a készítésre rászánt idő…) határozza meg. De tény, hogyha egy
ÜSD LE A RABLÓT mellett azt is magunkénak akarjuk tudni, hogy
LÁSD EL A BAJÁT A RABLÓNAK, az nemcsak egyszerűen a szótár bővítését
jelenti, hanem efféle szóvirágok kezelésével a kód is egyre bonyolultabbá
válik…
Na
de túlságosan előre szaladtunk (ez lett volna a bevezető ugyanis…):
hogyan is szólunk egyáltalán egy ilyen játékhoz? Valamit ugyebár
cselekedni óhajtunk benne, és ezt a közvetítő programnak az értésére
próbáljuk adni: szándékunkat egy megállapodás szerinti nyelv szabályain
keresztül kell megfogalmaznunk. Legjobb (volna), ha ez a nyelv
mind közelebb áll(na) a természetes beszélt nyelvhez – de ahhoz,
hogy ezt maradéktalanul megvalósítsuk, egy olyan „számítógépet”
kellene építenünk, melyben – mint régi szélhámos sakkautomatákban
– benne ül egy ember… Megközelíteni azonban lehet – pontosabban
azt a látszatot kelteni, mintha megközelítettük volna.
Általános
szabály, hogy mindinkább egyszerűnek, spontánnak és magától értetődőnek
látszik valami a felhasználó szemszögéből nézve, annál nagyobb
apparátust kénytelen a programozó megmozgatni hozzá, hogy egyáltalán
működjön a dolog. A kívülálló számára természetes a nyelv, amelyen
beszél, a legcsekélyebb szellemi erőfeszítés nélkül helyezi egymás
mellé a szavakat. Fogalma sincs róla, milyen egy irdatlanul bonyolult
rendszernek a birtokában van, s hogy a szerencsétlen programozó
mennyit izzad vele, míg végül valami, ehhez úgy-ahogy hasonlót
nagynehezen kiprésel magából. Különösképp érvényes ez a magyar
nyelvre. Világszerte a kalandjátékok túlnyomó többségét angol
nyelven írták. Ez nemcsak a nyugati régió egyik legáltalánosabb
nyelve, de egyszersmind a legegyszerűbb nyelvtani szerkezetűek
közé is tartozik – ezért is olyan könnyűszerrel megtanulható,
mint köztudott róla. Az angol nyelv nem (vagy csak elvétve) használ
ragokat, jeleket, maguk a szavak többnyire változatlanok maradnak,
helyette a köztük fennálló viszonyt az erősen kötött szórend és
az elöljárók mutatják meg. A főneveknek nincsenek nemeik, és még
csak a magázódást sem ismeri. Összetett szavak képzése is úgy
történik, hogy egyszerűen egymás mellé raknak két darab névszót,
s legtöbbször még csak egybe sem írják őket (vagy ha mégis, akkor
kötőjellel). Semminemű ékezetet nem használnak, az összetett hangzókkal
sincs különösebb gond. Egyszóval, akárcsak az akácfa vagy a káposztalepke,
az angol nyelv is alapvető igénytelenségének köszönheti azt, hogy
világszerte elterjedhetett… Nézzük meg, hogyan hangzik angolul,
ha valakit megkérünk rá, hogy nyissa ki az ajtót: OPEN THE DOOR
(esetleg még hozzátehetjük, hogy PLEASE – de ennek most semmi
jelentősége nincsen). Az egész felszólítás két egyszerű szóból
tevődik össze (a névelővel most nem foglalkozunk, azokat szimplán
át lehet lépni): OPEN és DOOR, melyek – bármilyen összefüggésben
is használjuk őket – minden esetben változatlanok maradnak, nem
számítva az időnként a végükre kerülő „-s” betűt vagy „-ing” végződést,
így egy szótárból kikeresve szemvillanás alatt azonosítani lehet
őket. Ráadásul a mondat szórendje is szigorúan kötött (nem mondhatjuk
pl. azt, hogy DOOR OPEN), tehát bizonyosan tudjuk róluk azt is,
hogy az első az ige és a második a főnév. (Itt most csak a kalandjátékok
irányításához felhasznált nyelvről esik szó.) Bővítsük most egy
határozóval ezt a mondatot! Tegyük fel, hogy kulccsal szeretnénk
kinyitni az ajtót. Ez esetben így hangzik: OPEN THE DOOR WITH
KEY. A szórend most is kötött, és mindössze annyi a különbség,
hogy a WITH elöljárót követő főnevet, mint eszközhatározót vesszük
figyelembe, nem pedig, mint tárgyat.
Ugyanez
magyarul már jóval keményebb diót jelent. Hogyan is fordítanánk
le az előbbi példákat úgy, hogy értelmesen összefüggő mondatokat
kapjunk? Valahogy így: NYISD KI AZ AJTÓT (ha netántán magázódunk
a programmal, akkor a NYISD helyett NYISSA áll…), vagy ha nem
parancsolgatni akarunk, akkor mondjuk KINYITOM AZ AJTÓT. De mi
van akkor, ha NYISD KI AZ AJTÓT KULCCSAL helyett mi inkább úgy
fogalmaznánk, hogy NYISD KI KULCCSAL AZ AJTÓT? Vagy: KULCCSAL
NYISD AZ AJTÓT KI? Esetleg: AZ AJTÓT A KULCCSAL NYITOM KI?… Folytathatnánk
a sort: valamennyi értelmes, és – a hangulati árnyalatoktól eltekintve
– ugyanazt jelentik. A szórend itt már semmiféle támpontot nem
nyújt, hiszen gyakorlatilag korlátlanul szabad – a szavak értelmét
egymástól elszakítva, önmagukban kell megtalálnunk. De miképpen
döntsük el, hogy egyáltalán melyik szóról van szó? Hiába szerepel
a szótárunkban a NYIT ige, ha egyszer nekünk olyanokat írnak,
hogy NYISD, NYISSA, KINYITOM, NYITOM… – és még vagy százféle különböző
ragozott alak. Még ha attól eltekintünk is, hogy az igekötővel
egybe- avagy különírjuk-e az igét, akkor is mennyi lehetőség marad!
A főnevek ragozása ugyancsak egy cifra eset. Már maga a legalapvetőbb
tárgyrag sem pusztán csak egy „-t” betűből áll: magánhangzós végű
szavaknál ékezetet kap az utolsó betű (pl. alma – almát), néha
kimarad egy hangzó (bokor – bokrot, tükör – tükröt), hosszú magánhangzók
rövidülhetnek (ég – eget, tűz – tüzet), azután meg ott vannak
a különféle kötőhangok is (-at, -et, -ot, -öt), minden szóhoz
más-más fajta. Minden egyes határozónak saját ragja van: -ba,
-be, -ra, -re, -n, -on, -en, -ön, -ból, -ből, -ról, -ről, -tól,
-től, -nak, -nek, -hoz, -hez, -höz, -val, -vel, -vá, -vé, -kor,
-ért, -ig… stb. stb. Ebből is van vagy negyven-ötven féle! (A
KULCCSAL ráadásul még egy különleges eset is, hiszen -val, -vel
esetén a „-v-” helyett duplázódik az utolsó betű, s miután „cs”-ről
van szó, még csak nem is az „s”, hanem a „c” betű…) Amennyiben
emellé még a többesszám és birtokos eset jeleit is engedélyezzük,
úgy az előbbi mennyiség ezek számával szorzódik (!!!), tehát végeredményben
minden egyes főnévnek többszáz féle különböző ragozott alakja
lehet! Ha a szótárunk mondjuk ezer szóból áll, akkor a kereséskor
ez több százezer szóval való összehasonlítást jelent, ami már
önmagában véve is egy képtelenség; nem beszélve arról, hogy lehetetlen
volna ennyi alakot mind-mind letárolni. Megabyte-okat foglalna
el, és percekig tartana megtalálni benne valamit…
A
legegyszerűbb, korai, igénytelen játékokban még kikerülték ezt
a problémát, ahelyett, hogy megbirkóztak volna vele. Valamiféle
hallgatólagos megállapodással kialakítottak maguknak egy ún. „csonka
magyart” – ezalatt a nyelvnek egy roppant alacsony szintre csökkentett
változata értendő. Az angol forráshoz igazodva, azonos sorrendű
szópárokat várt el bevitel gyanánt a program, és kizárólag a szavak
ragozatlan szótári alakját lehetett alkalmazni benne. Az idézett
parancsok így hangzottak ezen a nyelven: NYIT AJTÓ, ill. NYIT
AJTÓ KULCS… Némelyest fifikásabb, de éppilyen gépies és felszínes
megoldásnak bizonyult az is, amikor a szavak első néhány betűje
alapján kerestek a szótárban (többnyire az első háromtól az első
ötig terjedt ez a hossz). Például egy program az első négy betűt
vette figyelembe, s ezáltal a NYISS ABLAKOT utasításból ennyit
látott csak: NYIS ABLA. A szótárban ennek alapján egységesen négybetűs
jelsorozatok voltak tárolva, az ennél rövidebb szavaknak – vagy
amelyek töve megváltozott, mint a NYIT ige esetében a „t” és az
„s” betű – természetesen föl kellett venniük a ragozott alakjait
is. (A CSOMÓ és a CSOMAG szavakat már nem is tudta volna megkülönböztetni
egymástól.) Amennyiben igényesebb programokat szeretnénk írni,
nem elégedhetünk meg ezekkel a primitív mankókkal! Meg kell tanítanunk
beszélni azt a buta ócskavast…
Szükség
lesz tehát egy algoritmusra, mely a szótárban külön-külön meglévő
szótövek és ragok alapján dolgozik, és mindkét irányú működésre
képes: egyrészt a begépelt szavakat szétbontja szótőre és ragokra
(ezeket a programon belül majd sorszámmal fogjuk azonosítani),
vagyis értelmezi azokat – másrészt fordítva: a megadott szónak
előállítja a megadott típusú ragozott alakját. (Erre azért lesz
szükség, hogy parancsunkra a számítógép válaszolni is tudjon,
azaz ki tudja írni helyesen a képernyőre a neveket.) Figyelembe
kell vennie bizonyos szavak különleges tulajdonságait is (épp
az imént említettük őket: kulccsal, tükröt, nyisd…), és különbséget
kell tennie az igék és főnevek teljesen eltérő ragozása közt.
Fontos követelmény még, hogy megfelelően gyors legyen: elvégre
a legegyszerűbb mondatok is min. három-négy szóból állanak, de
mint később látni fogjuk, ennek akár a sokszorosát is kaphatjuk
– a szótár pedig nyugodtan állhat akár többezer szóból is.