Higscore

Anfängerfragen zum Programmieren mit PureBasic.
PaulchenPanter24
Beiträge: 8
Registriert: 09.03.2005 14:42

Higscore

Beitrag von PaulchenPanter24 »

also erstmal hi war shon mal hier angemeldet aber is ne weile her!

weis auch net ob higscore richtig geschreibven ist!

wolte nur wisenwie und mit welchen befehlen ich den so progen kanndas der higscor in ner extr datei gespeichert wird das programm die datei aber selbst anlgen kann und auch selbständig nach jeden spiel aktualisirt!

mfg Panter
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

schau mal bei den Preference-Befehlen... ;)

...oder einfach open, writelong, etc.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
PaulchenPanter24
Beiträge: 8
Registriert: 09.03.2005 14:42

Beitrag von PaulchenPanter24 »

wäre es möglich mir ein beispiel zu zeigen so lernt man immer noch am besten :allright:
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

In der Hilfe gibt es ein Beispiel:

Code: Alles auswählen

If CreatePreferences("Preferences.prefs")
  PreferenceGroup("Global")
    WritePreferenceString("ApplicationName", "MP3 Player")
    WritePreferenceString("Version", "1.1b")

  PreferenceComment(" This is the Window dimension")
  PreferenceComment("")

  PreferenceGroup("Window")
    WritePreferenceLong ("WindowX", 123)
    WritePreferenceLong ("WindowY", 124)
    WritePreferenceFloat("WindowZ", -125.5)

  ClosePreferences()
EndIf


OpenPreferences("Preferences.prefs")

  PreferenceGroup("Window")
    Debug ReadPreferenceLong ("WindowX", 0)
    Debug ReadPreferenceLong ("WindowY", 0)
    Debug ReadPreferenceFloat("WindowZ", 0)
    
  PreferenceGroup("Global")
    Debug ReadPreferenceString("ApplicationName", "")
    Debug ReadPreferenceString("Version", "")
    
ClosePreferences()
Bild
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Hier mal ein Beispiel zum Punkte speichern.

Reinschreiben:

Code: Alles auswählen

Dim Famous$(10),scores(10)
if CreatePreferences ("highscores.dat")
for x=1 to 10
PrefenceGroup (str(x))
WritePreferenceString("spieler", famous$(x))
WritePreferenceLong("punkte", fscores$(x))
next x
closepreferences ()
endif 
Auslesen:

Code: Alles auswählen

Dim Famous$(10),scores(10)
if openpreferences ("highscores.dat")
for x=1 to 10
PrefenceGroup (str(x))
famous(x)=ReadPreferenceString("spieler","Leer")
Scores(x)=ReadPreferenceLong("punkte", 0)
next x
closepreferences ()
endif 
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

PaulchenPanter24 hat geschrieben:wäre es möglich mir ein beispiel zu zeigen so lernt man immer noch am besten :allright:
entspricht nicht unbedingt meiner erfahrung...

ich erklär dir einfach mal die herangehensweise.

du überlegst dir, wie du die highscore abspeichern willst.

wenn du nur eine einzige zahl speichern willst,
dann bewahrst du sie zur laufzeit in einer variable auf, die aktualisiert wird,
wenn der player eine höhere score erreicht.

wenn jetzt die highscore aktualisiert wird, dann speicherst du sie auch:

Code: Alles auswählen

If Score > Highscore
    Highscore = Score
    CreateFile(1,"HScore.dat")
    WriteLong(Highscore)
    CloseFile(1)
EndIf
am anfang des programms musst du die gespeicherte Score natürlich erst einlesen:

Code: Alles auswählen

If ReadFile(1,"HScore.dat")
    Highscore = ReadLong()
    CloseFile(1)
EndIf
dabei bleibt Highscore auf Null, wenn die Datei noch nicht existiert.
die Dateinamenerweiterung ".dat" ist völlig willkürlich, du kannst nehmen was du willst.

wenn du den namen der spielers dazuspeichern willst, musst du eben auch noch einen string dabei haben.

und wenn du einen Highscore-Table verarbeiten willst, musst du halt Arrays benutzen.

ob du dann zwei Arrays, eins Strings, eins Longs verwendest,
oder ob du dafür eine Structure erzeugst, bleibt dir überlassen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
PaulchenPanter24
Beiträge: 8
Registriert: 09.03.2005 14:42

Beitrag von PaulchenPanter24 »

vielen dank für die hielfe ich werde noch was anderes progen und dan mach ich den higsor für das spiel !vielen dank!
Benutzeravatar
Dostej
Beiträge: 529
Registriert: 01.10.2004 10:02
Kontaktdaten:

Beitrag von Dostej »

Hi

Ich habe für mein Spiel mal nen Highscore geproggt. Ist (als Faulheitsgründen mit gadgets realisiert.)

Immerhin (Boahh Eyy) ist die Datei dann (primitiv) verschlüsselt.

Braucht die RC4-Lib zum compilen.

Code: Alles auswählen

; HighScoreList
#PO_HighScore_ListItems = 15 :;anz Einträge highscorelist
#PO_HighScore_MaxChar = 15 ;# char pro name in highscoreliste
#FileTemp = 1

; Filename für HighscoreList
Global HighScore_FileName.s
HighScore_FileName = "scorelist.po" ;Filename für highscoreliste
;Structure für Highscoredaten
Structure hsc
  Name.s
  pts.l
