Kirjoittaja: Antti Laaksonen
Kirjoitettu: 08.01.2008 – 08.01.2008
Tagit: koodi näytille, vinkki
Haluaisitko peliisi kunnollisen tuloslistan?
Tässä on esimerkki, jossa tuloslistaa säilytetään taulukossa ja listalle voi lisätä tuloksia, jotka asettuvat oikealle paikalle pistejärjestykseen. Jos tulos ei ole tarpeeksi hyvä listalle päästäkseen, listaan ei tule muutosta. Lisäksi listan voi tallentaa tiedostoon sekä lukea tiedostosta, jotta tulokset pysyvät voimassa ohjelman suorituskertojen välillä.
Vaikein asia tuloslistan toteutuksessa on uuden tuloksen lisääminen listalle. Valmiina taulukossa olevan listan näyttäminen on kyllä helppoa. Tulos lisätään listalle niin, että ensin etsitään ensimmäinen listan kohta, jossa pistemäärä on alhaisempi kuin uusi pistemäärä. Jos tällaista kohtaa ei löydy, uusi tulos ei kelpaa listalle. Mutta jos kohta löytyy, siirretään kaikkia sen kohdan jälkeisiä tuloksia yksi rivi alemmas, jotta uudelle tulokselle on tilaa. Taulukon rivejä täytyy siirtää yksi kerrallaan, ja siirrot täytyy suorittaa taulukon lopusta ylöspäin. Jos rivejä yrittää siirtää lisäyskohdasta alaspäin, taulukon tiedot sotkeutuvat, kun yksi rivi jyrää alleen kaikki muut.
Esim. listalla on viisi tulosta ja lista näyttää tältä:
ddd 800 aaa 500 ccc 400 bbb 200 eee 100
Nyt listalle lisätään tulos fff (600), jolloin siirrot ovat bbb eee:n tilalle, ccc bbb:n tilalle ja aaa ccc:n tilalle. Tämän jälkeen fff:n voi laittaa aaa:n tilalle. Mutta jos silmukka kulkisi väärinpäin, aaa menisi ccc:n tilalle, uusi ccc (eli aaa) menisi bbb:n tilalle ja uusi bbb (eli ccc eli aaa) menisi eee:n tilalle. Nyt koko listan loppuosa olisi täynnä aaa-tuloksia, joten tästä näkee, miksi silmukka täytyy suunnitella niin, että siirtäminen alkaa taulukon lopusta.
Ensimmäinen koodilistaus sisältää listan määrittelyn ja tarvittavat aliohjelmat. Toinen koodilistaus on yksinkertainen esimerkki aliohjelmien käytöstä. Kolmannessa koodilistauksessa on kokonainen peli, jossa pitää arvata pelikorttien värejä. Tulokset merkitään listaan, jota säilytetään tiedostossa.
PS. Jos saat pelissä korkean tuloksen (yli 4), sinulla on luultavasti yliluonnollisia kykyjä!
tuloslistan määrittely ja aliohjelmat
TYPE TTulos nimi AS STRING * 20 pisteet AS INTEGER END TYPE ' listan tulosten määrä CONST MAARA = 10 DIM SHARED Tulokset(MAARA) AS TTulos ' lukee listan tiedostosta SUB LataaLista (tiedosto AS STRING) OPEN tiedosto FOR BINARY AS #1 FOR i% = 1 TO MAARA GET #1, , Tulokset(i%) NEXT CLOSE #1 END SUB ' lisää uuden tuloksen listalle (jos mahtuu) SUB LisaaTulos (nimi AS STRING, pisteet AS INTEGER) FOR i% = 1 TO MAARA ' jos listalla on pienempi pistemäärä... IF Tulokset(i%).pisteet < pisteet THEN ' ...siirretään sitä ja alempia tuloksia alemmas... FOR j% = MAARA - 1 TO i% STEP -1 Tulokset(j% + 1).nimi = Tulokset(j%).nimi Tulokset(j% + 1).pisteet = Tulokset(j%).pisteet NEXT ' ...ja lisätään uusi tulos sen kohdalle Tulokset(i%).nimi = nimi Tulokset(i%).pisteet = pisteet EXIT SUB END IF NEXT END SUB ' tulostaa listan tiedot näytölle SUB NaytaLista PRINT "NIMI"; TAB(22); "PISTEET" FOR i% = 1 TO MAARA PRINT Tulokset(i%).nimi; Tulokset(i%).pisteet NEXT PRINT END SUB ' tallentaa listan tiedostoon SUB TallennaLista (tiedosto AS STRING) OPEN tiedosto FOR BINARY AS #1 FOR i% = 1 TO MAARA PUT #1, , Tulokset(i%) NEXT CLOSE #1 END SUB ' tyhjentää listan tiedot SUB TyhjennaLista FOR i% = 1 TO MAARA Tulokset(i%).nimi = "---" Tulokset(i%).pisteet = 0 NEXT END SUB
näin aliohjelmia käytetään
TyhjennaLista LisaaTulos "A. A.", 100 LisaaTulos "B. B.", 400 LisaaTulos "C. C.", 200 LisaaTulos "D. D.", 800 LisaaTulos "E. E.", 300 NaytaLista TallennaLista "lista.dat" TyhjennaLista NaytaLista LataaLista "lista.dat" NaytaLista
tuloslista pelin osana
' selvitetään tuloslistatiedoston pituus OPEN "arvaus.dat" FOR BINARY AS #1 pituus% = LOF(1) CLOSE #1 ' jos pituus on 0, tiedosto on tyhjä IF pituus% = 0 THEN TyhjennaLista ELSE LataaLista "arvaus.dat" END IF CLS PRINT "Tässä pelissä on tehtävänä arvata pelikorttien värejä." PRINT INPUT "Kirjoita aluksi nimesi: ", nimi$ RANDOMIZE TIMER pisteet% = 0 PRINT DO ' 0 = musta, 1 = punainen vari% = INT(RND * 2) PRINT "Onko kortti musta (M) vai punainen (P)?" ' odotetaan nappia M tai P DO nappi$ = UCASE$(INKEY$) LOOP UNTIL nappi$ = "M" OR nappi$ = "P" ' tarkastetaan arvaus IF (nappi$ = "M" AND vari% = 0) OR (nappi$ = "P" AND vari% = 1) THEN PRINT "Oikein meni!" pisteet% = pisteet% + 1 PRINT "Pistemäärä: "; pisteet% ELSE PRINT "Väärin meni!" LisaaTulos nimi$, pisteet% EXIT DO END IF LOOP SLEEP 2 CLS NaytaLista TallennaLista "arvaus.dat"
Ihan hyvä systeemi.