Tik-76.030 Projektityö

Othello - peli

Jan Wagner (jwagner@cc.helsinki.fi), 49982P
assistentti has@cs.hut.fi

Työ palautettu 24.05.1999.


 

Sisällys:

OthelloLogo.gif (2461 bytes)

Aihe ......1
Käyttöohje ......2
Ratkaisutavan selitys ......3
Ohjelman toiminnan kuvaus ......4
Ohjelman rajoitukset ja puutteet ......5
Arvio ohjelman laadusta ......6
Luokat (lähdekoodi sekä javadoc) ......7

 

1. Aihe

Aihenumero: 262
Aihepiiri: Java applet, peli

Tehtävänanto:
Tee othello-peli.

Käytä grafiikkaa, hiirellä täytyy pystyä helposti osoittamaan uuden  
nappulan paikka pelilaudalla.

Othellon pikaohjeet:

Peliä pelataan 8x8 ruudukossa, kaikki ruudut samanvärisiä. Alussa
ruuduissa d4 ja e5 on valkoinen nappula ja d5 ja e4 on musta nappula.
Pelaajat laittavat vuorotellen laudalle vapaaseen ruutuun oman nappulansa.
Nappulan täytyy pystyä "kääntämään" ainakin yksi toisen pelaajan nappula.
Jos tämä ei onnistu, joutuu luovuttamaan vuoronsa toiselle pelaajalle.


2. Käyttöohje

Peli käynnistyy avaamalla uudemmalla www-selaimella verkosta sivu Othello.html Peli löytyy mm. osoitteesta http://www.hut.fi/~jwagner/JohdOhj/Othello.html Peli alkaa oletusarvoisesti valkoisen eli käyttäjän siirrolla. Uuden pelin voi aloittaa painamalla nappulaa "Uusi". Java-konsolin avaaminen näytölle voi olla hyödyllistä.


3. Ratkaisutavan selitys

Helpoin ja ehkä lopulliselta muodoltaan selkein ratkaisu oli käyttää eri luokkia implementoimaan pelin eri tasoja. Selkeyden lisäksi tällä ratkaisulla on myös se hyvä puoli, että on helpompi parannella ja/tai laajentaa näitä tasoja.

Ohjelma koostuu nyt yksinkertaistettuna kolmesta osasta:

  1. itsenäisestä pelilaudasta joka osaa tarkistaa onko annettu siirto laillinen sekä pystyy suorittamaan annetun siirron
  2. Pelaaja-luokka joka hoitaa siirtojen esittämisen jollekin pelilauta-oliolle
  3. käyttöliittymä, simppeli Java-applet joka hoitaa laudan piirtämisen sekä hiiriliikkeet

Seuraavaksi tarkennus näiden kolmen osan ratkaisutavoista sekä ratkaisun höydyistä:

1. Pelilauta on omassa luokassaan. Sen konstruktoreilla voidaan luoda uusi pelilauta jossa on valmiiksi aloitusnappulat. Luokka sisältää pelilaudan ruutujen aksessorien lisäksi myös metodeja, joilla voidaan ehdottaa pelilauta-oliolle jokin siirto. Näitä metodeja ovat esim. annetun siirron tarkistaminen, siirron suorittaminen, sekä siirron suoritusmaskin tekeminen.

Suoritusmaski-metodi palauttaa uuden lauta-olion johon on merkattu ehdotetulla/hypoteettisella siirrolla kääntyvät nappulat. Metodia voi käyttää esimerkiksi kääntyvien merkkien näyttämistä varten - siis silloin kun hiirtä liikutetaan laudan yllä mutta ei vielä paineta hiiren nappia.

Pelilauta-olioita voi olla useita, sillä Pelaaja-luokan metodit ottavat kutsuntaparametrina myös pelilauta-olion. Näin voisi vaikkapa toteuttaa simultaanipelin...

2. Pelaaja-luokat, joita ovat TietokonePelaaja ja KäyttäjäPelaaja, ovat luokan AbstraktiPelaaja aliluokkia. (Luokka AbstraktiPelaaja oli aluksi interface, tein siitä kuitenkin lopuksi tavallisen luokan). Näillä luokilla on kaikilla saman nimiset metodit, joita kutsutaan pääasiassa käyttöliittymä-luokan kautta. Metodeja ovat mm. pelaajan pisteitten laskeminen, siirron suorittava teeSiirto, ja hiiriliikkeiden ja napinpainallusten tietoja käyttöliittymä-luokasta saava hiiriKoord. Lisäksi on olemassa metodi voiSiirtää, joka tarkistaa voisiko pelaaja tehdä yhtään siirtoa annetulla pelilaudalla. Tätä metodia käytetään pelivuoron vaihdossa.

KäyttäjäPelaaja-luokka on kahdesta pelaajaluokista yksinkertaisin. Se vain ottaa vastaan käyttäjän hiiriliikkeet ja napinpainallukset, ja yrittää suorittaa kaikki annetut siirrot.

TietokonePelaaja-luokassa on oma AI-osa, joka laskee seuraavan siirron. Luokasta on mahdollista tehdä alaluokkia, joissa on eri vaikeustasojen AI-rutiinit.

