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

Pako vankilasaarelta -lautapeli

Pelin idea

Vankilasaaren vangit ovat päässeet pakenemaan selleistään. Vankilan ja pakoveneen välissä on enää pimeä piha - mutta myös joukko tarkkakorvaisia vartijoita. Kukin vartija vahtii pihasta omaa poikittaista kaistalettaan ja juoksee äänten osoittamaan suuntaan. Ohjaa omat vankisi veneeseen vartijoiden lomitse! Ensimmäisenä kolme vankia veneeseen ohjannut pelaaja voittaa.

Säännöt

Pelaajia voi olla 2, 3 tai 4.

Pelilauta koostuu pihasta, vankilasta ja veneestä.

Piha on neliön muotoinen ruudukko. Pihan sivun pituus on pariton määrä ruutuja, vähintään viisi ja enintään viisitoista ruutua. Pihan yläreunassa on erityisiä pakoruutuja. Pakoruudut muodostavat kärjellään olevan tasakylkisen kolmion. Kolmion kanta on pihan yläreunassa ja kannan leveys on puolet pihan sivun pituudesta (alaspäin pyöristettynä).

Pihan yläpuolella, pakoruutujen kohdalla, on vene. Vene on yhtä leveä kuin pakoruutujen muodostaman kolmion kanta.

Pihan alapuolella on vankila. Vankila on koko pihan alareunan levyinen.

Pelinappuloita on kahdenlaisia: vankeja ja vartijoita. Kullakin pelaajalla on käytössään neljä vankia. Vartijoita on yhtä monta kuin mitä pihan sivun pituus on ruutuina.

Pelin alussa kaikki vangit ovat vankilassa. Vartijat ovat pihalla siten, että kutakin vaakariviä kohden on yksi vartija ja vartijat muodostavat ylösalaisin olevan V-kirjaimen kuvan 1 osoittamalla tavalla.

Kuva 1. Suurin ja pienin mahdollinen pelilauta ja kahden pelaajan pelinappulat alkuasetelmissaan. Yläreunassa on vene, alareunassa on vankila. Pakoruudut on merkitty harmaalla värillä. Vartijat on kuvattu mustilla neliöillä. Vangit on kuvattu mustilla ja valkoisilla ympyröillä.

Kukin pelaaja siirtää vuorollaan yhtä omaa vankiaan jollakin jäljempänä esitetyistä tavoista. Vangin siirron jälkeen siirretään yhtä vartijaa jäljempänä esitettävällä tavalla. Esimerkiksi kahden pelaajan peli etenee siis seuraavasti: pelaaja A siirtää vankia, siirretään vartijaa, pelaaja B siirtää vankia, siirretään vartijaa, pelaaja A siirtää vankia, siirretään vartijaa jne.

Vankia saa siirtää vankilasiirrolla, pihasiirrolla tai venesiirrolla.

Vankilasiirto. Vankilassa olevan vangin saa siirtää pystysuoraan pihalle mihin tahansa ruutuun. Tämän jälkeen sen vaakarivin vartijaa, jolle vanki päätyi, siirretään vangin suuntaan yhtä monta ruutua kuin vanki eteni (tai vähemmän, mikäli pihan reuna tulee vastaan). Vankilasta pihalle siirtyminen lasketaan yhden ruudun etenemiseksi.

Kuva 2. Musta vanki siirtyy pystysuoraan kaksi ruutua vankilasta pihalle. Vartija siirtyy kaksi ruutua vangin suuntaan.

Pihasiirto. Pihalla olevaa vankia saa siirtää vaakasuoraan tai pystysuoraan yhden tai useamman ruudun verran. Tämän jälkeen sen vaakarivin vartijaa, jolle vanki päätyi, siirretään vangin suuntaan yhtä monta ruutua kuin vanki eteni (tai vähemmän, mikäli pihan reuna tulee vastaan).

Kuva 3. Musta vanki voi kiinni jäämättä siirtyä yhden ruudun verran johonkin kolmesta suunnasta.

Venesiirto. Pakoruudussa olevan vangin saa siirtää pystysuoraan veneeseen. Tämän jälkeen yksi arvottu vartija siirretään oman vaakarivinsä siihen reunaan, joka on vartijasta kauempana. Jos molemmat reunat ovat vartijasta yhtä kaukana, reuna arvotaan.

Kuva 4. Musta vanki pääsee veneeseen. Arvottu vartija siirtyy oman vaakarivinsä kauimmaiseen reunaan.

Vankia ei saa siirtää sellaisen ruudun kautta eikä sellaiseen ruutuun, jossa on vanki tai vartija. Vartija saa kulkea sellaisen ruudun kautta ja sellaiseen ruutuun, jossa on vanki. Vartijan siirtyessä jäävät kiinni sellaiset vangit, jotka sijaitsevat ruudulla, jonka kautta vartija kulkee tai johon vartija päätyy. Kiinni jääneet vangit siirretään heti takaisin vankilaan.

Kuva 5. Valkoinen vanki etenee kaksi ruutua ylöspäin. Vartija etenee kaksi ruutua valkoisen vangin suuntaan ottaen samalla kiinni mustan vangin.

Voittaja on se pelaaja, joka saa ensimmäisenä siirrettyä veneeseen kolme neljästä vangistaan.

Tehtävä

Toteuta Pako vankilasaarelta -lautapeli Java-kielisenä sovelluksena (ei sovelmana).

Käyttäjä voi valita pihan koon, pelaajien määrän ja siirtovihjeiden näyttämisen. Pelin aikana pihan kokoa ja pelaajien määrää ei voi muuttaa, mutta siirtovihjeiden näyttämisen voi muuttaa.

Sovelluksen ensimmäisellä käyttökerralla käytetään seuraavia oletusarvoja: pihan koko on 8 x 8 ruutua, pelaajia on kaksi, siirtovihjeet näytetään. Käyttäjän valitsemat arvot tallennetaan automaattisesti ja niitä käytetään oletusarvoina seuraavalla pelikerralla.

Jos siirtovihjeiden näyttäminen on käytössä, korostetaan ne pihan ruudut, joihin vuorossa oleva pelaaja voisi siirtää jonkin oman vankinsa ilman että yksikään oma vanki jää kiinni.

Sovellus hoitaa vartijoiden siirtämisen automaattisesti.

Käyttäjä voi milloin tahansa keskeyttää pelin (aloittaakseen uuden pelikerran) tai sulkea sovelluksen. Sovelluksen sulkeutuessa asetukset ja mahdollisesti keskeneräisen pelin tilanne tallennetaan automaattisesti. Seuraavalla käyttökerralla jatketaan samoilla asetuksilla samasta tilanteesta.

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

Vapaaehtoinen haaste: anna käyttäjälle mahdollisuus valita, että sovellus toimii yhtenä pelaajana. Sovelluksen ei tarvitse arvioida pelitilannetta omaa siirtoaan pidemmälle: riittää, että sovellus valitsee jollakin algoritmilla kaikista mahdollisista omien vankiensa siirroista parhaalta vaikuttavan.