Az ML programozási nyelv

Példaprogramok

Kitten escape

screenshot of kitten escape game

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