EndStructure
Dim HighScore.hsc(#PO_HighScore_ListItems)


Procedure Show_Highscore(Player_nr.l)
  ; zeigt den Higscore-Screen. Wenn Wertung = 1, dann können sich der / die Spieler eintragen, wenn die Punkte ausreichend sind.
  Entry.l = 0 ; definiert den Platz, den der Spieler gemacht hat (so er das hat ...)
  AppName.s = "Manager"
  If OpenWindow(#WND_HighScore, 0, 0, 1024, 768,  #PB_Window_BorderLess , "HighScore")
    If CreateGadgetList(WindowID()) 
      Dim HighScore.hsc(#PO_HighScore_ListItems + 1)
      ;Debug "pfad: " + Ownpath + HighScore_FileName
      RC4_DecryptBinaryFile(Ownpath + HighScore_FileName, Ownpath + "tmp.txt", AppName) ; decodiere die Liste
      DeleteFile(Ownpath + HighScore_FileName) ; das Original löschen
      If ReadFile(#FileTemp, Ownpath + "tmp.txt") 
        ; ; lese die Daten in das Array ein
        For x = 1 To #PO_HighScore_ListItems
          HighScore(x)\Name = ReadString()
          HighScore(x)\pts = ReadLong()
          ; Debug "data file" + Str(x) + " - " + HighScore(x)\Name+ Str(HighScore(x)\pts)
        Next 
        CloseFile(#FileTemp)
        DeleteFile(Ownpath + "tmp.txt") ; das temp-file löschen
      Else
        Restore HighScoreInit
        For x = 1 To #PO_HighScore_ListItems
          Read HighScore(x)\Name
          Read HighScore(x)\pts
          ; Debug "data read" + Str(x) + " - " + HighScore(x)\Name+ Str(HighScore(x)\pts)
        Next 
      EndIf
      
      For x = 1 To #PO_HighScore_ListItems ; die entsprechende Anzahl Gadgets estellen
        StringGadget(7000 + x, 412, 200 + x * 25, 200, 18, HighScore(x)\Name) 
        TextGadget(7100 + x, 650, 200 + x * 25, 50, 18, Str(HighScore(x)\pts))
        DisableGadget(7000 + x, 1) ; alle String-gadgets abschalten
      Next
      ButtonGadget(#MNG_Start_OK, 940, 735, 74, 23, "OK")
      
      If Player_nr > 0
        ; checken ob Spieler auf die Liste kommt
        Debug "player(Player_nr)\Siegpunkte " + Str(x) + ": " + Str(Player(Player_nr)\Siegpunkte)
        If Player(Player_nr)\Siegpunkte > HighScore(#PO_HighScore_ListItems)\pts ; wenn mehr als der niedrigste ...
          For y = 1 To #PO_HighScore_ListItems ; wo kommt der spieler rein?
            If Player(Player_nr)\Siegpunkte > HighScore(y)\pts
              Entry = y
              DisableGadget(7000 + Entry, 0) ; gadget anschalten
              Debug "entry: " + Str(Entry)
              Break
            EndIf
          Next
        EndIf
        
        If Entry > 0 And Entry <= #PO_HighScore_ListItems ; braucht es diese Abfrage überhaupt
          ; liste an dieser Stelle 1 nach unten rutschen
          For y = #PO_HighScore_ListItems - 1 To Entry
            HighScore(y+1)\Name = HighScore(y)\Name
            HighScore(y+1)\pts = HighScore(y)\pts
          Next
          
          HighScore(Entry)\Name = Player(Player_nr)\Name
          HighScore(Entry)\pts = Player(Player_nr)\Siegpunkte
          
          ; die daten neu setzen
          For x = 1 To #PO_HighScore_ListItems 
            SetGadgetText(7000 + x, HighScore(x)\Name) 
            SetGadgetText(7100 + x, Str(HighScore(x)\pts))
          Next 
        EndIf
      EndIf
      
      Repeat 
        Event = WaitWindowEvent() 
        If Event = #PB_EventGadget 
          GadgetID = EventGadgetID() 
          If GadgetID = #MNG_Start_OK
            Event = #PB_EventCloseWindow
          EndIf
        EndIf
      Until Event = #PB_EventCloseWindow
      ; den evtl. geänderten Datesatz zurückschreiben
      If Entry > 0
        HighScore(Entry)\Name = GetGadgetText(7000 + Entry)
      EndIf
      CloseWindow(#WND_HighScore) 
      Event = 0 ; nur dieses Fenster
      
      ; die Daten zurückschreiben
      If Player_nr And Entry 
        ; speichere die Liste 
        If CreateFile(#FileTemp, Ownpath + HighScore_FileName)
          If CreateFile(#FileTemp, Ownpath + "tmp.txt") 
            ; speichere die Daten 
            For x = 1 To #PO_HighScore_ListItems
              WriteStringN(HighScore(x)\Name)
              WriteLong(HighScore(x)\pts)
            Next 
          EndIf
          CloseFile(#FileTemp)
          
          ; datei codieren
          If RC4_CryptBinaryFile(Ownpath + "tmp.txt", Ownpath + HighScore_FileName, AppName)
            ; Datei verstecken
            SetFileAttributes_(Ownpath + HighScore_FileName, #FILE_ATTRIBUTE_HIDDEN) 
          EndIf 
          DeleteFile(Ownpath + "tmp.txt") ; das temp-file löschen
        EndIf
      EndIf
    EndIf
  EndIf
EndProcedure
Es fehlen vermutlich ein paar Konstanten (für die Gadgets, aber die kannst Du dir ja selbst zusammensuchen. Ansonsten sollte alles drin sein.

Vielleicht hilft es Dir ja etwas...
Antworten