Kitten escape
A feladat megfogalmazása
Kiszökött a cicánk.
Nem mehet ki a telkünkről, mert odakint sok veszedelem leskelődne rá.
Ezért hát párnákat rakunk az útjába, ezzel próbálva bekeríteni.
Ha végleg meglóg, sajnos vesztettünk.
Ha viszont sikeresen bekerítettük, hazavihetjük és adunk neki egy kis friss tejet!
Szerző neve
Nagy Tamás, MSc hallgató
Készítés éve
2012
Használt fejlesztőkörnyezet - különösképp a fordítóprogram
Ubuntu 11.10, Ocaml csomag, ocaml interpreter és ocamlc fordító.
Bár lett volna rá lehetőség, a felület egyszerű, de a szabványostól eltérő struktúrájára való tekintettel nem került sor Glade felhasználói felület szerkesztő és leíró alkalmazására.
Kiemelt kódrészletek
A következő megadja, hogy a táblán van -e az adott kocka:
let on_board x y =
x >= 0 && x < size && y >= 0 && y < size
Egy párna lerakásának kezelése.
let brick board ~x ~y =
if get board x y = `none then begin
set board ~x ~y ~color:`white;
true
end else false
Segédfüggvény ami visszaadja egy kocka szomszédainak indexeit forrásiránnyal annotálva:
let neighbors dir (x,y) =
let shift = y mod 2 in
let offsets = [(-1,0); (1,0); (shift-1,-1); (shift,-1); (shift-1,1); (shift,1)] in
map (fun (dx,dy) -> (dir,(x+dx,y+dy))) offsets
Szélességi keresés amivel a kisállat megkeresi a legrövidebb kiutat:
let rec wide tab queue =
match queue with
| [] -> []
| (dir,(hx,hy))::tl ->
let dir2 = match dir with | [] -> [(hx,hy)] | _ -> dir in
if on_board hx hy then
if tab.(hx).(hy) then begin
tab.(hx).(hy) <- false;
let queue2 = List.append tl (neighbors dir2 (hx,hy)) in
wide tab queue2
end
else
wide tab tl
else
dir2
A szélességi keresés ráhívása, a szomszédok elő-lekérdezése a kezdő irány beállítása miatt kerül ide is ki:
let kitty board kx ky =
let tab = Array.init size ~f:(fun i -> Array.init size ~f:(fun j -> get board ~x:i ~y:j <> `white)) in
wide tab (neighbors [] (kx,ky))
A kedves jószág léptetése:
let move board kx ky tx ty =
set board ~x:kx ~y:ky ~color:`none;
if on_board tx ty then
set board ~x:tx ~y:ty ~color:`black
Érdekességek
A megjelenő piktogramok xpm formátumban 1-1 változóban látványosan szerepelnek.
Jövőbeli teendők
- Objektumszerkezet finomítása. Az első implementáció sietős volt, és kevés refaktorálásra volt lehetőség.
- A szélességi keresésnél a segédtábla mutabilitása nem szükséges, ott pár sort átfogalmazni.
- A végén talán jobb lenne egy dialógusablak az eredményről, és a státuszsor elhagyható lenne.
- A forrás rövidítése, esetleg kettéőgaztatása egy minimális mintapélda és egy teljesebb játék vonalra.
- Táblaméret beállításának kivezetése.
- Automatikus újrakezdés.
- Pontozás lépésszám vagy idő alapján.
- Hi-score lista.