Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Ennätyslista

Sivun loppuun

Ibe666 [25.02.2007 10:42:52]

#

Oon yrittäny tehdä highscore listaa VB6:lla mutta en saa sitä oikein toimimaan kunnolla. Haluan että siinä näkyy aika ja nimi ja niiten pitää olla järjestyksessä tietysti.

Minulla on tällänen koodi siihen:

Private Sub Command1_Click()
Form3.Label2(0).Caption = GetSetting("Klickaus", "highscore", "Label2(0)pisteet", 0)
Form3.Label2(1).Caption = GetSetting("Klickaus", "highscore", "Label2(1)pisteet", 0)
Form3.Label2(2).Caption = GetSetting("Klickaus", "highscore", "Label2(2)pisteet", 0)
Form3.Label2(3).Caption = GetSetting("Klickaus", "highscore", "Label2(3)pisteet", 0)
Form3.Label2(4).Caption = GetSetting("Klickaus", "highscore", "Label2(4)pisteet", 0)
Form3.Label2(5).Caption = GetSetting("Klickaus", "highscore", "Label2(5)pisteet", 0)
Form3.Label2(6).Caption = GetSetting("Klickaus", "highscore", "Label2(6)pisteet", 0)
Form3.Label2(7).Caption = GetSetting("Klickaus", "highscore", "Label2(7)pisteet", 0)
Form3.Label2(8).Caption = GetSetting("Klickaus", "highscore", "Label2(8)pisteet", 0)
Form3.Label2(9).Caption = GetSetting("Klickaus", "highscore", "Label2(9)pisteet", 0)
If Label3.Caption > Form3.Label2(0).Caption Then
    For a = 0 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(0) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(1).Caption Then
    For a = 1 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(1) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(2).Caption Then
    For a = 2 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(2) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(3).Caption Then
    For a = 3 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(3) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(4).Caption Then
    For a = 4 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(4) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(5).Caption Then
    For a = 5 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(5) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(6).Caption Then
    For a = 6 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(6) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(7).Caption Then
    For a = 7 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(7) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(8).Caption Then
   For a = 8 To 9
   Form3.Label2(a) = 0
    Next a
   Form3.Label2(8) = Label3.Caption
ElseIf Label3.Caption > Form3.Label2(9).Caption Then
    For a = 9 To 9
    Form3.Label2(a) = 0
    Next a
    Form3.Label2(9) = Label3.Caption
End If
SaveSetting "Klickaus", "highscore", "Label2(9)pisteet", Form3.Label2(9).Caption
SaveSetting "Klickaus", "highscore", "Label2(8)pisteet", Form3.Label2(8).Caption
SaveSetting "Klickaus", "highscore", "Label2(7)pisteet", Form3.Label2(7).Caption
SaveSetting "Klickaus", "highscore", "Label2(6)pisteet", Form3.Label2(6).Caption
SaveSetting "Klickaus", "highscore", "Label2(5)pisteet", Form3.Label2(5).Caption
SaveSetting "Klickaus", "highscore", "Label2(4)pisteet", Form3.Label2(4).Caption
SaveSetting "Klickaus", "highscore", "Label2(3)pisteet", Form3.Label2(3).Caption
SaveSetting "Klickaus", "highscore", "Label2(2)pisteet", Form3.Label2(2).Caption
SaveSetting "Klickaus", "highscore", "Label2(1)pisteet", Form3.Label2(1).Caption
SaveSetting "Klickaus", "highscore", "Label2(0)pisteet", Form3.Label2(0).Caption
Form3.Show
Unload Me
End Sub

Antti Laaksonen [25.02.2007 11:48:16]

#

Ongelmana taitaa olla uuden tuloksen lisäys listalle. Oletan nyt, että Label3 sisältää uuden tuloksen, Label2(0) - Label2(9) sisältävät ennätyslistan tulokset ja mitä enemmän pisteitä, sitä korkeammalle tulos kuuluu listalla. Tarvittava koodi näyttää silloin suurin piirtein tältä:

Private Sub Command1_Click()
    Dim i As Integer, j As Integer

    ' luetaan ennätykset näkyviin
    For i = 0 To 9
        Form3.Label2(i).Caption = GetSetting("Klickaus", "highscore", "pisteet" & i, 0)
    Next

    ' etsitään paikka uudelle tulokselle
    For i = 0 To 9
        ' jos tulos on suurempi, uusi paikka on löytynyt
        If Val(Label3.Caption) > Val(Form3.Label2(i).Caption) Then
            ' siirretään seuraavia tuloksia alemmas
            For j = 9 To i + 1 Step -1
                Form3.Label2(j).Caption = Form3.Label2(j - 1).Caption
            Next
            ' lisätään uusi tulos
            Form3.Label2(i).Caption = Label3.Caption
            ' poistutaan silmukasta
            Exit For
        End If
    Next

    ' tallennetaan ennätykset
    For i = 0 To 9
        SaveSetting "Klickaus", "highscore", "pisteet" & i, Form3.Label2(i).Caption
    Next
End Sub

Ennätysten lukua ja tallennusta voi lyhentää silmukan avulla, koska jokaisen rivin rakenne on sama. Muutin myös tallennusmuotoa niin, että tunnukset ovat "pisteet0" - "pisteet9" aikaisemman "Label2(0)pisteet" - "Label2(9)pisteet" sijasta. Tulokselle löytyy oikea paikka tutkimalla ennätyksiä parhaimmasta lähtien, kunnes löytyy ennätys, joka on uutta tulosta huonompi. Tällöin siirretään kaikkia alempia ennätyksiä yksi askel alemmas, jolloin saadaan tilaa uudelle ennätykselle. Jos tulos ei olekaan niin hyvä, että se pääsisi ennätysten listalle, silmukka vain käydään läpi, mutta ennätyksiin ei tehdä mitään muutoksia.

