Name und Punkte an Bestenliste senden [gelöst]

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

mabox

Betreff: Name und Punkte an Bestenliste senden [gelöst]

BeitragSa, Nov 10, 2007 0:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ich verwende hier einen Code für eine Bestenliste (nicht von mir).
Der Code funktioniert super und ich verstehe ihn auch fast komplett aber ich bekomms nicht hin den Namen und die Punkte die mein Spiel Liefert wenn es zuende ist in die Highscoe zu integrieren.

Hier ist der Code: [AUSKLAPPEN]
; Highscorelisten Creator
; Erzeugt und sortiert Highscorelisten
; Copyright (C) Jan 2004, Daniel Nobis

Graphics 640,480,16,2
AppTitle "Highscore"

SeedRnd MilliSecs()

Dim Score(10)
Dim Name$(10)


lesen
sortieren
speichern
ausgeben
WaitKey()



Function speichern()
Datei = WriteFile("score.sav")
For i = 1 To 10
 WriteLine Datei, Name$(i)
 WriteLine Datei, Score(i)
Next
End Function
CloseFile Datei

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function lesen()
Datei = ReadFile("score.sav")
For i = 1 To 10
 Name$(i) = ReadLine(Datei)
 Score(i) = ReadLine(Datei)
Next
CloseFile Datei
End Function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function sortieren()
For I = 1 To 10
 For J = I To 10
  If Score(I) < Score(J) Then ; "<" = größter zuerst / ">" = kleinster zuerst
  X = Score(I) : Score(I) = Score(J) : Score(J) = X
  xx$ = Name$(i) : Name$(i) = Name$(j): Name$(j) = xx$
  EndIf
 Next
Next
End Function
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Function ausgeben()
      Print "Beschdenlischde"
      Print
   For i = 1 To 10
       Print i + ". ist " + Name$(i) + " mit " + Score(i) + " Punkten"
   Next
End Function


Ich denke man müsste den Name und die Punkte irgendwie zwischen die Fuktion "lesen" und die Funktion "sortieren" setzten. Bis jetzt sind meine Versuche gescheitert. Kann mir jemand helfen?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage
  • Zuletzt bearbeitet von mabox am So, Nov 18, 2007 10:58, insgesamt 3-mal bearbeitet
 

HyDr0x

BeitragSa, Nov 10, 2007 1:08
Antworten mit Zitat
Benutzer-Profile anzeigen
sry Hab grad net den Nerv mir das anzuguggen aber das geht auch entschieden einfacher.
Ich poste dir mal den Code den ich für die Liste in meinen (leider noch net veröffentlichten) Spaceshooter verwende.

Code: [AUSKLAPPEN]


Dim high(10)

readhigh()

highscorehinz()

readhigh()

Repeat
Cls


abspann()

flip
forever

Function highscorehinz()

hstream = OpenFile("Highscore.dat")

For stt = 1 To 10
If high(stt-hn) < score And ev = 0 Then
WriteInt hstream, score*55
ev = 1
hn = hn + 1
Else
WriteInt hstream, high(stt-hn)*55
EndIf

Next

CloseFile(hstream)

End Function


Function readhigh()

hstream2 = ReadFile("Highscore.dat")

For stt = 1 To 10
high(stt) = ReadInt(hstream2)/55
Next

CloseFile(hstream2)

End Function

Function abspann()
Text 100,tx, "GESAMTLISTE:"
Text 100,tx, "1. "+high(1)
Text 100,tx, "2. "+high(2)
Text 100,tx, "3. "+high(3)
Text 100,tx, "4. "+high(4)
Text 100,tx, "5. "+high(5)
Text 100,tx, "6. "+high(6)
Text 100,tx, "7. "+high(7)
Text 100,tx, "8. "+high(8)
Text 100,tx, "9. "+high(9)
Text 100,tx, "10. "+high(10)

tx = tx - 1

end function




So ähnlich sieht das dann aus, meiner Meinung nach einfacher weil ich die sortieren Funktion irgendwie sinnlos finde ...

StepTiger

BeitragSa, Nov 10, 2007 1:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Und DAS ist jetzt einfacher? oO
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

