Harjoitustyö 2: Trimok

Kurssin 8101905 toinen harjoitustyö on trimokia annetun rajapinnan kautta pelaavan agentin toteuttaminen. Trimok on kahden pelaajan lautapeli, joka muistuttaa hieman tammea. Trimokin säännöt löytyvät täältä.

Toteutettava agentti

Tehtävänä on kirjoitettaa trimokia pelaava agentti. Jotta agentteja voitaisiin peluuttaa vastakkain tätä varten rakennetussa testipenkissä, tulee agentin toteutuskielen olla ANSI-standardin mukainen C++. Standard Libraryn valmiita tietorakenteita ja algoritmeja saa tässä harjoitustyössä käyttää täysin vapaasti. Agentti kirjoitetaan luokaksi, joka periytetään tiedostossa ~ai/trimok/Pelaaja.h annetusta abstraktista kantaluokasta. Luokan nimen on ehdottomasti oltava muotoa t123456, jossa t-kirjaimen perään on laitettu oma opiskelijanumero. Nimiavaruuksien yhteentörmäysten välttämiseksi kaiken opiskelijan tekemän toteutuksen tulee olla joko edellämainitun luokan tai vaihtoehtoisesti opiskelijan oman nimiavaruuden sisällä. Nimiavaruuden nimen on vastaavasti oltava muotoa n123456.
 

Simulaattori

Trimoksimulaattori, jolla agentteja tullaan testaamaan ja jolla olisi itsekin syytä hieman testata, löytyy Lintulan hakemistosta ~ai/trimok. Lopulta kaikkien agenttien pitää toimia Lintulassa, mutta jos joku haluaa kehittää omassa ympäristössään, niin simulaattorin lähdekoodikin on samassa hakemistossa. Sieltä erityisen koodausmieliset voivat myös kaivaa pelin kulun formaalisti.

Simulaattori käyttää kahta Pelaaja-luokasta periytettyä (eri) luokkaa. Simulaattori peluuttaa niitä sille parametrina annettavan määrän kertoja. Trimok peli loppuu, kun jommankumman pelaajan kaikki nappulat on syöty, jompikumpi pelaajista ilmoittaa luovuttavansa siirtämällä jonkin nappuloistaan paikkaan, jossa se jo on, tai simulaattorille parametrina annettava aikaraja tulee täyteen. Pelien loputtua simulaattori ilmoittaa käyttäjälle pelien lopputuloksen. Jos peli loppuu ajan tullessa täyteen, julistetaan voittajaksi se, jolla on enemmän nappuloita jäljellä.

Simulaattorin luonti tietyille luokille käyttö tapahtuu teetrimok-skriptillä, joka ottaa parametreinaan kaksi luokan nimeä. Teetrimok pitää ajaa hakemistossa, jonka alihakemistoissa ovat annettujen luokkien lähdekoodi ja Makefile ja näiden hakemistojen pitää olla samannimisiä kuin niissä olevat luokat. Tuloksena syntyy ohjelma trimoksim. Esimerkiksi ~ai/trimok hakemiston trimoksim on tehty ajamalla tässä hakemistossa

teetrimok t777777 t999999

Omaa ohjelmaansa voi myös testata skriptien testitrimok1 ja testitrimok2 avulla. Ne ovat muuten samanlaisia kuin teetrimok, mutta niissä toiseksi agentiksi linkataan automaattisesti ahne agentti t999999. Testitrimok1:n tuottamassa simulaatiossa ahne agentti pelaa mustilla nappuloilla, ja testitrimok2:n tuottamassa simulaatiossa se pelaa valkoisilla nappuloilla. Tällä on merkitystä, koska valkoisilla pelaava aloittaa aina. Seuraava komento tuottaa työhakemistoon binäärin trimoktesti1, kun hakemistosta löytyy alihakemisto t123456:

testitrimok1 t123456

Vaatimukset

Palautettavien kooditiedostojen tulee noudattaa hyvää ohjelmointityyliä ja olla asianmukaisesti kommentoidut. Palautuksessa tulee olla myös makefile, joka tuottaa palautetuista tiedostoista objektitiedoston t123456.o komennolla make. Sanomattakin selvää lienee, ettei ohjelma saa tehdä laittomia siirtoja tai kaatua kesken kaiken.

