Kirjautuminen

Haku

Tehtävät

Koodit: QB: Pelin tuloslista

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"

Kommentit

Dude [09.01.2008 17:21:55]

#

Ihan hyvä systeemi.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta