3. kodused ülesanded

Üldinfo

Lahenduste esitamise tähtaeg on 14.12. Lahendused saata mailiga kas varmo@cs.ut.ee või nestra@cs.ut.ee (sõltuvalt sellest, millises praktikumi rühmas olete); subjektiks peab olema fpkodu3. Seekord on ainult üks ülesanne, mille eest on võimalik saada kuni 50 punkti. Hilinenud lahenduste korral väheneb punkti summa 10% iga hilinenud päeva kohta. Näiteks, kui lahendus on väärt 50 punkti, aga jõuab meieni 16.12 (so. kaks päeva hiljem), siis on tegelik punktisumma 50 * 0.9^2 = 41.

Vormistamisest

Lahendus tuleb vormistada ühe Haskelli failina. Faili nimi peab olema Chess.hs ning seal defineeritava mooduli nimi Chess. Faili algusse lisada kommentaaridena kõigi rühmaliikmete nimed (rühmas võib olla max. 4 liiget, kusjuures kõigil peab olema sama praktikumi juhendaja) ja maili-aadressid. Kõigi ülesannete korral peavad protseduuride nimed ja argumentide arv/järjekord vastama täpselt ülesandes esitatule. Lahendused peavad olema loetavad ja piisavalt kommenteeritud (sh. kui kasutate abiprotseduure, siis see mida nad teevad peab olema selgelt välja toodud). Näiteks (Chess.hs):

module Chess (mainLoop) where

---------------------------------------------------------------------
-- Chess.hs
-- Funktsionaalprogrammeerimise meetod - 3. koduülesande lahendus
--
-- Autorid:
--          Jaan    Tatikas   (tatikas@ut.ee)
--          Salomon Vesipruul (salomon@ut.ee)
---------------------------------------------------------------------

data Board = ...

mainLoop :: Maybe Board -> Interact
mainLoop brd = ...

Ülesanne

Kirjutada Haskellis malemängu programm, kus arvutil on vanker ja kuningas ning mängijal ainult kuningas. Arvuti mängib valgetega ja teeb esimese käigu. Arvuti peab olema suuteline võitma vähema kui 30 käiguga. Peafunktsiooni nimi peab olema mainLoop ning selle tüüp:

mainLoop :: Maybe Board -> Interact
Kasutajaga suhtlemine käib Xboardi/Winboardi abil. Xboardiga suhtlemise protokoll on kirjeldatud http://www.tim-mann.org/xboard/engine-intf.html. Xboard tuleb konfigureerida nii, et algseisu määramiseks kasutaks ta setboard käsku. Miniversioonis on Xboardi konfigureerimine ja temaga suhtelmine juba realiseeritud ka lahenduse skelettfailis Chess.hs.

Xboardi all käivitamiseks on peamoodul Main.hs ning käsurida võiks välja näha järgmiselt:

xboard -fcp ./Main.hs -mode MachineWhite
Kui soovite teminali aknast näha, milliseid käske xboardi/teie programmi vahel saadetakse, siis antke lisaks -debug võti; so.:
xboard -fcp ./Main.hs -mode MachineWhite -debug
Kui teil on olemas FEN-kujul algseisude fail (näit. examples.fen), siis saate koheselt sealt laadida esimese seisu kasutades -lpf võtit; näiteks:
xboard -fcp ./Main.hs -lpf examples.fen -mode MachineWhite 

Mängumootori realiseerimiseks võib kasutada (aga ei pea, kui ei taha) moodulit Minimax.hs. Lisaks võib kasutada ka moodulit Interactive.hs ning loomulikult kõiki hugsi standardteeke. (NB! mooduleid Minimax.hs, Interactive.hs ja Main.hs lahenduste saatmisel mitte kaasa panna; saata tuleb ainult fail Chess.hs, kõik teised on testimisel täpselt sellised nagu ülalpool viidatud).

Xboardi setboard käsk saadab algseisu FEN (Forsythe-Edwards Notation) kujul. FENi täpne kirjeldus on esitatud ülaltoodud aadressil; lühikirjeldus on esitatud failis Chess.hs.

Windowsi all tundub, et runhugs ja winboard ei saa omavahel suhtlemisega hakkama ja kogu standard-sisend programmile on ilma reavahetussümboliteta. Võimalikuks lahenduseks on hugs-i asemel kasutada Glasgow Haskelli kompilaatorit GHC. Samuti tuleb main funktsioonis standard-väljundi puhverdamine keelata (vastav muudatus on failis Main.hs juba tehtud). Kompileerimiseks sobib näiteks käsurida:

ghc.exe -fglasgow-exts -o chess.exe Main.hs Chess.hs Interactive.hs
(Siin on võtit -fglasgow-exts vaja, kuna failis Chess.hs on Board tühja definitsiooniga; kui te selle asendate oma definitsiooniga, siis vastavat võtit vaja pole).
Varmo Vene