Támogatjuk a keresztrejtvények készítését Java programmal. A program grafikus felülete eszköztárból és a keresztrejtvényből áll. Az elkészült programban 10×10-től 15×15-ig beállítható négyzetrács készíthető elő. A tiltott négyzetek száma 15-től 30-ig beállítható. Mivel a tiltott négyzetek helyzete véletlenszerű, így nem biztos, hogy az elsőre jó/szerencsés lesz, ezért újragenerálható a négyzetrács. A program a tipikus követelményeknek megfelelően sorfolytonosan sorszámozza a négyzetrács elemeit, ami alapján megadhatók hozzá a vízszintes és függőleges feladványok. A program az elfogadott négyzetrácsot többféle képformátumban is el tudja menteni.
Az elkészült Java program grafikus felülete
Objektumorientált tervezés
A keresztrejtvény ábrája egy négyzetrácsból áll, amelyben rejtvénymezők helyezkednek el. A rejtvénymezőnek megfelel egy örökítéssel felüldefiniált címkekomponens. A rejtvénymezőt körülveszi egy szegély/keret, tiltott vagy sem állapotától függően fekete vagy fehér a háttérszíne, valamint van a bal felső sarkához igazított kis méretű betűvel nem kötelezően megjeleníthető sorszáma. A tiltott és sorszám tulajdonságait kell tudni beállítani és megkérdezni. Ez a feladatban a RejtvenyMezo POJO. A négyzetrács sorai és oszlopai azonos méretűek (pixelre és darabszámra egyaránt).
Algoritmus a keresztrejtvény sorszámozására
A rejtvénymezők kétdimenziós négyzetes mátrixban/tömbben helyezkednek el. A sorszámozáshoz hasznos, ha a négyzetrácsot körbeveszi egy tiltott rejtvénymezőkből álló keret. Először a rács sorain és oszlopain végighaladó egymásba ágyazott ciklusok létrehozzák a POJO-kat úgy, hogy a négyzetrács keretén lévő rejtvénymezők tiltottak, a többi nem tiltott. Ezután véletlenszerűen ki kell választani – a még nem tiltottak közül – a szükséges mennyiségű tiltott rejtvénymezőt. Ezután sorfolytonosan sorszámozni kell azokat a rejtvénymezőket, ahol vízszintes vagy függőleges feladvány kezdődik. Ehhez is két egymásba ágyazott ciklus kell, amelyben minden még nem tiltott rejtvénymező egyre növekvő sorszámot kap, ha tőle balra tiltott és tőle jobbra nem tiltott rejtvénymező helyezkedik el, de akkor is, ha felette tiltott és alatta nem tiltott rejtvénymező található.
A keresztrejtvényt sorszámozó algoritmus Java megvalósítása
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
private RejtvenyMezo[][] keresztrejtveny( final int RACS_MERET, int TILTOTT_DB) { RejtvenyMezo[][] t=new RejtvenyMezo[RACS_MERET+2][RACS_MERET+2]; for(int i=0; i<=RACS_MERET+1; i++) for(int j=0; j<=RACS_MERET+1; j++) t[i][j]=new RejtvenyMezo(); for(int i=1; i<=RACS_MERET; i++) for(int j=1; j<=RACS_MERET; j++) t[i][j].setTiltott(false); int tiltottDb=0; while(tiltottDb<TILTOTT_DB) { int i=(int)(Math.random()*RACS_MERET)+1; int j=(int)(Math.random()*RACS_MERET)+1; if(!t[i][j].isTiltott()) { t[i][j].setTiltott(true); tiltottDb++; } } int sorszam=1; for(int i=0; i<=RACS_MERET+1; i++) for(int j=0; j<=RACS_MERET+1; j++) if(!t[i][j].isTiltott()) if((t[i-1][j].isTiltott() && !t[i+1][j].isTiltott()) || (t[i][j-1].isTiltott() && !t[i][j+1].isTiltott())) { t[i][j].setSorszam(sorszam); sorszam++; } return t; } |
Továbbfejlesztési lehetőségek
- A feladványok listázhatók és kideríthető a hosszuk.
- A tiltott rejtvénymezők véletlenszerű elhelyezése helyett lehetne valamilyen szabály, stratégia az egymáshoz való helyzetükre, távolságukra, közvetlen szomszédságukra vonatkozóan. Figyelembe vehetnénk valamilyen szimmetriát is, mintákat, alakzatokat is. Véletlenszerű elhelyezésük nem biztos, hogy mindig jó/szerencsés: például a tiltott rejtvénymezők körbezárhatnak egy nem tiltottat, hosszabb feladványokat nehezebb találni…
- A Java SE szoftverfejlesztő tanfolyam tematikájához kötődően többféle szótárból, fájlformátumból betölthetünk a feladványokhoz használható, például 7 betűs országnevek, 2 betűs kémiai elemek, női/férfi keresztnevek, autójelek, pénznemek, szinonimák…
- A Java EE szoftverfejlesztő tanfolyam tematikához kötődően többféle webes adatforrásból, Wikipédiából, szótárból, API hívásokkal letölthetünk a feladványokhoz használható listákat, meghatározásokat, kulcs-érték párokat. A swing-es felületet lecserélhetjük böngészőben futó webes GUI-ra is.
- A Java adatbázis-kezelő tanfolyam tematikájához kötődően a fentiek kiegészítéseként tervezhetünk és építhetünk helyben tárolt tudástárat, adatbázist, amiből hatékonyan lekérdezve adhatunk feladványokat a keresztrejtvényhez.
- Miután a fentiek szerint valahogyan – tipikusan visszalépéses algoritmussal – meghatároztuk a feladványokat, a keresztrejtvényből menthetünk kitöltött változatot is.
A bejegyzéshez tartozó teljes forráskódot ILIAS e-learning tananyagban tesszük elérhetővé tanfolyamaink résztvevői számára.
Nem a programozáshoz, de a keresztrejtvényekhez kötődik Sandra Bullock egyik 2009-es filmje: Ő a megoldás (eredetiben: All about Steve). Kell ehhez (is) egyfajta kattanás.
Az is izgalmas lenne, ha nem az előre generált négyzetrácshoz keresnénk a feladványokat, hanem azok alapján – valamilyen visszalépésben – utólag meg tudnánk változtatni a négyzetrácsban a tiltottak számát/pozícióját.
Egyetértek Balázs. Mindkettővel. 😉
A jövő heti JavaSE és JavaEE óráinkra házi feladat az alábbi 3 továbbfejlesztés, ILIAS fórumban megvitatva, ki-hol-tart-azon-a-szinten-próbálkozva, a lenti kép alapján:
A harmadik még nem ment, de kitaláltam másik kettőt:
A képes ötletedre nézünk majd példát Jani az orientáló modul egyik óráján.
Íme némi történeti kitekintés:
Az első keresztrejtvényt az angol Arthur Wynne készítette, aki a New York World újság hétvégi mellékletének szórakoztató anyagaiért felelős szerkesztője volt. Az volt a dolga, hogy fejtörőket, rejtvényeket és gyors, egyszerű szójátékokat találjon ki az olvasók szórakoztatására. Az említett újságban 1913. december 21-én jelent meg az első keresztrejtvény. 1914 óta már a fenti blog bejegyzésben szereplő számozással kiegészítve jelentek meg a keresztrejtvények.
Van egy keresztrejtvény tankockánk is:
Tankocka – Keresztrejtvény: programozási tételek