3. Applet-käyttöliittymä. Välittää hiiriliikkeet ja napinpainallukset Pelaaja-luokille, ja koordinoi pelin kulkua (vuoron näyttäminen, vuoron vaihdot, pelin loppu, pelin alku, siirtovihjeet, pelitilanne jne). Luokka huolehtii myös laudan ja nappuloiden piirtämisestä. Jos haluaa vaihtaa laudan tai nappuloiden kuvat, se hoituu muuttamalla luokan init()-metodia.

Käyttöliittymäluokassa on muuten myös kaksi ohjelman debug-tasoa määrittelevää vakiota, DEBUG ja FINEDEBUG. Asettamalla kummatkin 'true'ksi ja tarkkailemalla Java-konsolia pelin aikana voi saada tarkemman kuvan pelin sisäisestä rakenteesta.


4. Ohjelman toiminnan kuvaus

Pääohjelma on edellä esitetyn ohjelmarakenteen osa 3 eli Applet-käyttöliittymä. Pääohjelma huolehtii pelilaudan ja pistetilanteen päivityksestä, vaihtelee vuorossa olevaa Pelaaja-luokkaa sekä tarkkailee käyttäjän hiiriliikkeitä. Jos pelaaja klikkaa hiirellä jossain päin lautaa eli antaa siirtoehdotuksen, pääohjelma esittää tämän siirron sinä hetkenä vuorossa olevalle Pelaaja-luokalle. Pelaaja-luokka yrittää suorittaa annetun siirron käyttämällä Lauta-luokan metodeja. Onnistuneen siirron jälkeen pääohjelma päivittää pelilaudan näytön ja antaa vuoron seuraavalle pelaajalle (eli pelaaja, joka pystyy tekemään siirron).

Yksi pelin ohjelmoinnin suuremmista ongelmista oli kunnollisen tietokone-AI:n laatiminen. Jokseenkin... ööh... "hyvän"... tai semmoisen tietokonepelaajan sain aikaiseksi käyttämällä taulukkoa, joka antaa pelilaudan eri ruuduille pisteytyksen, jonka perusteella TietokonePelaaja-oliot voivat laskea strategisesti suurin piirtein parhaan siirron. Kaava on:

ehdotus = {  siirtoehdotus , pisteytys = sum(siirtoehdotuksessa omaksi kääntyvien sekä siirtoruudun pistearvot)  }
suoritettava siirto = { ehdotus jossa pisteytys=max(
ehdotus.pisteytys) }

AI:n siirrot siis perustuvat ennalta määrättyyn taulukkoon, eikä ihmispelaajan siiroilla ole vaikutusta AI:n strategiaan (mitään tietokoneen "strategiaa" ei itse asiassa ole ;-) .



5. Ohjelman rajoitukset ja puutteet

Eräs lievä rajoitus/puute on tietokoneen heikko AI, joka voi osoittautua aika helpoksi voittaa. Joidenkin pelitutkijoiden mielestä tietokone voittaa ylivoimaisesti nimenomaan Othello-pelissä ihmisen hahmotuskyvyn...  (HS 22.5.1999) Tätä ongelmaa tuskin tässä pelin versiossa syntyy...

Pieni bugi tai pikeminkin ratkaisematon ohjelmointiongelma löytyy appletin oikeassa yläkulmassa olevasta kellosta, jonka näyttö päivittyy vain, jos liikuttelee hiirtä pelilaudalla.

Kokeillessani ohjelmaa eri (Java-kykyisillä) selaimilla ilmeni, että vanhemmissa selaimissa kuten IE 3.0 ja Netscape 3.0 tämä peli ei suostu käynnistymään, vaan aiheuttaa jonkinlaisen "system security error" virheen. Tämä saattaa tietenkin johtua siitä, että mainitut selaimet käyttävät vanhentunutta Java-VM:ää. Koodi kun käännettiin JDKn versiolla 1.1.8...


6. Arvio ohjelman laadusta

Ohjelma on toivon mukaan graafisesti selkeä, ja sen käytön uskoisin olevan erittäin helppoa. Koska tietokoneen AI:ta ei ole liian vaikea voittaa, ohjelma soveltuu hyvin niille, jotka ovat vasta tutustumassa Othello-peliin.


7. Luokat (lähdekoodi sekä javadoc)

Tässä siis koko pelin lähdekoodi sekä javadocilla tehdyt luokkakuvaukset. Pääohjelma on luokassa Othello.java, Coord.java on Lauta.javan käyttämä apuluokka koordinaattimuutoksia varten, ja AbstraktiPelaaja.java on luokkien KäyttäjäPelaaja ja TietokonePelaaja yhteinen yliluokka.

AbstraktiPelaaja.java

Luokkakuvaus

Coord.java Luokkakuvaus
KäyttäjäPelaaja.java Luokkakuvaus
Lauta.java Luokkakuvaus
Othello.java Luokkakuvaus
TietokonePelaaja.java Luokkakuvaus

 

Lähdeviitteet

Kaikenlaiset verkosta löytyvät Othello-pelit jotka on tehty Javalla. Eli oikeastaan suurin osa sivuista, jotka löytyvät käyttämällä hakukonetta www.excite.com hakusanoin "+java +Othello +source sample".

 

 


Othello-pelin lähdekoodi sekä dokumentaatio (C) 1999 Jan Florian Wagner, jwagner@alpha.hut.fi