Helsingin yliopisto Ohjelmoinnin harjoitustyön tehtävä
Tietojenkäsittelytieteen laitos  
Joni Salmi 10.9.2003

Yleinen noppapeli

Tehtävä

Varsin monien noppapelien idea on, että pelaajat yrittävät heittää pisteitä tuottavia silmälukuyhdistelmiä ja suurimman pistemäärän kerännyt voittaa. Tällaiset yhdistelmien tavoitteluun perustuvat noppapelit muistuttavat paljon toisiaan: vain pelaajien, käytettyjen noppien ja sallittujen heittokertojen lukumäärä sekä tavoiteltavat yhdistelmät ja niistä saatavat pisteet vaihtelevat.

Toteuta Yleinen noppapeli, jossa peliin osallistuvat voivat yhdessä tuumin pelikerran alussa päättää, montako noppaa on käytössä, montako heittokertaa sallitaan ja mitä yhdistelmiä tavoitellaan, toisin sanoen mitä noppapeliä pelataan.

Säännöt

Pelikerta koostuu kierroksista. Kierroksia on yhtä monta kuin käytössä olevia yhdistelmiä. Käytössä on vähintään yksi yhdistelmä.

Kierros koostuu heittovuoroista. Kullakin kierroksella jokaisella pelaajalla on yksi heittovuoro. Pelaajia on vähintään yksi. Pelaajien keskinäinen heittojärjestys arvotaan kunkin pelikerran alussa ja se säilyy samana koko pelikerran ajan.

Heittovuoro koostuu heittokerroista ja yhdistelmän merkitsemisestä.

Heittokertoja on kullakin heittovuorolla vähintään yksi ja enintään sovittu määrä. Kunkin heittovuoron ensimmäisellä heittokerralla pelaaja heittää kaikki nopat. Noppia on vähintään yksi. Ensimmäisen heittokerran jälkeen pelaaja saa heittää haluamansa nopat uudelleen niin monesti kuin hänellä on heittokertoja jäljellä.

Heittovuoronsa lopuksi pelaaja merkitsee jonkin yhdistelmän, jota ei ole jollakin aikaisemmalla heittovuorollaan vielä merkinnyt. Yhdistelmän merkitseminen tarkoittaa, että pelaajan yhteispistemäärään lisätään niin monta pistettä kuin hänen valitsemansa yhdistelmä tuottaa noppien nykyisillä silmäluvuilla.

Pelikerran lopuksi pelaajien yhteispistemääriä verrataan keskenään ja korkeimman pistemäärän saavuttanut julistetaan voittajaksi (paitsi mikäli pelaajia oli vain yksi). Jos useat pelaajat ovat saavuttaneet korkeimman yhteispistemäärän, voittaja ratkaistaan arpomalla.

Yhdistelmät

Yhdistelmä on sääntö, jolla lasketaan noppien silmälukujen tuottamat pisteet. Yhdistelmään liittyy jokin silmälukuja koskeva ehto. Jos ehto täyttyy, pisteitä saa. Jos ehto ei täyty, pisteitä ei saa.

Joitakin yhdistelmiä voi käyttää vain joidenkin noppamäärien kanssa. Esimerkiksi kolmen nopan pelissä ei voi käyttää yhdistelmää, jonka ehto on ”vähintään neljä samaa silmälukua”.

Seuraavassa on lueteltu erilaisia mahdollisia yhdistelmiä ja yhdistelmätyyppejä.

Nimi Ehto Noppia oltava
Ykköset Vähintään yksi ykkönen Vähintään 1
Kakkoset Vähintään yksi kakkonen Vähintään 1
Kolmoset Vähintään yksi kolmonen Vähintään 1
Neloset Vähintään yksi nelonen Vähintään 1
Viitoset Vähintään yksi viitonen Vähintään 1
Kuutoset Vähintään yksi kuutonen Vähintään 1
N samaa Vähintään n samaa silmälukua (n > 1) Vähintään n
N:n sarja Vähintään n peräkkäistä silmälukua (1 < n < 7) Vähintään n
N:llä jaolliset Kaikki silmäluvut ovat n:llä jaollisia (n on joko 2 tai 3) Vähintään 1
N:llä jaottomat Kaikki silmäluvut ovat n:llä jaottomia (n on joko 2 tai 3) Vähintään 1
N-parit Nopat voidaan jakaa pareiksi siten, että jokaisen parin noppien silmälukujen summa on n (1 < n < 13). Parillinen määrä
Reilu jako Nopat voidaan jakaa kahteen epätyhjään joukkoon siten, että molemmissa joukoissa on samoja silmälukuja yhtä paljon. Parillinen määrä
Ahne jako Nopat voidaan yhtä noppaa lukuun ottamatta jakaa kahteen epätyhjään joukkoon siten, että molemmissa joukoissa on samoja silmälukuja yhtä paljon. Pariton määrä, vähintään 3
Sattuma Mitkä tahansa silmäluvut Vähintään 1

