Wordle játék 1. – szógenerálás és kiértékelési logika

Mi a Wordle, és hogyan kell játszani?

A Wordle egy szókitalálós játék, amelynek leírását megtaláljuk a neten, sőt online ki is próbálhatjuk akár az angol akár a magyar változatot. Ettől függetlenül a program megírásához összefoglaljuk most a szabályokat.

A játék lényege, hogy egy 5 betűből álló rejtett szót kell kitalálni adott lépésszámból. Az eredeti angol nyelvű verzióban ez 6 lépést jelent. Mivel a magyar ábécé több betűből áll, mint az angol, így nehezebb a megfejtés, ezért 8 tippelési lehetőség áll rendelkezésre.

A játékosnak be kell írni a tippelt szó betűit öt mezőbe. Ha a tippelt szó valamely betűje

  • benne van a rejtett szóban és jó helyen is van, akkor e pozícióban levő tippelt betű zöld háttérszínű lesz.
  • ugyan benne van a rejtett szóban, de nem jó pozícióban, akkor e tippelt betű sárga színű lesz.
  • nem szerepel a rejtett szóban, akkor e betű szürke háttérszínnel jelenik meg.

A játékprogram két fő része a rejtett szó generálása, valamint a tipp-kiértékelő algoritmus. Ezeket fogjuk ebben a bejegyzésben lekódolni. Az ezután következőben pedig megírjuk a teljes GUI alkalmazást.

Rejtett szót tesztelés céljából rögzíthetünk a forráskódban. Azonban ahhoz, hogy élesben lehessen játszani – amikor magunk sem tudjuk, hogy mi a rejtett szó – kell a magyar szavak listája. Némi kereséssel az interneten találunk letölthető .txt szövegfájlokat. Ezek nem biztos, hogy minden magyar szót tartalmaznak, de kezdetben ez nem is lényeges, mert e fájlt később tetszés szerint bővíthetjük. A lényeg, hogy legyen egy ilyen fájlunk lementve egy mappába.

Az 5-betűs szavak listájának előállításához először be kell olvasni a fájlból a szavakat. Ezt most nem a hagyományos módon, az open() függvénnyel hajtjuk végre, hanem a szabványos könyvtár pathlib modulja Path objektumát használjuk. Tesszük ezt azért, mert röviden, egyetlen sorban, de mégis áttekinthetően lehet a beolvasást végezni, másrészt a pathlib modul egy korszerű, a fájlkezeléshez jól használható, széles szolgáltatásválasztékot nyújtó modul, amivel érdemes megismerkedni, ha még nem tettük. / A Python tudásépítés lépésről lépésre című e-könyvben erről nagyon részletesen, a „Mentsük, ami menthető! – fájlok és mappák” fejezetének „Könyvtár és fájl kezelés” alfejezetében olvashatunk/

A Path argumentumaként megadjuk a fájl útvonalát, majd a read_text() metódussal egy karaktersorba beolvassuk a szavakat. Mivel a szavak a fájlban sortöréssel vannak elválasztva, ezért az egyes szavakat a split() metódussal különítjük el egy listába.

Ezt követően a szólistából leválogatjuk az ötbetűs szavakat.

Végül az ötbetűs szavak listájából egy kitalálandó, rejtett szót véletlenszerűen kiválasztunk. Ehhez most a random modul randint() függvényét használjuk. /Erről az e-könyvben a „Matematikai számítások támogatása” alfejezet „A véletlen használatba vétele” cím alatt van szó/

Az eddig felsorolt műveleteket láthatjuk alább:

Térjünk most rá a tippkiértékelő algoritmus leírására. Ez a következő lépésekből áll:

  1. Meghatározzuk és eltároljuk a rejtett és tippelt szóban közös betűket.
  2. Meghatározzuk és eltároljuk, hogy a rejtett szóban az egyes közös betűk milyen indexpozíciókban vannak.
  3. Meghatározzuk és eltároljuk, hogy a tippelt szóban az egyes közös betűk milyen indexpozíciókban vannak.
  4. Egy ötelemű listát hozunk létre, amely azt fogja tárolni, hogy a tippelt szó egyes indexpozícióihoz milyen háttérszín tartozik minden kiértékelés után. E lista minden eleme szürke értéket kap létrehozáskor. Ha van találat, akkor az adott pozícióban felülírjuk az értéket sárga vagy zöld színnel.
  5. Egymás után sorban végigvesszük a közös betűket, és
    • Meghatározzuk és eltároljuk egy adott közös betű pozíciói (indexi) közül az azonosakat. Ezek jelentik azon betűk pozícióit, amelyek szerepelnek mind a rejtett, mind a tippelt szóban és jó helyen is vannak. Ezért a színlistánkban ezen átfedő indexpozícióknál az értéket zöldre állítjuk be.
    • Miután lekezeltük a jó pozícióban levő tippelt betűket, ezeket kivesszük mind a rejtett, mind a tippelt szó adott közös betűhöz tartozó indexei közül. Az így fennmaradó két index-nyilvántartás azt mondja meg, hogy az adott közös betű mely pozícióban van a rejtett szóban és mely pozícióban a tippelt szóban. Ezekben most már nem lesz egyezés, hiszen az azonos indexeket kivettük. A számosságukban is eltérhetnek, hiszen lehet, hogy a tippelt szóban az adott közös betű egyszer szerepel, míg a rejtett szóban többször, vagy fordítva.
    • Az előző pontban kapott két indexhalmazból a kisebb számosságú elemszámát vesszük, és ennyiszer kiveszünk a tippelt szó adott közös betűjének indexnyilvántartásából egyet. A színlistánkban ezen indexpozíció(k) értékét sárgára állítjuk.
  6. Az így kialakult színlista képezi az algoritmus végeredményét, amely tehát azt mutatja meg színekkel, hogy az öt betűpozícióban mely betű(k) van(nak) a helyén/helyükön (zöld), melyek szerepelnek a rejtett szóban, de nem jó a helyük (sárga), és melyek azok, amelyek nincsenek a rejtett szóban (szürke).

A fenti megfontolások szerint megalkotott függvények a következők:

A következő bejegyzésben a grafikus interfészt és a működő alkalmazás kódjának elkészítésével folytatjuk.

É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.