Unatkoztam

Régen írtam blogot, úgyhogy most írok egyet. :)

Úgy tegnap előtt hajnalban kezdődött az egész. Nem tudtam aludni, aztán valahogy arról kezdtem el gondolkozni, hogy hogyan is kellene megírni egy aknakeresőt. Aztán amikor összeállt a kép, leültem a gép elé és elkezdtem lekódolni a cuccot javascriptben. Régen elég sokat foglalkoztam javascripttel, persze a tudás sokat kopott, de egy ekkora feladatot még meg tudok oldani. Így hát el is készült a nagy mű, erre tessék. :)

Hogyan is működik:

A felül levő mezőkben szerepel a hátra levő aknák száma, illetve az eltelt idő.
Alatta maga a játékmező, bal kattintás feltárja az adott mezőt, jobb kattintás megjelöli. Ha egy mezőnek az összes aknáját megjelöltük, a számra kattintva a maradék mezőket a program feltárja helyettünk.
Ez alatt megadhatjuk, hogy az új játékmező mekkora legyen, és hány akna legyen benne.
Igen, van lehetőség a játék szüneteltetésére.

Ismert hibák:

Amikor egy olyan mezőre kattintunk amiben és akörül nincs akna, a játék automatikusan feltárja azt a területet, amiben nincs akna. Ehhez rekurziót használ. Viszont azt nem sikerült megoldanom, hogy csak annyi művelet hívódjon meg, ahány mező van ezen a területen, így egyes mezőkre többször is meghívódik a függvény. Ez nem gond, mert ha a függvény érzékeli, hogy már jártak az adott mezőben előtte, ki fog lépni, de amíg nem lép ki, foglalja a helyet a stackben. A stack viszon minden böngészőben más és más méretű, gyakran eléggé limitált, pl. gecko alapú böngészőkben alapértelmezés szerint 1000 hely van benne. Ha egy nagy területet kellene feltárni, előfordulhat, hogy túlcsordul a stack, ilyenkor a teljes rekurzió eldobásra kerül, azaz nem fejeződik be a terület feltárása.
Workaround: ne adjunk meg túl nagy méretet (már csak azért se, mert a játékmező legenerálása elég sokáig tud tartani), vagy adjunk meg több aknát.

Operában (9.64) nem megy. Szerintem nem is fog, milyen dolog az, hogy egy browser nem kezeli az oncontextmenu-t? :D Ugyanez Konqueror 3.5.10-ben is.
Workaround: nincs, másik browser? :)

IE-ben (8) a játék végén a gombok elszürkülnek. Ez nem véletlen, a gombokat ugyanis disabled-re állítom, de ettől még nem kellene a gombok szövegszínének elállítódnia.
Workaround: nincs, másik browser?

Amikor egy számra kattintunk, csak azon jelölések helyességét ellenőrzi, ami az adott szám körül van. Tehát ha valahol máshol hibás egy jelölés, azt nem érzékeli.
Workaround: nincs, tulajdonképpen ez nem is bug, hanem feature. :)

A kódon még van mit javítani, egy-két helyen elég gány megoldásokat használok... :)

Megfogott bugok:

Internet Explorerben (8-as verzió), ha egy gombnak nem adunk kezdeti értéket, de javascriptből módosítjuk azt, a gomb lejjebb csúszik az oldalon, ezáltal széthúzva a négyzethálós elrendezést.
Megoldás: adjunk meg kezdeti értéket, például szóközt.

Több játék után az idő gyorsabban telik. Olyan, mintha felhalmozódnának az időzítő függvények, és egyre gyakrabban hívják meg az időt számoló függvényt. Hogy ez miért van, passz.
Megoldva: setInterval-os megoldás lecserélve setTimeout-ra.

Hozzászólások

Szép munka. Pont az aknakeresőt hiányoltam mostanában így Linux alatt, úgyhogy játszottam is vele vagy 20 percet.

Ebből legelősször sikerült első kattintásra eltalálni egy aknát. Eh.

Kde games-ben is van aknakereső, de szerintem vannak kevésbé desktop függő implementációk is. Javascriptben sem ez az egyetlen.
Ez az implementáció eredetileg csak azért íródott, mert kíváncsi voltam, az a mód, amit kigondoltam, helyes-e. Úgy tűnik, hogy nagyjából igen. :)

Az első kattintásra elvileg megoldható, hogy ne legyen akna, csak ugye ehhez kicsit át kellene írni a megfelelő a részeket. Egyelőre hagyom így, mert így van meg a kód logikája.

Kicsit optimalizáltam a generáló függvényen, most már sokkal gyorsabb lesz az új játék elkezdése, ha nem módosítasz a játékmező méretén.
És így pont 300 sor hosszú a kód. \o/ :D