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.