Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: VB6: PeliEnkat-luokka

Antti Laaksonen [30.11.2002 13:09:14]

#

Ennätyslista on ainakin minusta yksi ikävimmistä asioista pelien tekemisessä. Nyt päätin kerralla tehdä kunnollisen ennätyssysteemin, kun omaankin projektiin sellaista tarvitsin - ja samalla tuli harjoiteltua luokkien käyttöä.

PeliEnkat-luokka sisältää aliohjelmat listan luomiseen, rivien hakemiseen ja lisäämiseen, listan tallentamiseen ja tulostamiseen sekä nollaamiseen. Ennätystiedostoihin lisätään yksilöllisen avaimen kanssa rivien arvoista muodostettu tarkistusnumero, jonka ansiosta esim. heksaeditorilla huijaaminen muuttuu hankalaksi.

Lista sisältää nimen sekä Double-tyyppisen arvon, ja se lajitellaan arvojen mukaan joko suuruus- tai pienuus-järjestykseen. Näin ollen se sopii niin tetriksen kuin autopelinkin tuloslistaksi. Ja ainahan luokkaa voi muokata omiin tarpeisiin sopivaksi, jos tahtoo.

pelienkat.cls - luokan nimeksi on laitettava PeliEnkat

' PeliEnkat
' -------------------------------------------------------------
'
' Tämä Visual Basic -luokka sisältää yksinkertaiset aliohjelmat
' pelin tuloslistan luomiseen, käsittelemiseen ja tallentami-
' seen. Ennätystiedostoihin lisätään tarkistusnumero, jonka
' ansiosta tulosten muokkaaminen vaikkapa heksaeditorilla ei
' kovin helposti onnistu.
'
' Avaa lataa ennätyslistan tiedostosta
'  - tiedosto: tiedosto josta ennätykset ladataan
'  - muokkaus: ilmoitus, joka tulee, jos tiedostoa on muokattu
'          (oletus: "Tiedostoa on muokattu! Ennätykset
'           tyhjennetään.")
'  - nimi: nollattavan listan rivien nimet muokkaustapauksessa
'          (oletus: "(nimetön)")
'  - arvo: nollattavan listan rivien arvot muokkaustapauksessa
'          (oletus: 0)
'
' HaeArvo hakee rivillä olevan arvon
'  - rivi: rivi, jonka arvo haetaan
'
' HaeNimi hakee rivillä olevan nimen
'  - rivi: rivi, jonka nimi haetaan
'
' LaskeTarkiste laskee tiedostoissa käytetyn tarkistusnumeron
'
' Lisaa lisää listalle tuloksen sen arvon mukaiseen kohtaan
'  - nimi: tuloksen pelaajanimi
'  - arvo: tuloksen arvo
'
' Luo alustaa listan
'  - rivit: rivien määrä
'  - avain: salausavain, 9-kirjaiminen merkkijono
'  - suunta: ">" = mitä korkeampi arvo, sen parempi (oletus)
'            "<" = mitä matalampi arvo, sen parempi
'
' Nollaa nollaa listan
'  - nimi: rivien nimet (oletus: "(nimetön)")
'  - arvo: rivien arvot (oletus: 0)
'
' Tallenna tallentaa ennätyslistan tiedostoon
'  - tiedosto: tiedosto, johon ennätykset tallennetaan
'
' -------------------------------------------------------------
' Copyright Antti Laaksonen [antti.laaksonen@mbnet.fi] 2002
' www.ohjelmointiputka.net

Option Explicit

Private Type TENKAT
    nimi As String
    arvo As Double
End Type

Dim lista() As TENKAT
Dim lrivit As Integer, lavain As String, lsuunta As String

Public Sub Avaa(tiedosto As String, Optional muokkaus As String, Optional nimi As String, Optional arvo As String)
    Dim tarkiste As Integer
    Open tiedosto For Binary As #1
    Get #1, , lista
    Get #1, , tarkiste
    Close #1
    If tarkiste <> LaskeTarkiste Then
        If muokkaus = "" Then
            muokkaus = "Tiedostoa on muokattu! Ennätykset tyhjennetään."
        End If
        MsgBox muokkaus
        If nimi = "" Then
            nimi = "(nimetön)"
        End If
        Nollaa "(nimetön)", 0
    End If