Seuraavassa on lueteltu esimerkinomaisesti erilaisia silmälukuja eri noppamäärillä ja niihin sopivia yhdistelmiä.

Silmäluvut Silmälukuihin sopivia yhdistelmiä
3 6 6 Kolmoset, kuutoset, kaksi samaa, kolmella jaolliset, ahne jako, sattuma
4 4 5 5 Neloset, viitoset, kaksi samaa, kahden sarja, kolmella jaottomat, ysiparit, reilu jako, sattuma
2 2 5 5 5 Kakkoset, viitoset, kaksi samaa, kolme samaa, ahne jako, kolmella jaottomat, sattuma
1 1 2 3 5 Ykköset, kakkoset, kolmoset, viitoset, kaksi samaa, kahden sarja, kolmen sarja, sattuma
2 2 6 6 6 Kakkoset, kuutoset, kaksi samaa, kolme samaa, kahdella jaolliset, ahne jako, sattuma
1 3 3 4 4 6 Ykköset, kolmoset, neloset, kuutoset, kaksi samaa, kahden sarja, seiskaparit, sattuma

Sovellukselle asetettavia vaatimuksia

Sovellus toteuttaa Yleisen noppapelin edellä esitettyjen sääntöjen mukaisesti. Pelaajia voi olla 1-4. Noppia on käyttäjän valinnan mukaan 1-6. Sallittuja heittokertoja on käyttäjän valinnan mukaan 1-4.

Sovellus tuntee seuraavat yhdistelmät: ykköset, kakkoset, kolmoset, neloset, viitoset, kuutoset, kaksi samaa, kolme samaa, neljä samaa, viisi samaa, kuusi samaa, kahden sarja, kolmen sarja, neljän sarja, viiden sarja, kuuden sarja, kahdella jaolliset, kahdella jaottomat, kolmella jaolliset, kolmella jaottomat, kuutosparit, seiskaparit, kasiparit, reilu jako, ahne jako ja sattuma.

Käyttäjä voi valita mitkä yhdistelmät haluaa pelikerralla käyttöönsä. Yhdistelmää ei voi ottaa käyttöön, jos valittu noppien määrä ei sovi yhdistelmälle. Oletusarvoisesti käytössä ovat kaikki valitulle noppamäärälle sopivat yhdistelmät. Käytössä on oltava vähintään yksi yhdistelmä.

Päätä itse, kuinka paljon mikin yhdistelmä tuottaa pisteitä. Pistemäärä voi olla vakio tai riippua esimerkiksi silmälukujen arvoista, noppien lukumäärästä tai vaikkapa todennäköisyydestä, jolla yhdistelmän saa kaikki nopat kerran heittämällä. Pistemäärä ei saa riippua siitä, kuinka monella heitolla yhdistelmä saatiin.

Sovelluksen on oltava helposti ylläpidettävä. Ohjelmoijan - muunkin kuin sinun itsesi - on myöhemmin voitava helposti lisätä ja poistaa sovelluksen tarjoamia yhdistelmiä ja muuttaa pelaajien, noppien ja heittokertojen maksimimäärää muutamalla pykälällä ylös- tai alaspäin. Muutokset eivät saa vaatia lähdekoodiin suuria muutoksia.

Tekstipohjainen käyttöliittymä riittää. Graafisen käyttöliittymän saa tehdä, jos haluaa. Käyttöliittymän graafisuudesta ei saa lisäpisteitä.

Toteuta Yleinen noppapeli nimenomaan sovelluksena (application), ei sovelmana (applet).