HyDr0x

BeitragSa, Nov 10, 2007 1:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja du sparst halt das sortieren, das anfügen von Namen sollte ja kein Problem sein und Diese relativ lange ausgabe der Score im Abspann hängt damit zusammen wie ich da in meinem Spiel verwendet habe das kann man ja noch verändern/kürzen .

StepTiger

BeitragSa, Nov 10, 2007 1:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@mabox:
Das, was du da hast, ist an sich schon ein vollendeter Code, mehr nicht. Was verlangst du noch? ^^

"aber ich bekomms nicht hin den Namen und die Punkte die mein Spiel Liefert wenn es zuende ist in die Highscoe zu integrieren."
Ehm... Speichern?

Ich muss aber sagen, dass der Code an sich nicht sehr sinnvoll ist. Er sortiert die jeweiligen zehn. Aber bei einer neuen score müsste das programm extra nochmals sortieren und die datei umschreiben. Warum nicht einfach direkt über Objekte mit Insert before machen?
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

HyDr0x

BeitragSa, Nov 10, 2007 1:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit Types arbeiten ist nicht notwendig siehe meinen Vorschlag. Der kommt mit einem Dim feld aus, dann noch eins für den Namen fertig.

ToeB

Betreff: Highscore Functionen

BeitragSa, Nov 10, 2007 12:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab vor langer Zeit auch mal eine Highscore gebastelt :

Drei functionen :
Zitat:
1.: SortHighscore(Score,nam$)
2.: SaveHighscore(Pfad$) und
3.: ReadHighscore(Pfad$).


Code: [AUSKLAPPEN]
Dim hs(10)
Dim name$(10)

Function SortHighscore(Score,nam$)
hs(10) = Score
For i = 1 To 10
For j = 1 To 10
If hs(i) > hs(j) Then
temp = hs(i)
hs(i) = hs(j)
hs(j) = temp
temp_$ = name(i)
name(i) = name(j)
name(j) = temp_$
EndIf
Next
Next
For i = 1 To 10
If hs(i) = Score Then name$(i) = nam$:Exit
Next
If name$(10) = nam$ Then name$(10) = ""
End Function

Function ReadHighscore(Pfad$)
dat = ReadFile(Pfad$)
For i = 1 To 10
hs(i) = (ReadInt(dat)+33)/55
name$(i) = ReadString(dat)
Next
CloseFile dat
End Function

Function SaveHighScore(Pfad$)
dat = WriteFile(Pfad$)
For i = 1 To 10
WriteInt(dat,hs(i)*55-33)
WriteString(dat,name$(i))
Next
CloseFile dat
End Function


Bei Sorthighscore() muss man die Score angeben und den Namen, der an die Stelle geschrieben werden soll. Bei SaveHighscore() muss man den Pfad angegeben, wo das hingeschrieben werden soll, und bei ReadHighscore() muss man auch den Pfad angeben, woraus die Highscore geladen werden soll....

Tipp : die Highscore wird zwar als "Interger" (WriteInt) angespeichert, ich rechne aber noch damit : erst mal 55 und dann 33 wieder ab. also ist eine änderung proktisch ausgeschlossen, wenn das doch jemand wagen sollte, es zu ändern, kann man mit einer Überprüfung ganz einfach gucken, ob das ergebniss "galtt" ist also ohne nachkomma stellen. Also so wie dieser (natürlich deht das nur wenn hs(10) auf Float dimmesioniert wurde)Code: [AUSKLAPPEN]
For i = 1 to 10
If  Floor(hs(i)) <> hs(i) then Fehler("Highscore wurde Geändert !!")
Next

So in etwa. Er prüft erst ob das abgerundete ungleich ist mit dem gleichen wert und dann den Fehler aufzurufen. Um das zu verseutlichen :
Zitat:
hs(1) = 1:hs(2) = 1.2

bei dem beispiel oben würde mit den Werten so aussehen : Code: [AUSKLAPPEN]
If 1 <> 1 then Felere("balbla")
Da aber nichts unterschiedlich ist, wird kein Fehler ausgegeben. Der gleiche mit hs(2) : Code: [AUSKLAPPEN]
If 1 <> 1.2 then Fehler("Blabla")
Jetzt ist aber 1 ungleich mit 1.2 deshalb Fehler Very Happy

