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
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! :)
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.