Miinantallaaja¶
Keltainen valtio on aloittanut sotatoimet isänmaatamme kohtaan hyökäten armottomalla miinoituksella. Nohevana pioneerijohtajana tehtäväsi on kouluttaa osaavia miinantal... miinanpurkajia. Tähän tarvitaan luonnollisesti ninjatason ohjelmointitaitoja. Kyllä. Tehtävänäsi on toteuttaa eeppinen miinanpurkusimulaattori, joka tunnetaan myös nimellä miinaharava.
Pelin aloitus¶
Miinakenttä on suorakulmion muotoinen ja se muodostaa kaksiulotteisen ruudukon, jonka leveys ja pituus ovat pelaajan mielivaltaisesti valittavissa. Miinakentän ruudut ovat alussa tutkimattomia ja satunnaisesti arvottuihin ruutuihin on piilotettu miina. Miinojen määrä on myös pelaajan valittavissa. Muita ruututyyppejä ovat numeroruutu, joka ilmoittaa ruutua ympäröivien miinojen lukumäärän, sekä tyhjä ruutu.
Pelin kulku¶
Pelaaja voi valita hiirellä ruudukosta yhden ruudun kerrallaan. Valittu koordinaatti aukaistaan eli pelaajalle näytetään ruudun sisältö. Jos valitussa ruudussa oli miina, pelaaja häviää ja peli päättyy. Muuten menetellään seuraavasti:
- Jos valitun ruudun viereisissä (myös viistosti!) ruuduissa on vähintään yksi piiloitettu miina, kyseessä on numeroruutu ja sen kohdalla näytetään ympäröivien miinojen lukumäärä.
- Jos valitun ruudun viereisissä ruuduissa ei ole miinoja (eli se on tyhjä), aukaistaan kaikki ympäröivät ja niitä ympäröivät jne. ruudut joka suuntaan niin pitkälle, että saavutetaan miinakentän raja tai ensimmäinen numeroruutu, joka myös aukaistaan.
Pelin päättyminen¶
Peli voi päättyä kahdella tavalla:
- Pelaaja häviää avatessaan ruudun, johon on piilotettu miina.
- Pelaaja voittaa, kun kaikki miinattomat ruudut on aukaistu kentältä.
Suunnittelupöydälle kannattaa ottaa vaikkapa kuva pelistä, josta voisi lähteä liikkeelle. Taitaa verkon syövereistä löytyä joku selaimessa pelattava versiokin. Alla olevista ohjeista voit tarkistaa, saatko lopputyösi hyväksyttävästi suoritettua. Eli vaikka kuinka tekisi mieli rynnätä jo koodaamaan, kannattanee kuitenkin lukaista tämä sivu loppuun.
Toimiva toteutus¶
Toimivan toteutuksen tulee osoittaa kurssin asioiden hallintaa. Seuraavasta listasta voit tarkistaa mitä työltä vaaditaan, jotta se hyväksytään:
- Peli toteuttaa yllä kuvatut miinaharavan säännöt
- Peli toimii käyttäjän valitsemilla dimensioilla - testaa erityisesti, että muutkin kuin neliöt (leveys = korkeus) toimivat!
- Pelitilanne esitetään pelaajalle ymmärrettävässä muodossa graafisesti
- Pelaaja pystyy tekemään siirtoja hiirellä; siirtojen sääntöjenmukaisuus tarkistetaan ja laittomat siirrot estetään
- Peli päättyy kun päättymisehto täyttyy
- Peli tallentaa tilastoja pelatuista peleistä erilliseen tiedostoon: vähintään pelin ajankohdan (päivämäärä + kellonaika), keston minuuteissa, keston vuoroissa ja lopputuloksen (voitto tai häviö, kentän koko ja miinojen lukumäärä).
- Pelissä on alkuvalikko, josta voi valita uuden pelin, lopettamisen ja tilastojen katsomisen - huom! valikko voi olla tekstipohjainen, ainoastaan itse peli-ikkunan tulee olla graafinen.
Grafiikka¶
Peligrafiikkaa varten olemme toteuttaneet pienen kirjaston, jonka avulla grafiikan piirto peli-ikkunaan onnistuu jotakuinkin samoilla keinoilla kuin muutkin asiat kurssilla tähän asti - kutsumalla siis funktiota. Kirjastoa ei ole pakko käyttää, mutta pelissä on oltava vastaava graafinen käyttöliittymä jollain tavalla toteutettuna - terminaaliharavien valtakausi on ohi! Kirjastomoduulissa on varsin kattavat dokumentaatiomerkkijonot, jotka kertovat sen käytöstä. Lisää ohjeistusta on koottu alle.
Käyttöönotto¶
Lataa kirjasto ja grafiikkana käytettävät kuvat yllä olevista linkeistä. Kuvat laitetaan oletuksena spritet-nimiseen kansioon projektikansiosi sisälle - kyseessä on siis pakattu kansio, älä pura sitä erikseen spritet-kansioon koska silloin saat spritet/spritet hakemistoksi. Sinun tulee myös asentaa Pyglet-kirjasto, koska pikkuinen kirjastomme on sen päälle toteutettu. Pyglet on muutenkin ihan näppärä kirjasto, jos haluaa tehdä Pythonilla 2D-pelejä. Halutessasi voit ladata myös alta skriptin, jolla zipin kuvat on generoitu (vaatii PyCairon asentamisen).
Pelikirjastojen 101¶
Siinä missä tähän asti ohjelman käyttöliittymäsilmukka on koodattu kokonaan itse (yleensä
while True
:lla), pelikirjastoissa on tyypillisesti konepellin alle piilotettuna huomattavasti monimutkaisempi pääsilmukka. Se on piilotettu, jotta sillä ei tarvitse vaivata päätään. Kirjastoa käytettäessä määritellään tyypillisesti käsittelijäfunktioita, joita pääsilmukka kutsuu, kun funktioon liitetty asia tapahtuu. Esimerkiksi hiiren klikkaukseen voidaan kytkeä käsittelijäfunktio. Jos näin tehdään, tuota funktiota kutsutaan aina, kun käyttäjä painaa hiiren nappia. Toinen hyvin yleinen käsittelijä on grafiikan piirtofunktio, jota kutsutaan aina, kun ruudulla oleva näkymä pitää päivittää. Pelikoodissasi et siis määrittele omaa pääsilmukkaa, vaan toteutat tarvittavat käsittelijäfunktiot. Käsittelijäfunktiot tulee erikseen kytkeä tapahtumiin. Tämä onnistuu kirjastossa olevilla funktioilla (muotoa aseta_joku_kasittelija). Näiden funktioiden dokumenttimerkkijonoista ilmenee millainen käsittelijäfunktio niihin tulee liittää. Työjärjestys grafiikan piirtämisessä annetulla kirjastolla on kaiken kaikkiaan seuraavanlainen:
- lataa peligrafiikat
- luo peli-ikkuna
- määrittele ja rekisteröi käsittelijäfunktiot
- käynnistä peli
Tästä eteenpäin peli pyörii käsittelijäfunktioiden varassa. Grafiikan piirtämisestä löydät hyvin yksinkertaisen esimerkin kirjastomoduulin lopusta. Siellä on koodinpätkä, joka piirtää kaikki ruutugrafiikat satunnaisessa järjestyksessä ikkunaan yhdelle riville.
Koodin suunnittelussa on syytä huomoida, että koska käsittelijäfunktioita kutsuu ns. konepellin alla pyörivä pääsilmukka, et pysty vaikuttamaan siihen mitä argumentteja niille annetaan. Erityisesti pelin tila (kuten kenttä) täytyy hankkia käsittelijöiden tietoon jotain muuta kautta. Suositeltava lähestymistapa on tehdä tilaa varten sanakirja pääohjelmassa. Pääohjelmassa määriteltyä sanakirjaa voidaan muuntuvan luonteensa ansiosta lukea sekä muokata kaikissa funktioissa.
Palautus¶
Palautusaikaraja: 2024-08-31 23:59