Ich hoffe ich konnte dir helfen...

mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

mabox

BeitragSa, Nov 10, 2007 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann mir nicht einfach jemand sagen wie ich die Punkte und den Namen in die Bestenliste die ich gepostet hab reinbekommt???
Auch wenn ich zweimal sortieren muss...

~Edit: @crack93 wenn ich deine Highscore starte kommt da immer "Array index out of bounds" und diese Zeile
Code: [AUSKLAPPEN]
name$(i) = ReadString(dat) 
ist markiert.

ToeB

BeitragSo, Nov 11, 2007 12:37
Antworten mit Zitat
Benutzer-Profile anzeigen
dann hasst du entweder das Array falsch "gedimmt" oder die Schleifen lauf zahl vergrößßert .... Shocked


mfg Crack93
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

mabox

BeitragMo, Nov 12, 2007 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
@Crack93 irgendwie funktioniert das mit dem Testen ob die Datei geändert wurde bei mir nicht ganz. Hier ist mein aktueller Code: [AUSKLAPPEN]
Dim hs(10)
Dim name$(10)


ReadHighscore("score.sav")
SortHighscore(100,"genie")
SaveHighScore("score.sav")

Function SortHighscore(Score,nam$)
   hs(10) = Score
   For i = 1 To 10
      For j = 1 To 10
         If hs(i) > hs(j) Then
            temp = hs(i)
            hs(i) = hs(j)
            hs(j) = temp
            temp_$ = name(i)
            name(i) = name(j)
            name(j) = temp_$
         EndIf
      Next
   Next
   For i = 1 To 10
      If hs(i) = Score Then name$(i) = nam$:Exit
   Next
   If name$(10) = nam$ Then name$(10) = ""
End Function

Function ReadHighscore(Pfad$)
   dat = ReadFile(Pfad$)
   For i = 1 To 10
      hs(i) = (ReadInt(dat)+33)/55
      name$(i) = ReadString(dat)
   Next
   
   For i = 1 To 10
      If  Floor(hs(i)) <> hs(i) Then Print ("Highscore wurde Geändert !!")
   Next
   
   CloseFile dat
End Function

Function SaveHighScore(Pfad$)
   dat = WriteFile(Pfad$)
   For i = 1 To 10
      WriteInt(dat,hs(i)*55-33)
      WriteString(dat,name$(i))
   Next
   CloseFile dat
End Function

Sehr seltsam ist auch, dass wenn ich in der Datei etwas verändere bleibt mein PC hängen und die Datei ist nachher so um die 500MB groß


Den anderen Fehler hab ich gefunden. In der Datei die ich auslesen wollte stand schon etwas drin das nicht mit writeint und writestring gespeichert wurde. Deshalb konnte es nicht gelesen werden.

Aber meine eigentliche Frage wurde immernoch nicht beantwortet.

Tankbuster

BeitragDi, Nov 13, 2007 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Sehr seltsam ist auch, dass wenn ich in der Datei etwas verändere bleibt mein PC hängen und die Datei ist nachher so um die 500MB groß


Dann läuft wohl die ganze Zeit ne schleife durch, die die ganze Zeit was in die Datei schreibt. Das ist kein wunder, dass dein PC abstürzt Very Happy
Twitter
Download Jewel Snake!
Windows|Android

mabox

BeitragDi, Nov 13, 2007 16:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist mir schon klar aber warum speichert die Schleife das so oft?
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Tankbuster

BeitragDi, Nov 13, 2007 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich weiß nicht. Ich hab ja nicht deinen Code Wink
Twitter
Download Jewel Snake!
Windows|Android

mabox

BeitragDi, Nov 13, 2007 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
mabox hat Folgendes geschrieben:
@Crack93 irgendwie funktioniert das mit dem Testen ob die Datei geändert wurde bei mir nicht ganz. Hier ist mein aktueller Code: [AUSKLAPPEN]
Dim hs(10)
Dim name$(10)