End Sub

Public Function HaeArvo(rivi As Integer) As Double
    If rivi >= 1 And rivi <= lrivit Then
        HaeArvo = lista(rivi).arvo
    End If
End Function

Public Function HaeNimi(rivi As Integer) As String
    If rivi >= 1 And rivi <= lrivit Then
        HaeNimi = lista(rivi).nimi
    End If
End Function

Private Function LaskeTarkiste() As Integer
    Dim i As Integer, summa As Integer

    On Error Resume Next
    For i = 1 To lrivit
        summa = summa + Int(lista(i).arvo) * Asc(Mid(lavain, (i Mod 9 + 1))) / 10
        Err = 0
    Next

    LaskeTarkiste = summa
End Function

Public Sub Lisaa(nimi As String, arvo As Double)
    Dim i As Integer, alku As Integer
    For i = 1 To lrivit
        If lsuunta = ">" Then
            If arvo > lista(i).arvo Then
                alku = i
                Exit For
            End If
        ElseIf lsuunta = "<" Then
            If arvo < lista(i).arvo Then
                alku = i
                Exit For
            End If
        End If
    Next

    If alku = 0 Then Exit Sub

    For i = lrivit To alku + 1 Step -1
        lista(i) = lista(i - 1)
    Next

    lista(alku).nimi = nimi
    lista(alku).arvo = arvo
End Sub

Public Sub Luo(rivit As Integer, avain As String, Optional suunta As String)
    If rivit < 1 Then
        rivit = 1
    End If
    ReDim lista(1 To rivit)
    lrivit = rivit

    lavain = Left(avain + "123456789", 9)

    If suunta = "" Then
        suunta = ">"
    End If
    If suunta <> ">" And suunta <> "<" Then
        suunta = ">"
    End If
    lsuunta = suunta
End Sub

Public Sub Nollaa(Optional nimi As String, Optional arvo As Double)
    Dim i As Integer
    If nimi = "" Then nimi = "(nimetön)"
    For i = 1 To lrivit
        lista(i).nimi = nimi
        lista(i).arvo = arvo
    Next
End Sub

Public Sub Tallenna(tiedosto As String)
    Open tiedosto For Binary As #1
    Put #1, , lista
    Put #1, , LaskeTarkiste
    Close #1
End Sub

pelienkat.frm

'Esimerkkiohjelma PeliEnkat-luokan käytöstä

Dim enkat As New PeliEnkat

Private Sub Form_Activate()
    'luodaan 10-rivinen ennätyslista salausavaimella abcdefghij
    enkat.Luo 10, "abcdefghij", ">"

    'nollataan lista
    enkat.Nollaa "(nimetön)", 0

    'lisätään kolme tulosta listalle
    enkat.Lisaa "Antti", 10
    enkat.Lisaa "Pete", 7
    enkat.Lisaa "Sepe", 15

    'tallennetaan, nollataan ja avataan lista
    enkat.Tallenna "c:\testi.enk"
    enkat.Nollaa "(nimetön)", 0
    enkat.Avaa "c:\testi.enk"

    'tulostetaan listan arvot formille
    For i = 1 To 10
        Print enkat.HaeNimi((i)) & " " & enkat.HaeArvo((i))
    Next

    'tuhotaan ennätystiedosto
    Kill "c:\testi.enk"
End Sub

tuobbi-89 [01.12.2002 23:29:52]

#

Hitsi, kun et tehnyt tätä QBasicille! Mutta kai tuon vähän muuntelemalla sillekin saa, tai ainakin perusidean..
Ja ihan hyödyllinen koodihan tuo on! :)

progo [02.12.2002 08:20:37]

#

Kjyubeisikille on vähän hankalampaa, kun ei ole niitä luokkia.. toi tuommoinen luokka on vasta näpsä.. :)

snakari [02.12.2002 20:53:23]

#

en pääse testaan mutta varmaan hyvä

nomic [19.10.2003 12:43:32]

#

juuh mä tykkäsin ja opin itekkin samalla ton tekniikan =)
mukava koodi jonka saa melko vaivattomasti kans liitettyä
omaan ohjelmaan pienten säätöjen jälkeen =)

Vastaus

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

Tietoa sivustosta