Ibe666 [25.02.2007 12:23:33]

#

Toi toimii, mutta jos tulee aika 0:6 eli alle 1 jäävä niin se ei laita sitä sinne. Ja mitenkäs saan sen nimen mukaan? Form2 on text1 ja sen pitäs mennä Form3 label1(a). Ja jos tossa "If Val(Label3.Caption) > Val(Form3.Label2(i).Caption) Then" on toi < noin päin ja jos se lista on tyhjä niin se ei tallenna niitä.

Ibe666 [25.02.2007 16:39:21]

#

Tohon pitäs saada vielä että mitä pienempi numero siinä on niin se on ensimmäisenä listassa. Ja sitten nimen lisäys myös.

(mod. poistettu sama koodi kuin ylhäällä)

Ibe666 [25.02.2007 19:55:12]

#

Voisiko joku ystävällisesti auttaa?

tgunner [25.02.2007 20:02:34]

#

Joudut kyllä itse tekemään. Järjestele vaikka ennätyspistemäärät jollain mieleiselläsi järjestelyalgoritmilla suuruusjärjestykseen. Sitten luo jokin tapa yhdistää nimi ennätykseen. Helppoa.

Antti Laaksonen [25.02.2007 20:08:15]

#

Missä muodossa aika tarkkaan ottaen ilmoitetaan? Tämä pitää tietää, jotta vertailun saa menemään oikein.

Ibe666 [25.02.2007 20:11:22]

#

Aika on sekunteja ja kymmenes osia.

Antti Laaksonen [25.02.2007 20:34:06]

#

Tässä on pari kunnollista aliohjelmaa:

Sub TallennaTulos(aika As Long, nimi As String)
    Dim ajat(10) As Long, nimet(10) As String
    Dim i As Integer, j As Integer

    ' luetaan ajat ja nimet
    For i = 0 To 9
        ajat(i) = GetSetting("Klickaus", "highscore", "aika" & i, -1)
        nimet(i) = GetSetting("Klickaus", "highscore", "nimi" & i, "")
    Next

    ' etsitään paikka uudelle tulokselle
    For i = 0 To 9
        ' jos paikka on tyhjä tai aika on suurempi
        If ajat(i) = -1 Or ajat(i) > aika Then
            ' siirretään muita tuloksia alemmas
            For j = 9 To i + 1 Step -1
                ajat(j) = ajat(j - 1)
                nimet(j) = nimet(j - 1)
            Next
            ' lisätään uusi tulos
            ajat(i) = aika
            nimet(i) = nimi
            ' poistutaan silmukasta
            Exit For
        End If
    Next

    ' tallennetaan ajat ja nimet
    For i = 0 To 9
        SaveSetting "Klickaus", "highscore", "aika" & i, ajat(i)
        SaveSetting "Klickaus", "highscore", "nimi" & i, nimet(i)
    Next
End Sub


Sub NaytaLista()
    Dim aika As Long, nimi As String
    Dim i As Integer

    ' luetaan ajat ja nimet
    For i = 0 To 9
        aika = GetSetting("Klickaus", "highscore", "aika" & i, -1)
        nimi = GetSetting("Klickaus", "highscore", "nimi" & i, "")
        ' tyhjä paikka
        If aika = -1 Then
            lAika(i) = "- - -"
            lNimi(i) = "- - -"
        ' todellinen tulos
        Else
            lAika(i) = aika
            lNimi(i) = nimi
        End If
    Next
End Sub

Sub TyhjennaLista()
    Dim i As Integer

    ' tallennetaan tyhjät ajat
    For i = 0 To 9
        SaveSetting "Klickaus", "highscore", "aika" & i, -1
    Next
End Sub

TallennaTulos lisää listalle uuden ennätyksen, NaytaLista näyttää tulokset formilla ja TyhjennaLista tyhjentää listan. Tässä formilla täytyy olla Label-kontrollit lAika(0) - lAika(9) sekä lNimi(0) - lNimi(9), joihin tulokset ilmestyvät. Tuloksissa aika on tallennettu kokonaislukuna sekunnin kymmenesosina, ja sen voi muuttaa sopivaan muotoon näyttöhetkellä. Jos aika on -1, tämä tarkoittaa, että siihen listan kohtaan ei ole vielä tallennettu ennätystä.

Esimerkiksi seuraava koodi lisää listalle Pepen tuloksen 1,2 sekuntia ja näyttää listan.

TallennaTulos 12, "Pepe"
NaytaLista

Ibe666 [26.02.2007 13:50:02]

#

Ei toimi. Virhe on If ajat(i) = -1 Or ajat(i) > aika Then <---tosta valittaa

Antti Laaksonen [27.02.2007 15:22:23]

#

Mitä virheessä lukee? Mitä parametreja olet antanut aliohjelmalle?

Ibe666 [27.02.2007 18:47:28]

#

Run-time error ´13´:
Type mismatch

Antti Laaksonen [04.03.2007 16:48:03]

#

Voisitko lähettää koko ohjelman (kaikki frm- ja vbp-tiedostot) minulle sähköpostilla (antti.laaksonen@mbnet.fi), niin voin yrittää korjata ohjelman?


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta