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 Subpelienkat.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 SubHitsi, 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! :)
Kjyubeisikille on vähän hankalampaa, kun ei ole niitä luokkia.. toi tuommoinen luokka on vasta näpsä.. :)
en pääse testaan mutta varmaan hyvä
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 =)
Aihe on jo aika vanha, joten et voi enää vastata siihen.