Scores (Highscores)

Discussion forum for the French Hollywood community

Scores (Highscores)

Postby 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[i]} noms={N$[i]} Next
tablescores = {scores, noms}

ou For Local i=1 To 10 scores={HS[i]} noms={N$[i]} 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
User avatar
Tarzin
 
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE

Re: Scores (Highscores)

Postby 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
ArtBlink
 
Posts: 427
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France

Re: Scores (Highscores)

Postby 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
User avatar
Tarzin
 
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE

Re: Scores (Highscores)

Postby 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: 427
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France

Re: Scores (Highscores)

Postby 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é...
ArtBlink
 
Posts: 427
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France

Re: Scores (Highscores)

Postby 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
User avatar
Tarzin
 
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE

Re: Scores (Highscores)

Postby 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
ArtBlink
 
Posts: 427
Joined: Mon Nov 01, 2010 11:37 am
Location: Albert - France

Re: Scores (Highscores)

Postby 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
User avatar
Tarzin
 
Posts: 68
Joined: Mon Feb 15, 2010 12:46 pm
Location: Dunkerque / FRANCE


Return to French forum

Who is online

Users browsing this forum: No registered users and 0 guests