Ohjelmoinnin harjoitustyö: Mastermind
Mika Juhani Tanninen
Jukolantie 31, 00730 Helsinki
Puhelin: 050-3594763 / 09-3867898
Helsinki 14.6.1999
Ohjelmoinnin harjoitustyö
Helsingin Yliopisto
Tietojenkäsittelytieteen laitos
Ryhmä: Kesä 1999, ryhmä 1
Ohjaaja: Antti Kerminen
Ohjelmointikieli: Turbo Pascal 7.0 |
Ohjelmoinnin harjoitustyö: Mastermind
Mika Juhani Tanninen
Jukolantie 31, 00730 Helsinki
Puhelin: 050-3594763 / 09-3867898 |
Helsinki 14.6.1999
Ohjelmoinnin harjoitustyö
Helsingin Yliopisto
Tietojenkäsittelytieteen laitos
Ohjaaja: Antti Kerminen
Ohjelmointikieli: Turbo Pascal 7.0 |
Ohjelmoinnin harjoitustyö: Mastermind
Ohjelman tarkoituksena on toteuttaa Mastermind logiikkapeli. Pelin ideana
on arvailla koneen arpomaa riviä erivärisiä nappeja ja niiden
paikkaa.
Vaikeustasoja on kolme. Helpoimmassa vaikeustasossa on neljä paikkaa,
joihin kone arpoo neljästä eri värinapeista koostuvan rivin.
Normaalissa vaikeustasossa paikkoja on kuusi ja vaikeimmassa vaikeustasossa
myös värien määrä on nostettu kuuteen.
Pelaajalla on 10 arvausta.
Jokaiselle arvaukselle ohjelma vastaa antamalla valkoisen tarkastusmerkin
jokaista sellaista nappulaa kohden, joka on oikean värinen, mutta
väärällä paikalla kertomatta tarkalleen mikä väreistä
oli oikea ja mikä väärä. Jokaista oikealla paikalla
olevaa ja oikean väristä nappulaa kohden kone antaa vihjeenä
mustan tarkastusmerin.
Ohjelma näyttää vanhat arvaukset ruudulla, että
niiden perusteella käyttäjä voi tehdä uuden arvauksen.
Kaikkien aikojen parhaista tuloksista pidetään kirjaa, tulokset
on koko pelin ajan näkyvissä.
Ohjelmassa on graafinen käyttöliittymä, kommunikointiin
käytetään näppäimistöä.
Sisältö
1 Käyttöohje
1.1 Ohjelman yleiskuvaus käyttäjälle
1.2 Ajo- ja asennusohje
1.3 Ohjelman käyttöohje
1.3.1 Päävalikko
1.3.1.1 Komento: Aloita peli
1.3.1.2 Komento: Vaikeustason muutto
1.3.1.3 Komento: Ohjelman lopetus
1.3.1.4 Komento: Ohjeet pelin säännöistä
1.3.1.5 Komento: Parhaiden tulosten poisto
1.3.2 Pelivalikko ja pelaamisohjeet
1.3.2.1 Värien vaihto
1.3.2.2 Liikkuminen
1.3.2.3 Rivin tarkistuttaminen
1.3.2.4 Luovuttaminen
1.3.2.5 Pelin loppuminen
1.3.2.6 Kaikkien aikojen parhaiden tulosten listalle pääseminen
1.4 Virheilmoitukset ja rajoitukset
2 Ohjelman toiminta ja rakenne
2.1 Järjestelmän yleiskuvaus ja ratkaisutapa
2.2 Tärkeimmät tietorakenteet
2.2.1 Taulukot
2.2.2 Muuttujat
2.2.3 Vakiot
2.3 Määrittely- ja kutsurakenne
2.4 Ohjelman toiminta
2.4.1 Pääohjelma
2.4.2 Aliohjelma PiirraValikko
2.4.3 Aliohjelma PiirraValikonNappi
2.4.4 Aliohjelma PiirraNappi
2.4.5 Aliohjelma TulostenPiirto
2.4.6 Aliohjelma TulostaParhaatTulokset
2.4.7 Aliohjelma TyhjennaParhaatTulokset
2.4.8 Aliohjelma ParhaatTuloksetPaivitys
2.4.9 Aliohjelma AloitaPeli
2.4.10 Aliohjelma Tarkista
2.4.11 Aliohjelma Paavalikko
2.4.12 Aliohjelma KysyVaikeustaso
2.4.13 Aliohjelma VarmistaTyhjennetaanko
2.4.14 Aliohjelma Luenappain
2.4.15 Muut Aliohjelmat
2.5 Parannusehdotuksia
3 Testaus
3.1 Grafiikan käsittelyyn ja tulostukseen liittyvät
aliohjelmat
3.2 Kaikkien aikojen parhaiden tulosten käsittelyyn
liittyvät aliohjelmat
3.3 Pelaamisen toteuttavat aliohjelmat
3.4 Valikkojen toteutuksen ja kommunikoinnin pääasialliset
aliohjelmat
Liitteet
1. Tehtäväpaperi
2. Työpäiväkirja
3. Ohjelmalistaus
4. Testausrutiinit
5. Ohjelmalevyke |
1
1
1
1
1
1
2
2
2
2
2
3
3
3
3
4
4
4
5
5
6
6
6
6
7
7
8
8
8
8
8
9
9
9
9
9
10
10
10
10
10
11
12
12
12
13
13 |
1
1 Käyttöohje
1.1 Ohjelman yleiskuvaus käyttäjälle
Mastermind logiikkapelin ideana on päätellä oikea värien
sarja muutamalla yrittämällä.
Jokaisesta yrityksestä ilmoitetaan kuinka monta oikeaa väriä
on oikealla paikalla ja kuinka monta oikeaa väriä on väärällä
paikalla.
Pelissä yrityskertoja on 10.
Vaikeustasoja on kolme:
Helpoimmassa vaikeustasossa on pääteltävä 4 väristä
koostuvan 4-paikkaisen sarjan oikea rivi.
Normaalissa vaikeustasossa paikkoja on edelleenkin 4, mutta värien
määrää on kasvatettu kuuteen.
Vaikeassa vaikeustasossa on pääteltävä 6 väristä
koostuva 6-paikkaisen sarjan oikea rivi.
1.2 Ajo- ja asennusohje
Ohjelma toimii MS-DOS käyttöympäristössä. Koneen
on pystyttävä 640x480 pistetarkkuuteen 16 värillä.
Suositeltavaa on myös, että koneen laskentateho yltää
vähintään pentium tasoisen koneen tasolle.
Ohjelma tarvitsee toimiakseen pelin käynnistystiedoston mm.exe
ja grafiikkakirjaston egavga.bgi. Ohjelma tekee ensimmäisellä
käynnistyskerralla ennätystuloksia varten tiedoston mm.top.
Pelistä on myöskin käynnistystiedoston ja grafiikkakirjaston
lisäksi ohjelmakoodi, muutoksia varten. Tiedosto on mm.pas ja
siitä saa tehtyä käynnistystiedoston turbo pascalin komennolla
tpc mm.pas.
1.3 Ohjelman käyttöohje
1.3.1 Päävalikko
Päävalikossa on viisi komentoa: "Aloita peli", "Vaikeustason
muutto", "Ohjelman lopetus", "Ohjeet pelin säännöistä"
ja "Parhaiden tulosten poisto".
Komentovalikossa liikkuminen tapahtuu nuolilla ylös
ja alas. Komennon suoritukseen käytetään enteriä. Päävalikon
aktiivista komentoa ympäröi sinertävä
suorakaide ja komentovalikon alapuolella on pienimuotoinen ohje komennon
ja näppäinten käytöstä. (Katso kuva 1.) |
Kuva 1: Päävalikko
|
Kun komentoa ruetaan suorittamaan komentonappi painuu sisään.
Tällä on tarkoitus varmistaa, ettei käyttäjä paina
nappia uudelleen, jos komennon suoritus kestää tavallista pidempään.
1.3.1.1 Komento: Aloita peli
Komennolla aloitetaan uusi peli. Päävalikon tilalle ilmestyy
pelivalikko. Pelivalikon toiminnasta ja pelaamisesta kerrotaan luvussa
1.3.2.
2
1.3.1.2 Komento: Vaikeustason muutto
Komennolla muutetaan pelin vaikeustasoa.
Komennon suorituksen jälkeen päävalikon tilalle tulee
vaikeustason muuttovalikko.
Käytössä oleva vaikeustaso on valmiiksi valittuna valikon
ilmestyttyä. Liikkuminen tapahtuu nuolilla ja uusi vaikeustaso valitaan
enterillä. Vaikeustason valinnan jälkeen ohjelma palaa takaisin
päävalikkoon.
Vaikeustaso on koko ohjelman toiminnan ajan myöskin näkyvissä
valikkojen yläpuolella. (Katso kuva 2.) |
Kuva 2: Vaikeustason muuttovalikko
|
1.3.1.3 Komento: Ohjelman lopetus
Komennolla lopetetaan ohjelman toiminta ja siirretään kontrolli
takaisin käyttöjärjestelmälle.
1.3.1.4 Komento: Ohjeet pelin säännöistä
Komennolla tulostetaan pelin pienimuotoinen käyttöohje ruudun
oikeaan reunaan.
Peliohjeista pääsee takaisin päävalikkoon painamalla
enteriä.
1.3.1.5 Komento: Parhaiden tulosten poisto
Komennolla tyhjennetään kaikkien aikojen parhaat tulokset.
Ennen tulosten tyhjentämistä ohjelma pyytää varmistusta.
(Kuva 3.)
Painamalla K tyhjennetään tuloslistat ja palataan päävalikkoon.
Painamalla E ohjelma ei tyhjennä listoja, vaan palaa suoraan päävalikkoon. |
Kuva 3: Parhaiden tulosten poiston varmistus
|
1.3.2 Pelivalikko ja pelaamisohjeet
Pelivalikossa kerrotaan pelissä käytettävät näppäimet.
Pelivalikon alapuolelle on varattu tilaa huomautuksia varten. (Katso
kuva 4.)
Liikkuminen tapahtuu pelilaudalla. Aktiivinen paikka merkitään
vaalean värisellä alaspainetulla napilla. (Katso kuva 5.)
Vaikeustasosta riippuen pelilaudan vasemmasta reunasta on poistettu
paikkoja käytöstä, kuten myös pelirivin tarkistustietojen
paikoista.
Toisin kuin muissa valikoissa liikkuminen numeronäppäimillä
varustetuista nuolista ei onnistu, jos NumLock on päällä,
koska numeroita käytetään värien vaihtoon. |
Kuva 4: Pelivalikko
Kuva 5: Pelirivi
|
Pelin toiminnoista kerrotaan tarkemmin seuraavissa aliluvuissa.
3
1.3.2.1 Värien vaihto
Aktiivisen napin väriä pystyy muuttamaan kahdella tavalla.
Pikanäppäimet 1-6 tai 1-4 (Riippuen käytössä
olevista väreistä) muuttavat napin suoraan pelivalikon värinappien
numeroiden mukaan ja siirtävät samalla kursoria oikealle.
Nuoli ylös muuttaa napin väriksi seuraavan värin ja nuoli
alas edellisen värin.
Tyhjän napin kohdalla nuoli ylös aloittaa ensimmäisestä
väristä ja nuoli alas viimeisestä.
Jos värialueesta yritetään mennä yli, aloitetaan
värien läpikäynti alusta.
1.3.2.2 Liikkuminen
Pelirivillä liikutaan nuolilla oikealle ja vasemmalle, pelirivin
reunoilta siirrytään toisiin reunoihin, jos liikkumiskomennoilla
yritetään mennä pelialueen ulkopuolelle.
Enterillä siirrytään seuraavalle riville, mutta siitä
enemmän luvussa 1.3.2.3.
1.3.2.3 Rivin tarkistuttaminen
Enterillä hyväksytään veikattu rivi. Rivillä
ei saa olla tyhjiä paikkoja. Jos tyhjiä paikkoja löytyy,
riviä ei tarkisteta, vaan kursori siirretään ensimmäiseen
tyhjään paikkaan.
Tarkistuksessa tarkistettavan rivin oikealla puolella siaitsevaan tulospaikkaan
ilmoitetaan kuinka monta oikeaa väriä on oikealla paikalla ja
kuinka
monta oikeaa väriä on väärällä paikalla.
Oikea väri oikeassa paikassa ilmoitetaan mustalla tarkastusmerkillä
ja oikea väri väärässä paikassa ilmoitetaan valkoisella
tarkastusmerkillä. Tarkastusmerkintöjen paikoilla ei ole merkitystä,
vain määrät ilmoitetaan.
Tarkastuksen jälkeen kursori siirretään seuraavan veikkausrivin
alkuun, jos veikkausrivejä ei enää ole, loppuu peli automaattisesti.
1.3.2.4 Luovuttaminen
Pelin pystyy luovuttamaan painamalla ESC.
Ennen luovuttamista ohjelma pyytää varmistusta. (Kuva 6.)
Painamalla K luovutetaan peli.
Painamalla E ohjelma palaa takaisin peliin.
Ennätystuloksissa luovutetut pelit käsitellään kuten
loppuun asti veikatut rivit, eli paras
veikkausrivi voi luovutettaessakin päästä ennätyslistoille. |
Kuva 6: Luovutuksen varmistaminen
|
4
1.3.2.5 Pelin loppuminen
| Peli loppuu, kun on veikattu oikea rivi, veikkausrivit ovat tulleet
täyteen tai peli on luovutettu.
Oikein veikatun rivin tapauksessa ohjelma ilmoittaa monellako arvausrivillä
oikea rivi pääteltiin. (Kuva 7.)
Muissa tapauksissa ohjelma ilmoittaa parhaan veikkauksen. Paras veikkaus
ilmoitetaan muodossa: Oikeita värejä oikeilla paikoilla + oikeita
värejä väärillä paikoilla. (Kuva 8.)
Kaikissa tapauksessa ohjelma odottaa enterin painamista ennenkuin kysyy
pelaajan nimeä ennätyslistoja varten tai palaa päävalikkoon.
Pelin loppuessa paljastetaan myöskin oikea rivi pelilaudan alimmalta
riviltä. |
Kuva 7: Läpimennyt peli
Kuva 8: Läpipääsemätön peli
|
1.3.2.6 Kaikkien aikojen parhaiden tulosten listalle
pääseminen
| Pelin loputtua ohjelma tarkistaa, pääseekö pelaaja tuloksellaan
ennätyslistoille.
Jos pelaajan tulos oikeuttaa ennätyslistapaikkaan, kysyy ohjelma
pelaajan nimeä. (Katso kuva 9.)
Nimen syöttäminen tapahtuu normaalin tekstin syöttämisen
tapaan. Peli ei tosin suostu kirjoittamaan tiettyjä erikoismerkkejä,
mutta tällöin merki ei vain ilmesty ruudulle. |
Kuva 9: Ennätyslistoille pääsy
|
Nimi hyväksytään painamalla enter.
Jos nimeä ei kirjoiteta ja painetaan enter, tulosta ei sioiteta
ennätyslistoihin.
1.4 Virheilmoitukset ja rajoitukset
Ohjelmassa on kaksi virheilmoitusta, jotka voivat tulla vain ohjelman
käynnistyksen yhteydessä:
Virheilmoitus: Grafiikkatilan alustusvirhe: <Kääntäjän
generoima grafiikkatilan alustusvirhe>
Tilanne: Ohjelma ei saanut alustettua grafiikkatilaa, joten ohjelman
suoritus päättyy.
Toimenpiteet: Varmista, että näyttö ja näyttökortti
pystyvät 640x480 pistetarkkuuteen 16 värillä.
Virheilmoitus: Grafiikkavirhe: Haluttu tila 640x480. Nykyinen tila ___x___
Tilanne: Ohjelma sai alustettua grafiikkatilan, mutta pistetarkkuus
ei ole oikea.
Toimenpiteet: Varmista, että näyttö ja näyttökortti
pystyvät 640x480 pistetarkkuuteen 16 värillä.
Kaikkien aikojen parhaiden tulosten listan virheettömyys tarkastetaan
ohjelman käynnistyksen
yhteydessä ja muutosten jälkeen. Jos listassa ilmenee virheitä
lista tyhjennetään automaattisesti.
Tiedoston mm.top kirjoitussuojausta ei tarkisteta. Jos ohjelma kaatuu
ennätyslistojen tyhjennyksen tai päivittämisen yhteydessä
tuhoa ennätyslistatiedosto tai poista sen kirjoitussuojaus.
Pelin rajoitukset: Arvausrivien määrä on rajoitettu kymmeneen.
5
2 Ohjelman toiminta ja rakenne
2.1 Järjestelmän yleiskuvaus ja ratkaisutapa
Ohjelman ydin muodostuu kahdesta valikosta: päävalikosta ja
pelivalikosta.
Kuvassa 10 on graafinen etenemiskaavio ohjelman toiminnasta.
Taustakuvion piirtämisen ja muuttujien alustuksen jälkeen
ohjelma jää päävalikkoon odottamaan käyttäjän
komentoa.
Päävalikosta voi muuttaa vaikeustasoa, jolloin ohjelma kysyy
vaikeustason valintavalikossa uuden
vaikeustason ja palaa takaisin päävalikkoon.
Päävalikosta pystyy myöskin lopettamaan pelin tai lukemaan
peliohjeita.
Parhaiden tulosten tyhjennyskin tehdään päävalikosta,
tyhjennyksen yhteydessä pyydetään käyttäjältä
varmistus.
Päävalikosta pystyy myöskin aloittamaan uuden pelin,
jolloin ohjelman suoritus siirtyy pelivalikkoon.
Pelivalikossa käyttäjä täyttää pelirivejä
erivärisillä nappuloilla ja yrittää arvata oikeaa riviä.
Rivien tarkistusta ennen tarkistetaan että rivi on täynnä,
jos rivi ei ole täynnä siirretään kursori ensimmäiselle
tyhjälle kohdalle ja palataan takaisin pelivalikkoon.
Rivin tarkistuksen jälkeen tarkastetaan, saiko käyttäjä
arvattua oikean rivin. Jos arvasi, niin ohjelmassa siirrytään
lopputuloksen näyttöön.
Jos käyttäjä ei arvannut oikeaa riviä tarkastetaan
onko pelaajalla vielä pelirivejä jäljellä. Jos rivejä
on vielä, siirrytään takaisin pelivalikkoon. Jos rivejä
ei ole, siirrytään lopputuloksen näyttöön.
Pelivalikosta pelaajalla on myös mahdollisuus luovuttaa peli kesken
kaiken. Vahvistuksen jälkeen siirrytään lopputuloksen näyttöön.
Lopputuloksen näytön jälkeen tarkastetaan pääseekö
pelaaja listalle tuloksellaan. Päästessä kysytään
pelaajan nimeä ja päivitetään ennätyslistoja.
Tarkastuksen jälkeen siirrytään takaisin päävalikkoon.
Kuva 10: Looginen rakenne
6
2.2 Tärkeimmät tietorakenteet
2.2.1 Taulukot
Taulukoita käytetään pelirivin ja oikean rivin säilyttämiseen.
Pelaajan arvaama rivi säilytetään taulukossa napit[1..6],
jokainen taulukon alkio kuvaa yhtä pelilaudan nappia. Alkion arvona
on napin väriarvo tai 8, jos väriä ei ole vielä napille
määritetty. Alkion arvona on -1, jos nappia ei käytetä
pelissä. Helpossa ja normaalissa vaikeustasossahan ei ole käytössä
kuin neljä taulukon viimeisintä alkiota.
Oikea rivi säilytetään taulukossa oikeat[1..6],
alkioiden arvot määräytyvät kuten pelaajan antamassa
rivissä.
2.2.2 Muuttujat
Yleiset muuttujat:
Vaikeustaso muuttujalla määritellään pelin
vaikeustaso. Muuttujan vaihteluväli on yhdestä kolmeen.
Paikalliset muuttujat:
Vaikka muuttujat ovatkin paikallisia, on nimeämisessä käytetty
seuraavia tapoja:
Paikka muuttujaa käytetään aktiivisen paikan määrittämiseen.
Rivi muuttujaa käytetään aktiivisen rivin määrittämiseen.
Vari muuttuja nimensä mukaisesti säilyttää
väriarvoa.
X ja y muuttujia käytetään koordinaattien
määritykseen.
Nappeja ja koko muuttujat ilmoittavat yleensä käytössä
olevan pelipöydän leveyden.
Vareja muuttuja ilmoittaa käytössä olevien värien
määrän.
Nappainarvo muuttujalla välitetään painetun näppäimen
arvoa.
Tiedosto muuttuja on tekstitiedoston käsittelymuuttuja.
S muuttujalla käsitellään merkkijonorivejä.
I, j, k ja l muuttujia käytetään
apumuuttujina.
2.2.3 Vakiot
Arvausriveja vaikio määrittelee, kuinka korkea pelilauta
tehdään. Yli kymmenen arvoa ei suositella, koska viimeiset rivit
eivät mahdu ruudulle.
Arvauspaikkoja vakio määrittelee, kuinka leveä
pelilauta tehdään. Leveyden muuttoa ei suositella,
koska pelivalikko menee sekaisin, eikä vakio vaikuta itse pelin
toimintaan.
7
2.3 Määrittely- ja kutsurakenne
Kuvassa 11 on ohjelman kutsumatriisi, joka kertoo mitä aliohjelmakutsuja
proseduurit sisältävät. Aliohjelmakutsuissa välitettävistä
parametreistä kerrotaan jokaisen aliohjelman kohdalla erikseen (Luvut
2.4.1 - 2.4.15).
Kuva 11: Kutsumatriisi
2.4 Ohjelman toiminta
Grafiikan käsittelyä varten ohjelmassa on 5 apuproseduuria:
Grafiikkatilaan, Box, OutTextXYZ, PiirraTausta ja VaikeustasonTulostus.
Pelin läpipääsyn onnittelua varten on proseduuri OnnitteluDemo
ja ohjelmasta poistumista varten proseduuri Poistuminen.
Valikkojen graafisesta toteutuksesta huolehtivat proseduurit PiirraValikko
ja PiirraValikonNappi.
Pelilaudan graafisesta toteutuksesta huolehtivat proseduurit
TeePeliPoyta, PiirraNappi ja TulostenPiirto.
Peliohjeiden näytöstä huolehtii proseduurit Pikaohje
ja Peliohje.
Kaikkien aikojen parhaiden tulosten käsittelystä huolehtii
proseduurit TulostaParhaatTulokset, TyhjennaParhaatTulokset ja ParhaatTuloksetPaivitys.
Itse pelin toteuttaa proseduuri AloitaPeli ja rivien tarkistuksista
huolehtii proseduuri Tarkista.
Valikkojen toiminnallinen toteutus on proseduureissa Paavalikko, KysyVaikeustaso
ja VarmistaTyhjennetaanko.
Näppäimistön käsittelyä varten ohjelmassa
on proseduuri LueNappain.
Pääohjelmasta ja aliohjelmista kerrotaan lisää luvuissa
2.4.1 - 2.4.15.
8
2.4.1 Pääohjelma
Pääohjelman alussa alustetaan muuttujat, grafiikkatila ja
piirretään taustakuva pelipöytineen ja parhaine tuloksineen.
Päävalikon piirtoa ja käsittelyä toistetaan niin pitkään,
kunnes käyttäjä valitsee päävalikosta ohjelman
lopetuksen.
2.4.2 Aliohjelma PiirraValikko
Parametrinä välitetään piirrettävän valikon
järjestysnumero, jonka perusteella piirretään valikko.
Järjestysnumerot ja valikot:
0 Pävalikko (Kuva 1 luvussa 1.3.1.)
1 Vaikeustason muuttovalikko (Kuva 2. luvussa 1.3.1.2)
2 Tuloslistojen tyhjennyksen varmistusvalikko (Kuva 3 luvussa 1.3.1.5.)
3 Pelivalikko (Kuva 4 luvussa 1.3.2.)
4 Pelin luovutuksen varmistusvalikko (Kuva 6 luvussa 1.3.2.4.)
5 Onnitteluvalikko (Kuva 7 luvusta 1.3.2.5.)
6 Tuloksen näyttövalikon taustakuva (Kuva 8 luvusta 1.3.2.5
ilman paras arvaus tekstiä.)
2.4.3 Aliohjelma PiirraValikonNappi
Parametreinä välitetään valikon napin järjestysnumero
ja piirrettävän napin tyyli.
Järjestysnumeron perusteella aliohjelma vain määrittelee
napin y koordinaatin.
Tyylin perusteella piirretään neljää erilaista
nappia:
0 Normaali ei aktiivinen nappi
1 Valittuna oleva nappi
2 Alaspainettu nappi
3 Normaali, ei aktiivinen nappi, harmaaksi väritettynä (Käytetään
valikkojen tekemisessä.)
Aliohjelma ei ole yhteydessä PiirraValikko aliohjelmaan, joten
valikon nappien oikeasta sioittelusta pitää huolehtia valikon
piirtämisen yhteydessä.
Aliohjelma ei myöskään huolehdi, kuinka napit suhtautuvat
toisiinsa, joten valikossa liikuttaessa on vanha aktiivinen nappi piirrettävä
normaaliksi ja uusi aktiivinen nappi valituksi.
2.4.4 Aliohjelma PiirraNappi
Parametreinä välitetään piirrettävän pelilaudan
napin x ja y koordinaatit sekä väri.
Koordinaatit eivät ole grafiikkatilan koordinaatteja, vaan koordinaateilla
ilmoitetaan napin siainti pelilaudalla.
Väriparametrissäkin on normaaleista väreistä poikkeavia
arvoja. Arvoilla 0..7 piirretään kohollaan olevia nappeja, Arvoilla
8-15 napit ovat syvennettyjä. Yli 15 arvot käsitellään
kuten arvo 15.
Väriparametrinä voidaan myös antaa negatiivisia arvoja.
Arvolla -1 olemassaoleva nappi häivytetään ja arvolla -2
piirretään napin ulkopuolella oleva syvennys. -2 pienemmät
arvot käsitellään kuten arvo -2.
2.4.5 Aliohjelma TulostenPiirto
Parametreinä välitetään rivi, jolle tulokset tehdään,
mustien ja valkoisten nappien määrät ja nappipaikkojen määrä.
Riviparametrillä määritetään y koordinaatti,
aivan samaan tapaan kuin aliohjelmassa PiirraNappi.
Nappipaikkojen määrällä ilmoitetaan kuinka monta
nappia kuudesta napista on merkitseviä, merkittömät nappipaikat
häivytetään.
Mustien ja valkoisten nappien määriä ei tarkasteta. Esimerkiksi
parametreillä mustia nappeja 5, valkoisia 3 ja nappipaikkoja 4 tulosriviin
tulee 5 mustaa ja yksi valkoinen nappi ja näistä näkyvistä
napeista kaksi viimeisintä on häivytetty.
9
2.4.6 Aliohjelma TulostaParhaatTulokset
Aliohjelma tulostaa parhaat tulokset tiedostosta näytölle.
Jos parhaiden tulosten säilytykseen kätytettävää
tiedostoa ei löydy, tai siinä ei ole tarpeeksi rivejä, aloihjelma
kutsuu TyhjennäParhaatTulokset proseduuria, joka tekee uuden tiedoston.
2.4.7 Aliohjelma TyhjennaParhaatTulokset
Aliohjelma nollaa parhaiden tulosten säilytykseen käytettävän
tiedoston.
Muutoksia ei päivitetä näytölle automaattisesti,
vaan tyhjennyksen jälkeen on kutsuttava tulostusproseduuria.
2.4.8 Aliohjelma ParhaatTuloksetPaivitys
Parametreinä välitetään käytetty vaikeustaso,
pelaajan käyttämien arvausrivien määrä ja pelaajan
paras tulos. Paras tulos ilmoitetaan kokonaislukuna, oikeiden värien
määrä oikeilla paikoilla kerrotaan kymmenellä ja siihen
lisätään oikeiden värien määrä väärillä
paikoilla. Esimerkiksi arvo 21 tarkoittaa 2 oikeata väriä oikella
paikalla ja yhtä oikeaa väriä väärällä
paikalla.
Aliohjelma tarkastaa kuinka hyvälle sioitukselle pelaaja pääsee
ennätyslistoilla.
Jos pelaaja pääsee ennätyslistoille, kysyy proseduuri
pelaajan nimeä ja nimen saatuaan päivittää pelaajan
listoille. Päivitys tehdään lukemalla vanhaa ennätyslistaa
ja kirjoittamalla muutettua ennätyslistaa toiseen tiedostoon. Muutosten
jälkeen vanha lista tuhotaan ja uusi ennätyslista nimetään
vanhan listan tilalle.
2.4.9 Aliohjelma AloitaPeli
Proseduuri huolehtii mastermind pelin toiminnasta. Vaativan tehtävänsä
ansiosta proseduuri vaikuttaa alkuun kenties monimutkaiselta, mutta se
voidaan helposti jakaa kolmeen helposti hahmotettavissa olevaan osaan:
Proseduurin ensimmäisessä osassa alustetaan pelissä käytettävät
muuttujat ja arvotaan oikea rivi.
Keskimmäisessä osassa kommunikoidaan käyttäjän
kanssa ja tarkastetaan käyttäjän arvaamia rivejä. Viimeiseen
vaiheeseen siirrytään, kun peli on loppunut. Ehtoina pelin loppumiselle
on arvausrivien loppuminen, luovuttaminen tai oikean rivin veikkaaminen.
Viimeisessä osassa paljastetaan oikea rivi ja pelaajan parhaan
tuloksen perusteella joko onnitellaan läpipääsystä
tai vain kerrotaan pelaajan paras arvaus.
Lopuksi kutsutaan ParhaatTuloksetPaivitystä, joka tarkistaa pääseekö
tuloksella ennätyslistoille ja tarvittaessa päivittää
ennätystuloksia.
2.4.10 Aliohjelma Tarkista
AloitaPeli proseduurin selventämiseksi pelirivien tarkistukset
on sioitettu omaan aliohjelmaansa.
Tämän proseduurin tehtävänä on yksinkertaisesti
verrata pelaajan arvaamaa riviä oikeaan riviin ja välittää
kahdella muuttujaparametrillä tarkistuksen tulos kutsuvalle rutiinille.
Ensimmäisellä muuttujaparamerilla palautetaan oikeilla paikoilla
olevien nappien määrä ja toisella oikeiden nappien, mutta
väärillä paikoilla. Tarkistettavat rivit luetaan suoraan
taulukoista napit ja oikeat.
10
2.4.11 Aliohjelma Paavalikko
Proseduurin parametrinä välitetään muuttujaparametri.
Kutsun yhteydessä parametrillä välitetään aktiivisen
napin järjestysnumero, jos parametrin arvo on virheellinen valitaan
ylin nappi aktiiviseksi. Poistuttaessa parametrillä välitetään
painetun napin järjestysnumero.
Aliohjelma toteuttaa päävalikon komentojen valinnan, päävalikko
on piirrettävä ennen kutsua.
2.4.12 Aliohjelma KysyVaikeustaso
Proseduurin parametrinä välitetään muuttujaparametri.
Kutsun yhteydessä parametrillä välitetään nykyinen
vaikeustaso, joka on siis samalla aktiivisen napin järjestysnumero.
Jos parametrin arvo on virheellinen valitaan ylin nappi aktiiviseksi. Poistuttaessa
parametrillä välitetään uusi vaikeustaso, eli painetun
napin järjestysnumero.
Aliohjelma toteuttaa vaikeustason kysymisvalikon komentojen valinnan,
valikko on piirrettävä ennen kutsua.
2.4.13 Aliohjelma VarmistaTyhjennetaanko
Aliohjelma piirtää kaikkien aikojen parhaiden tulosten tyhjennyksen
varmistusvalikon ja odottaa käyttäjän varmistusta. Varmistuksen
saatuaan tyhjentää parhaiden tulosten tiedoston ja päivittää
muutokset näytölle.
2.4.14 Aliohjelma LueNappain
Tämä funktio palauttaa käyttäjän painaman napin
koodin. Jos nappia ei ole painettu jää aliohjelma odottamaan
napin painamista.
Normaaleissa napeissa funktio palauttaa painetun napin ascii-koodin.
Erikoisnäppäimissä, eli ensimmäinen koodi on 0
ja seuraava koodi on erikoisnäppäimen ascii-koodi, funktio palauttaa
erikoisnäppäimen ascii-koodin, johon on lisätty 1000.
Esimerkiksi painettaessa A, aliohjelma palauttaa A:n ascii koodin,
65.
Painettaessa nuolta ylös, aliohjelma palauttaa arvon 1072, joka
siis koostuu ascii-koodeista 0 ja 72.
2.4.15 Muut aliohjelmat
GrafiikkaTilaan
Siirtää ohjelman tekstimodista grafiikkatilaan tai
antaa virheilmoituksen grafiikkatilaan
siirtymisen epäonnistumisesta ja pysäyttää
ohjelman suorituksen.
Box
Saa parametreinään suorakaiteen vasemman yläkulman
ja oikean alakulman koordinaatit ja
kolme väriä, ensimmäisellä värillä
väritetään suorakaiteen vasen- ja yläreuna, jos keskimmäinen
väri on positiivinen väritetään suorakaide
sillä värillä sisältä ja viimeisellä värillä
väritetään
suorakaiteeen oikea- ja alareuna.
OutTextXYZ
Saa parametreinään kirjoitettavan tekstin vasemman
yläkulman x- ja y-koordinaatit,
kirjoitettavan tekstin, vahvennuksen koon ja kolme väriä.
Aliohjelmalla kirjoitetaan ulkoreunaista tekstiä.
Ensimmäinen ja viimeinen väri ovat ulkoreunuksen värejä.
Jos keskimmäinen väri ei ole negatiivinen täytetään
kirjaimet sisältä sillä värillä.
Vahvennuksella määritellään kuinka paksuja
kirjaimia tehdään. Vahvennuksella 0
tehdään normaalia tekstiä, vahvennuksella 1 tekstiin
tulee ulkoreunukset. Yli yhden
vahvennukset kasvattavat sisäkirjainten paksuutta.
11
PiirraTausta
Piirtää ohjelman taustakuvan.
VaikeustasonTulostus
Tulostaa parametrinä saadun vaikeustason tekstin ruudulle.
Onnitteludemo
Värittää onnittelutekstiä eri väreillä
niin pitkään kunnes käyttäjä painaa enteriä.
Poistuminen
Häivyttää peliruudun, poistaa ohjelman grafiikkatilasta
ja tulostaa lopetustekstit.
TeePelipoyta
Piirtää mastermind pelilaudan, parametrina annetaan
vaikeustaso, jonka perusteella aliohjelma
osaa tarvittaessa häivyttää pelilaudan kaksi vasemmanpuoleista
riviä.
Pikaohje
Tulostaa parametrina saadun ohjeen järjestysnumeron mukaisen
ohjeen sille varatulle alueelle.
Peliohje
Tulostaa ruudun oikeaan reunaan ohjeet pelin säännöistä
ja odottaa, kunnes käyttäjä painaa
enteriä.
2.5 Parannusehdotuksia
Arvausrivien määrää olisi voinut lisätä
tekemällä pelilautaan rullausmahdollisuus, siten että
10 viimeisintä arvausta olisi näkyvissä ja sitä aikaisempia
arvauksia voisi käydä katsomassa.
Pelin luovuksen yhteydessä ennätyslistoille pääsyn
tarkastuksen voisi jättää pois. Kukaan ei varmasti halua
päästä ennätyslistoille, jos luovuttaa pelin kesken
kaiken. Häiritseväksi tämä pelin ominaisuus tulee viimeistään,
kun pelin ennätyslistat on tyhjiä ja luovuttaa pelin.
Pelilaudalla liikkumisen helpottamiseksi näppäimiin olisi
voinut lisätä bacspacen, joka olisi toiminut kuten nuoli vasemmalle.
Värinäppäimiä käytettäessä bacspace
tulee korjauksia tehdessä ensimmäiseksi mieleen.
AloitaPeli proseduuri olisi voitu jakaa kolmeen osaan. Nyt proseduurin
nimi on hieman harhaanjohtava. AloitaPeli proseduurihan itseasiassa toteuttaa
koko pelin, eikä vain pelin aloitusta.
Vakeustason liittyminen pelilaudan leveyteen ja nappien värien
määriin olisi voitu toteuttaa yhdessä proseduurissa, joka
olisi palauttanut vaikeustason perusteella pelilaudan leveyden ja värien
määrät. Vaikeustasojen vaikutuset peliin tarkastetaan tällä
hetkellä jokaisessa proseduurissa erikseen, mikä vaikeuttaa huomattavasti
vaikeustasojen päivityksiä myöhemmin.
Ennätyslistojen käsittelyrutiineissa voitaisiin tarkastaa
listojen olemassaolo ja oikeellisuus. Nyt tarkastukset tehdään
vain ennätyslistojen tulostuksen yhteydessä. Ohjelma siis luottaa
siihen, että ennätyslistatiedoston on pakko olla olemassa ja
kunnollinen, koska ohjelman käynnistyksen yhteydessä ennätyslistat
on tarkistettu ja tulostettu. Jos tiedosto on kirjoitussuojattu ohjelma
kaatuu silloin, kun ennätyslistoja yritetään tyhjentää
tai päivittää.
12
3 Testaus
3.1 Grafiikan käsittelyyn ja tulostukseen liittyvät
aliohjelmat
Aliohjelma GrafiikkaTilaan testattiin käynnistämällä
ohjelma siten, ettei ohjelma löytänyt grafiikkakirjastoa egavga.bgi.
Pistetarkkuuden tarkistus testattiin muuttamalla ehtolausetta niin, että
pistetarkkuudesta syntyi virheilmoitus.
Aliohjelmien Box, OutTextXYZ, PiirraTausta, VaikeustasonTulostus, Onnitteludemo
ja Poistuminen testaus sivuutettiin, koska aliohjelmat toimivat täydellisesti
ainakin ohjelman puitteissa. Muiden aliohjelmien testauksessa jokainen
proseduurikutsu, joka kohdistuu edellämainituihin proseduureihin tulee
käytyä läpi ja mahdolliset virheet huomattaisiin niitä
testatessa.
Aliohjelmien PiirraValikko ja PiirraValikonNappi suoritettiin visuaalinen
testaus, päävalikon kaikki alivalikot käytiin läpi
ja jokaisen valikon vaihtoehdot testattiin. Pelin jälkeiset valikot
testattiin tyhjentämällä ennätystulokset ja läpäisemällä,
luovuttamalla ja tahallisesti läpäisemättä peli.
Näin saatiin käytyä PiirraValikko ja PiirraValikonNappi
proseduurien kaikki rivit läpi.
TeePeliPoyta aliohjelma testattiin käymällä vaikeustasovalikon
kaikki kolme vaihtoehtoa läpi, jolloin jokainen pelissä käytettävä
vaihtoehto tuli testattua.
PiirraNappi aliohjelma testattiin käymällä jokaisella
paikalla jokainen napin väri läpi. Testausrutiini on liitteessä
4.
TulostenPiirto aliohjelma testattiin käymällä ensimmäisellä
arvausrivillä jokainen mahdollinen tulos läpi ja lopuksi tulostamalla
jokaiselle riville testitulos. Testausrutiini on liitteessä 4.
Pikaohje testattiin käymällä kaikki mahdolliset ohjeet
läpi samaan tapaan kuten aliohjelmat PiirraValikko ja PiirraValikonNappi.
3.2 Kaikkien aikojen parhaiden tulosten käsittelyyn
liittyvät aliohjelmat
Aliohjelma TulostaParhaatTulokset testattiin virheellisillä ennätyslistoilla.
Listatiedoston puuttuessa tai jos tiedostossa oli liian vähän
rivejä aliohjelma toimi kuten pitääkin.
Tyhjillä tulosriveillä tulokset vain puuttuivat niiden paikalta.
Ylipitkillä riveillä tai virheellisillä merkinnöillä
tuloslistat näyttivät sekavilta, mutta ohjelma ei kaatunut. Jos
tiedosto siis läpäisee tarkastuksen, pystyy proseduuri tulostamaan
sen kaatamatta ohjelmaa.
Aliohjelma TyhjennaParhaatTulokset kaataa ohjelman, jos kirjoituslupaa
ei jostain syystä saada tiedostopalvelimelta (Esimerkiksi jos tiedosto
on kirjoitussuojattu.). Aliohjelma tekee uuden tiedoston ja korvaa vanhan
kirjoitussuojaamattoman tiedoston moitteitta.
Aliohjelma ParhaatTuloksetPaivitys testattiin tyhjentämällä
ennätystulokset ja lisäämällä tuloksia tietyssä
järjestyksessä ennätyslistoille, jolloin vertailun kaikki
ehdot käytiin läpi. Testausrutiini on liitteessä 4.
Jos tiedoston sisältö on virheellistä, mutta siinä
on tarvittava määrä rivejä ei proseduuri kaada ohjelmaa.
Jos tiedosto on kirjoitussuojattu kaatuu ohjelma siinä vaiheessa,
kun päivitys yritetään suorittaa.
13
3.3 Pelaamisen toteuttavat aliohjelmat
AloitaPeli aliohjelma testattiin pelaamalla ja käymällä
kaikki tapaukset läpi seuraavasti:
Kursorin ollessa pelilaudan vasemmassa reunassa nuoli vasemmalle vei
kursorin laudan oikeaan reunaan. Oikeasta reunasta nuoli oikealle vei kursorin
laudan vasempaan reunaan. Numeronäppäimillä ja nuolilla
ylös ja alas pelinapin väri vaihtui odotetulla tavalla. Vain
käytössä olleita värejä sai asetettua. Pelilaudan
oikeassa reunassa numeronäppäin asetti halutun värin ja
siirsi kursorin pelilaudan vasempaan reunaan.
Enterillä ei saanut tarkistettua vajaata riviä. Vajaan rivin
tapauksessa kursori siirtyi ensimmäiseen tyhjään paikkaan
ja ohje pyysi täyttämään rivin loppuun ennen hyväksymistä.
Täyden rivin kohdalla enterillä ilmestyi tarkastusmerkinnät
ja kursori siirtyi seuraavalle riville. Viimeisellä rivillä hyväksymisen
jälkeen peli loppui.
ESC:llä pelivalikon tilalle ilmestyi varmistusvalikko. Iso tai
pieni e palautti toiminnan takaisin peliin. Iso tai pieni k lopetti pelin.
Pelin loppuessa oikea rivi paljastui alariville ja pelivalikon tilalle
tuli joko onnittelu pelin läpipääsystä tai tieto parhaasta
tuloksesta. Ennätyslistoille pääsyn yhteydessä nimen
kysyminen tuli visuaalisesti oikeaan kohtaan kummassakin tapauksessa.
Testi toisettiin kaikilla vaikeustasoilla.
Tarkista proseduurin testaus osottautui odotetusti hankalaksi. Kaikken
vaihtoehtojen testaus ei ole järkevää, joten proseduurin
testaus toteutettiin vain periaatteellisella tasolla.
Merkatut - taulukolla pidetään kirjaa oikean rivin napeista,
joista on annettu tarkastusmerkintä. Selvyyden vuoksi oikean rivin
nappia, jolla ei ole tarkastusmerkintää kutsutaan vapaaksi ja
tarkastusmerkinnän saanutta nappia varatuksi.
Aluksi tarkastetaan oikeat napit oikeilla paikoilla.
Pelaajan antamat napit käydään järjestyksessä
läpi ja jos veikattavassa rivissä on samalla paikalla saman värinen
nappi, lisätään oikealla paikalla olevien nappien määrää
yhdellä ja merkataan veikattavan rivin nappi varatuksi.
Nyt oikealla paikalla olevien nappien määrä on saatu
selvitettyä. Selvitettävänä on enää oikean
väristen nappien määrät, jotka ovat väärillä
paikoilla.
Taas lähdetään käymään pelaajan nappeja
läpi, mutta vain ne napit käydään läpi, joita
ei ole käytetty. Tarkastus on helppo, katsotaan vain, ettei oikalla
rivillä ole saman väristä nappia samassa kohdassa.
Jos pelaajan nappia ei ole käytetty, verrataan pelaajan nappia
oikean rivin nappeihin.
Jos löydetään saman värinen nappi, joka on vapaa,
lisätään oikean väristen mutta väärällä
paikalla olevien nappien määrää yhdellä, merkataan
veikattavan rivin nappi varatuksi ja siirrytään tarkastelemaan
pelaajan seuraavaa nappia.
Mistään napista ei voi tulla kahta merkintää. Veikattavan
rivin napit merkataan aina varatuiksi ja
pelaajan napit käydään järjestyksessä läpi
ja toisella läpikäynnillä varmistetaan ettei ensimmäisellä
läpikäynnillä napista ole annettu merkintää.
Vaikeustasoista johtuen tarkistuksessa joudutaan myös varmistamaan,
ettei napin väriarvo ole -1, koska silloin nappi ei ole käytössä.
3.4 Valikkojen toteutuksen ja kommunikoinnin pääasialliset
aliohjelmat
Aliohjelmat Paavalikko ja KysyVaikeustaso on testattu käymällä
valikoiden kaikki mahdollisuudet läpi ja yrittämällä
viedä kursoria pois valikoiden toiminta-alueilta.
Aliohjelma VarmistaTyhjennetaanko on testattu käymällä
valikossa sekä perumalla että hyväksymällä tyhjennys.
Aliohjelma LueNappain on testattu testausrutiinilla käymällä
mahdollisesti hankalia näppäinyhdistelmiä läpi. Kaikkia
näppäinyhdistelmiä proseduuri ei pysty lukemaan, mutta ohjelman
käyttämien näppäinten lukeminen onnistui hyvin. Testausrutiini
on liitteessä 4. |