A számítógép beszélni tanul

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.


Következő: „A szavaktól a mondatok felé”

 

 

A kalandjáték fogalmának tisztázása

Kalandjáték és mitológia

A számítógép beszélni tanul

A szavaktól a mondatok felé

Helyiségek összefüggő labirintusa

Barangolás a térképen

Lakberendezővé változunk

Hogyan találjunk meg valamit

„Sokasodjatok és növekedjetek”

Az idő kerekéhez kötve

Néhány jótanács és további lehetőségek

A program működésének leírása

Használati útmutató