Page 1 of 1

Scores (Highscores)

Posted: Sat Mar 26, 2011 8:41 am
by Tarzin
Voici une routine (ma conçue certainement et pas optimisée) pour trier et sauvegarder les 10 meilleurs scores d'un jeu.

Code: Select all

;DeleteFile("scores.bin")

; Gestion des Scores
Dim HS[10], HS1[10]
Dimstr N$[10], N1$[10]

score = 1235462
b$="Gagnant" 

;
; Création du fichier Highscores
;
Function fn_Creation()
	For i=1 To 10 
		HS[i]=20000*(11-i)
		N$[i]=AddStr("Tarzin",i)
	Next
	tablescores = {HS[1], HS[2], HS[3], HS[4], HS[5], HS[6], HS[7], HS[8], HS[9], HS[10], N$[1], N$[2], N$[3], N$[4], N$[5], N$[6], N$[7], N$[8], N$[9], N$[10]}
	OpenFile(1, "scores.bin", #MODE_WRITE)
	WriteTable(1, tablescores)
	CloseFile(1)
EndFunction


;
; Lecture du fichier Highscores
;
Function fn_Lecture()
	OpenFile(1, "scores.bin", #MODE_READ)
	tablescores = ReadTable(1)
	CloseFile(1)
	For Local lect=0 To 9
		HS[lect+1]=tablescores[lect]
		N$[lect+1]=tablescores[lect+10]
	Next
EndFunction


;
; Sauvegarde du fichier Highscores
;
Function fn_Sauvegarde()
	;For Local i=1 To 10 scores={HS[i]} noms={N$[i]} Next	
	;	tablescores = {scores, noms}
	tablescores = {HS[1], HS[2], HS[3], HS[4], HS[5], HS[6], HS[7], HS[8], HS[9], HS[10], N$[1], N$[2], N$[3], N$[4], N$[5], N$[6], N$[7], N$[8], N$[9], N$[10]}
	OpenFile(1, "scores.bin", #MODE_WRITE)
	WriteTable(1, tablescores)
	CloseFile(1)
EndFunction


;
; Tri des Scores
;
Function fn_Tri()
For i=1 To 10
	If score > HS[i] And flag=False
		HS1[i]=score
		N1$[i]=b$
		flag=True
		For c=i To 10
			HS1[c+1]=HS[c]
			N1$[c+1]=N$[c]
		Next
		For x=1 To 10
			HS[x]=HS1[x]
			N$[x]=N1$[x]
		Next

	Else
		HS1[i]=HS[i]
		N1$[i]=N$[i]
	EndIf
Next
flag=False
fn_sauvegarde()
fn_Affichage()
EndFunction


;
; Affichage des Scores
;
Function fn_Affichage()
	For Local a=1 To 10 
		NPrint (a, hs[a], "", n$[a])
	Next
WaitLeftMouse()
End
EndFunction


;
; Test de l'existence du fichier
;
If Exists("scores.bin")<>1
	fn_Creation()
Else
	fn_Lecture()
EndIf


;
; Execution en fonction des cas
;

If score < HS[10] ; Pas de tri/Score inférieur
	fn_Affichage()	
EndIf

If score > HS[10] ; Pas de tri/Score identique
	For Local i=1 To 10
		If score = HS[i]
		fn_affichage()
		EndIf
	Next
fn_Tri() ; Tri a effectuer
EndIf
	
J'aimerai surtout optimiser ça par un truc beaucoup plus propre

Code: Select all

	tablescores = {HS[1], HS[2], HS[3], HS[4], HS[5], HS[6], HS[7], HS[8], HS[9], HS[10], N$[1], N$[2], N$[3], N$[4], N$[5], N$[6], N$[7], N$[8], N$[9], N$[10]}
et ça

Code: Select all

;
; Sauvegarde du fichier Highscores
;
Function fn_Sauvegarde()
	tablescores = {HS[1], HS[2], HS[3], HS[4], HS[5], HS[6], HS[7], HS[8], HS[9], HS[10], N$[1], N$[2], N$[3], N$[4], N$[5], N$[6], N$[7], N$[8], N$[9], N$[10]}
	OpenFile(1, "scores.bin", #MODE_WRITE)
	WriteTable(1, tablescores)
	CloseFile(1)
EndFunction
J'étais parti pour faire un truc du genre:
For Local i=1 To 10 scores={HS} noms={N$} Next
tablescores = {scores, noms}

ou For Local i=1 To 10 scores={HS} noms={N$} Next
tablescores = scores + nom (enfin pas les additionner mais joindre les tables à la suite)

Une idée?

Re: Scores (Highscores)

Posted: Sun Mar 27, 2011 8:53 am
by ArtBlink
Faut que j'imprime ton code pour bien le traduire, mais à la base, ton code est déjà bien foutu ;)

Je vais réfléchir

Re: Scores (Highscores)

Posted: Mon Mar 28, 2011 10:51 am
by Tarzin
mais à la base, ton code est déjà bien foutu
Venant de ta part, je prendrai ça comme un réel compliement!

Pour le reste, c'est perfecible mais je fais comme toi (moins rapdidement), je découvre Hollywood!

C'est le genre de routine qui une fois bien ficelée, peut servir pour de nombreux jeux, pas la peine de réinventer la roue à chaque fois!

Re: Scores (Highscores)

Posted: Mon Mar 28, 2011 2:28 pm
by ArtBlink
C'est clair, il faut garder et stocker toutes nos routines, sa peut nous servir plus tard comme a d'autre ;-)

J'imprime ton code aujourd'hui et je zieute sa se soir pour l'optimisation (si il y a lieu de le faire bien sûr)

Re: Scores (Highscores)

Posted: Mon Mar 28, 2011 8:41 pm
by ArtBlink
Attention, il y a un problème dans ton trie, lorsque ton score est identique à un score du tableau hiscore, alors celui ci n'est pas enregistré...

Re: Scores (Highscores)

Posted: Tue Mar 29, 2011 7:31 am
by Tarzin
Qu'est-ce qui n'est pas enregistré:
- le score identique (ça c'est normal)
- le fichier des scores (ce qui n'est pas normal)

Re: Scores (Highscores)

Posted: Tue Mar 29, 2011 7:53 am
by ArtBlink
Ex:

Table des scores

Premier = 100 000
Second = 90 000
Troisième = 80 000
etc...

Si le score du joueur=90 000, alors le score de joueur ne sera pas enregistrer alors qu'il est plus élevé que celui de troisième.

Hier soir, j'ai regardé ton code avec un bon whisky, j'ai fais un peut de code, j'essai aujourd'hui au bureau.
Je pense que pour le test du score, il faut peut être mettre >= plutot que >

J'essai se matin

Re: Scores (Highscores)

Posted: Mon May 02, 2011 12:50 pm
by Tarzin
Si le score du joueur=90 000, alors le score de joueur ne sera pas enregistrer alors qu'il est plus élevé que celui de troisième.
Parce que je considère:
- qu'il faut faire plus de 90000 pour être dans la table
- parce je ne gère pas les ex aequos

Faudrait ensuite adapter le source pour qu'il soit compatible avec des temps