Wordle játék 2. – teljes GUI alkalmazás

Most folytatjuk az előző bejegyzésben elkezdett Wordle játék asztali változatának elkészítését.

Először a játékot megjelenítő grafikus felületet gondoljuk át, és kódoljuk le a tkinter modul szolgáltatásait igénybe véve.

A játékterület lényegében egy olyan táblázat megrajzolását igényli, amelynek 5 oszlopa és alapban 8 sora van, de ez utóbbi legyen beállítható. Ezt egy keret grafikus elemmel (Frame widget) valósítjuk meg, és helyezünk le a pack() metódussal a főablakban. E kereten belül hozzuk létre a táblázatot úgy, hogy 5*8 db kis keret elemet helyezünk le táblázatos elrendezésben a grid() metódussal. E kis keretek azért kellenek, hogy a cella méreteit tervezhetően be tudjuk négyzet alakra állítani. Az egyes cellákba kell, hogy tudjunk írni, ezért beviteli mezőket (Entry widget) hozunk létre és helyezünk le a kis keretekbe a pack() metódussal.

Minden egyes beviteli mezőhöz egy kontrollváltozót rendelünk, amelyeket egy szótár értékeiként tartunk nyilván, amely értékek kulcsai a táblázat megfelelő sor- és oszlopindexeiből képzett tuple objektumok.

/E grafikus felület kialakítása sok hasonlóságot mutat egy korábbi bejegyzésben szereplő Sudoku táblázatéval/

A játék elindítása után a beviteli mezők – az első sor kivételével – csak olvasható állapotban vannak, és a következő sor csak akkor válik írhatóvá, ha a tippelésünket egy nyomógomb lenyomásával rögzítettük, és a tippelt szó kiértékelése sikeresen megtörtént.

A mindenkor aktuális táblázatsort, vagyis amelybe a tippelt szót írhatjuk, egy, a sor indexét tároló változóval tartjuk nyilván.

A táblázatba bevitt tartalom – a tippelt betűk – feldolgozásra küldéséhez egy nyomógomb vezérlőelemet hozunk létre és helyezünk el a pack() metódussal a főablakban a táblázat alatt. E gomb megnyomására a játékmenet() nevű függvény lesz meghívva, amely kiértékeli a tippelt szót és ennek megfelelően vezérli a játékot.

Az alábbiakban láthatjuk a fenti elvek alapján megvalósított grafikus felület kódolását, illetve a teljes játékot:

Mivel a játékmenet vezérlését végző függvénynek központi szerepet van a program működési logikájában, ezért az alábbiakban ennek működését részletezzük.

A játékmenet() függvény irányítja a bevitt adatok feldolgozását, és ennek alapján a grafikus elemek jellemzőinek változtatását. E feladatát több másik függvény hívásával teljesíti. Ebből kettőt felette, hármat alatta látunk. A két felette levő függvény szerepét az előző bejegyzésben láttuk. A három másik függvény közül a beviteli_mező() egy segédfüggvény, amelyet az alatt levő másik kettő használ, és amely a táblázat adott sor- és oszlopindexével azonosított cellájához tartozó beviteli mező típusú grafikus elemet adja vissza. A betűszínek_beállítása() függvény egy adott sorban szereplő beviteli mezők háttérszínét, a tippsor_feloldása() függvény pedig a mezők állapotát módosítja a csak olvasható állapotból normál állapotba váltással, ami lehetővé teszi, hogy írni lehessen a mezőbe.

A játékmenet() függvény a következőket végzi:

  1. A beviteli mezőkbe írt betűkből előállítja a tippelt szót karakterlánc formában.
  2. Ha a játéktábla rendelkezésre álló utolsó sorába írt szó helytelen, akkor nem sikerült megnyerni a játékot. Ekkor egy tájékoztató üzenetablakot dob fel, amely erről tájékoztat, és kiírja, hogy mi volt a kitalálandó szó. Az ablak bezárása után kilép az alkalmazásból.
  3. Ha még nem vagyunk az utolsó sorban, akkor ellenőrzi, hogy a tipp érvényes ötbetűs magyar szó-e. Ha nem, akkor egy üzenetablak figyelmeztet erre. Ennek bezárása után az aktuális tippsorban új szó beírásával próbálkozhatunk.
  4. Ha a tippelt szó szerepel az ötbetűs magyar szavakat tároló listában, akkor meghívja a tippelés_kiértékelése() függvényt, amelynek visszatérési értéke egy ötelemű lista, amelyben az egyes indexekhez tartozó elemek a betűk megfelelősége szerinti színek nevei. E nevek már olyan karakterláncok, amelyek közvetlenül alkalmazhatók a mezők háttérszínét meghatározó konfigurációs paraméter értékeként.
  5. A színek neveinek ismeretében beállítja az aktuális tippsor mezőinek háttérszíneit a betűszínek_beállítása() függvény meghívásával.
  6. Ha sikerült eltalálni a rejtett szót, akkor erről egy üzenetablak tájékoztat. Ennek bezárása után kilép az alkalmazásból.
  7. Ha nem sikeres a tipp, akkor a következő sort írhatóvá teszi a tippsor_feloldása() függvény meghívásával, majd eggyel megnöveli az aktuális sor indexét tartalmazó változó értékét.

Az így elkészített alkalmazás elindítása után lefutó játszma bizonyos fázisainak képernyőképeit láthatjuk az alábbi képen.

Aki kedveli ezt a játékot, és szeretné többször egymás után játszani, annak érdemes megírni ilyen asztali változatban, mert az online webes változatokban többnyire korlátozott a napi játékok száma.

A programozási feladatoknak általában több megoldása lehetséges. A most bemutatott programkód is csak egy a lehetséges megvalósítások közül. Érdemes lehet elgondolkodni más kódstruktúrán (pl. osztályba helyezni az alkalmazást és metódusokként definiálni a függvényeket), illetve más feldolgozási logikát kigondolni (pl. nem halmazműveleteken alapulót). Lehet, hogy találunk egyszerűbbet vagy jobbat, de ha mégsem, amit mindenképp nyerünk az a problémamegoldó képességünk és a nyelvi jártasságunk fejlődése.

Ugyanezeket erősíthetjük, ha továbbfejlesztjük a programot. Csak példaként: nyerés esetén ne záródjon be, hanem egy gomb megnyomásával új játék legyen indítható; legyen lehetőség a játékidő mérésére; lehessen az ötbetűs magyar szavak listáját tartósan bővíteni a beírt, de nem elfogadott szóval, stb.

Kellemes játékot!

Ha a programban alkalmazott valamely nyelvi elem és szerkezet nem lenne ismert, vagy használata pontos módjában bizonytalanok lennénk, ismertetésük a Python tudásépítés lépésről lépésre című e-könyvben példákkal együtt megtalálható.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.