ReadHighscore("score.sav")
SortHighscore(100,"genie")
SaveHighScore("score.sav")

Function SortHighscore(Score,nam$)
   hs(10) = Score
   For i = 1 To 10
      For j = 1 To 10
         If hs(i) > hs(j) Then
            temp = hs(i)
            hs(i) = hs(j)
            hs(j) = temp
            temp_$ = name(i)
            name(i) = name(j)
            name(j) = temp_$
         EndIf
      Next
   Next
   For i = 1 To 10
      If hs(i) = Score Then name$(i) = nam$:Exit
   Next
   If name$(10) = nam$ Then name$(10) = ""
End Function

Function ReadHighscore(Pfad$)
   dat = ReadFile(Pfad$)
   For i = 1 To 10
      hs(i) = (ReadInt(dat)+33)/55
      name$(i) = ReadString(dat)
   Next
   
   For i = 1 To 10
      If  Floor(hs(i)) <> hs(i) Then Print ("Highscore wurde Geändert !!")
   Next
   
   CloseFile dat
End Function

Function SaveHighScore(Pfad$)
   dat = WriteFile(Pfad$)
   For i = 1 To 10
      WriteInt(dat,hs(i)*55-33)
      WriteString(dat,name$(i))
   Next
   CloseFile dat
End Function

Sehr seltsam ist auch, dass wenn ich in der Datei etwas verändere bleibt mein PC hängen und die Datei ist nachher so um die 500MB groß


Den anderen Fehler hab ich gefunden. In der Datei die ich auslesen wollte stand schon etwas drin das nicht mit writeint und writestring gespeichert wurde. Deshalb konnte es nicht gelesen werden.

Aber meine eigentliche Frage wurde immernoch nicht beantwortet.


da steht er doch...
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Tankbuster

BeitragDi, Nov 13, 2007 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Fehler steckt in "ReadHighscore(Pfad$)"
In der Zeile "name$(i) = ReadString(dat)" hängt der PC sich bei mir auf, wenn ich etwas in der Highscore verändere Wink
Aber 500MB groß kann die Datei nur werden, wenn DU was reinschreibst. Also hast du irgendwas falsch gemacht. Oder du meinst die Auslagerungs-Datei Very Happy Die könnte bei sowas schonmal größer werden Razz
Frag mich nicht, woran das liegt. Da bin ich überfragt. Vielleicht versucht der PC einen String auszulesen, aber findet keinen.
Twitter
Download Jewel Snake!
Windows|Android

mabox

BeitragDo, Nov 15, 2007 15:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok das lass ich jetzt mal so sein wie es ist (bekomms nicht hin, man muss ja in der Bestenliste nichts verändern. Wers tut ist selbst schuld wenns danach nicht mehr geht.)

NEUE FRAGE: Ich hab die Bestenliste jetzt so geändert, dass der Name über der Zahl steht (vorher war es andersrum). Aber mit der Sortierfunktion klappt das nicht. Siehe Bilder. Da ich nicht verstehe was in dieser Funktion geschieht (Die Befehle kenne ich aber die Logik ist mir zu kompliziert) bitte ich euch nochmal um Hilfe!

user posted image unsortiert-----------sortiert user posted image

hier noch der Coder der Sortierfunktion Code: [AUSKLAPPEN]
Function Highscore_sortieren(Score,nam$)
   hs(10) = Score
   For i = 1 To 10
      For j = 1 To 10
         If hs(i) > hs(j) Then
            temp = hs(i)
            hs(i) = hs(j)
            hs(j) = temp
            temp_$ = name(i)
            name(i) = name(j)
            name(j) = temp_$
         EndIf
      Next
   Next
   For i = 1 To 10
      If hs(i) = Score Then name$(i) = nam$:Exit
   Next
   If name$(10) = nam$ Then name$(10) = ""
End Function
Fujitsu-Siemens Laptop, 2Ghz Intel Core2Duo Prozessor, 2GB Ram, 120GB Festplatte, ATI Mobility Radeon X1400, Windows Vista Ultimate
www.mausoft.de.tl
Dönerfresser Homepage

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group