Agentti katsotaan riittävän hyväksi, mikäli se voittaa lyhytnäköisen ja ahneen agentin t999999 sekä valkoisilla että mustilla nappuloilla pelatessaan. Pidätän itselläni kuitenkin oikeuden hylätä agentit, jotka on selvästi räätälöity käyttämään hyväkseen t999999:n heikkouksia, eivätkä alkuunkaan pärjää muita agentteja vastaan. Agentit eivät myöskään saa pohdiskella siirtojaan kohtuuttoman kauaa, joten vaatimuksena on myös, ettei t999999:n päihittämiseen kulu yli minuuttia. Tämä tarkoittaa, että agentin pitää tosiaan voittaa tuossa ajassa, siis pelin tulee loppua ennen aikamerkkiä, eikä t999999:llä saa enää olla mitään mahdollisuutta siirtää nappuloitaan.

Läpi menneet työt arvostellaan järjestämällä niiden välille turnaus. Jokainen agentti pelaa kaikkia muita agentteja vastaa kaksi kertaa - kerran valkoisilla nappuloilla ja kerran mustilla. Jos jokin agentti ei saa pelattua yhtäkään peliä loppuun asti, se diskataan turnauksesta, ja hyväksytään ilman pisteitä. Samoin käy agentille, joka yrittää tehdä laittoman siirron turnauksessa: agenttien täytyy siis toimia järkevästi, virheettömästi ja järkevässä ajassa myös muita kuin t999999:ä vastaan pelattaessa. Agentti ei saa myöskään missään tilanteessa tahallaan taktisesti viivytellä. Mikäli sellaista toimintaa havaitaan, hylätään agentti armotta. Lopullista pistemääräänsä saa alennettua myös kirjoittamalla kehnosti jäsenneltyä, kommentoimatonta ja lukukelvotonta koodia, mutta toisaalta pistemääräänsä voi myös hieman parantaa tekemällä assistentin lukuelämyksen mahdollisimman miellyttäväksi.

Palautus

Itse palautus tapahtuu sähköpostitse osoitteeseen ai@cs.tut.fi,subjectina ai palautus 2, ja itse tiedostot tar-paketoituna ja mime-koodattuna, esimerkiksi näin:

tar cf - t999999.h t999999.cc Makefile | mimencode | elm -s"ai palautus 2" ai@cs.tut.fi

Onnistuneesta harjoitustyön palautuksesta tulee nopeasti automaattinen vastaus. Tämä vastaus siis tarkoittaa, että harjoitustyö on saapunut perille, ei suinkaan hyväksymistä. Varsinaiset harjoitustyöt tarkastetaan dediksen jälkeen, kun keskinäinen paremmuusvertailu on suoritettu.

Selostus

Harjoitustyöstä täytyy koodin lisäksi tehdä lyhyt selostus samaan tapaan kuin haikugeneraattoristakin. Tarkemmat ohjeet selostuksen laatimiseen löytyy sivulta http://www.cs.tut.fi/~ai/selostus.html

Yleisiä ongelmia

Yleensä näiden C++:lla toteutettavien töiden yleisin hylkäämiseen johtava syy näyttää olevan se, että agentin koodi ei käänny testitilanteessa. Tälle on kaksi tavallista syytä. Joko makefilen VPATH osoittaa esim hakemistoon .. tai johonkin omaan hakemistoon, kun sen melkein poikkeuksetta pitäisi olla /home/ai/trimok.Toinen mahdollinen tilanne, jossa polut voivat mennä vikaan on #includet. Ohjelmat eivät saa olettaa että Nappula.h ja Pelaaja.h löytyvät hakemistosta .. tai yleensäkään minkään suhteellisen polun päästä. Jälleen oikea tapa on käyttää absoluuttista polkua /home/ai/trimok. Myös palautusvaiheessa tapahtuneet näppihäiriöt, joiden seurauksena assari saa tyhjän tai muuten vaan vajaan palautuksen ovat tavallisia. Olkaa siis tarkkoja!