Scores (Highscores)

Discussion forum for the French Hollywood community
Post Reply
User avatar
Tarzin
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE
Contact:

Scores (Highscores)

Post by Tarzin » Sat Mar 26, 2011 9:41 am

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?
A500 / A600 / A1200 / SAM440
WinUAE OS3.9 (AmiKit) / OS4.1FE (FlowerPot)
---
https://twitter.com/TarzinCDK

ArtBlink
Posts: 435
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France
Contact:

Re: Scores (Highscores)

Post by ArtBlink » Sun Mar 27, 2011 8:53 am

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

User avatar
Tarzin
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE
Contact:

Re: Scores (Highscores)

Post by Tarzin » Mon Mar 28, 2011 10:51 am

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!
A500 / A600 / A1200 / SAM440
WinUAE OS3.9 (AmiKit) / OS4.1FE (FlowerPot)
---
https://twitter.com/TarzinCDK

ArtBlink
Posts: 435
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France
Contact:

Re: Scores (Highscores)

Post by ArtBlink » Mon Mar 28, 2011 2:28 pm

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)

ArtBlink
Posts: 435
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France
Contact:

Re: Scores (Highscores)

Post by ArtBlink » Mon Mar 28, 2011 8:41 pm

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é...

User avatar
Tarzin
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE
Contact:

Re: Scores (Highscores)

Post by Tarzin » Tue Mar 29, 2011 7:31 am

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)
A500 / A600 / A1200 / SAM440
WinUAE OS3.9 (AmiKit) / OS4.1FE (FlowerPot)
---
https://twitter.com/TarzinCDK

ArtBlink
Posts: 435
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France
Contact:

Re: Scores (Highscores)

Post by ArtBlink » Tue Mar 29, 2011 7:53 am

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

User avatar
Tarzin
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE
Contact:

Re: Scores (Highscores)

Post by Tarzin » Mon May 02, 2011 12:50 pm

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
A500 / A600 / A1200 / SAM440
WinUAE OS3.9 (AmiKit) / OS4.1FE (FlowerPot)
---
https://twitter.com/TarzinCDK

Post Reply