[Petit défit algorithmique] Retrouver le niveau d'une créature

akd Message lu Posté le 02 Juin 2008 à 23:19 Bulle
Avatar de akd
Membre Confirmé

Messages : 319
GCPoints : 75439
Bonjour tout le monde,

en théorie j'ai trouvé une petite soluce pour réussir à le faire, mais vu que les maths commencent à être loin pour moi (surtout à cause du manque de pratique), je préfère vous demander conseil.

L'implémentation des points d'expériences (points de compétences) dans mon projet est la somme des n premiers entiers (avec un coeff multiplicateur de 100).

En gros:
lvl 1 -> lvl 2 : 100 points
lvl 2 -> lvl 3 : 200 points (cumul 300)
lvl 3 -> lvl 4 : 300 points (cumul 600)
...

Seul le nombre total d'Xp est stocké en dur. Il faut donc pour chaque créature au chargement retrouver le niveau associé.

Voilà mon algo

Code :
 int calLevel = (nbPc / 100) *2;  //puisque la somme des n premiers entiers est de la forme n(n+1)/2
 int cpt = 1;
 if (nbPc < 100) return 1;  // pour le premier niveau
 while (cpt * (cpt + 1) < calLevel)  
  {
        cpt++;
   }
   return cpt;


J'aime pas trop ma boucle, j'ai peur que ça prenne beaucoup de temps CPU pour rien au bout d'un certain nombre de niveau; surtout vu que j'utilise ca aussi pour le refresh de niveau sur les personnages joueurs après chaque gain de points de compétences (donc à chaque coup sur la tronche d'un streum).

Donc si vous avez une meilleure idée je suis preneuse.
Dernière édition le 02 Juin 2008 à 23:26
Gulix Message lu Posté le 03 Juin 2008 à 08:56 Bulle
Avatar de Gulix
Membre Confirmé

Messages : 184
GCPoints : 8860
As-tu un niveau maximum de points d'expérience ?
Si oui, ce ne serait pas plus simple d'avoir un tableau statique / global indiquant les différents seuils d'expérience, et de rechercher le niveau dans ce tableau ?

en C#, ça pourrait donner :

Code :
int[] tSeuils = new int[] {0, 100, 300, 600, 1000};

...

int getNiveau(int exp)
{
  int niveau = 0;
  for(int i=0; i < tSeuils.Length; i++)
  {
    if (exp < tSeuils[i])
    {
      niveau = i;
      break;
    }
  }
  return niveau;
}
"Bien souvent, l'école représente votre meilleure chance. Non pas d'apprendre quoi que ce soit, bien sûr, mais de survivre à une attaque de morts-vivants".
Max Brooks - Guide de survie en territoire zombie

Mon Blog, mélange de prog' et de culture
Blind Shark - Pull N' Bounce
akd Message lu Posté le 03 Juin 2008 à 10:01 Bulle
Avatar de akd
Membre Confirmé

Messages : 319
GCPoints : 75439
Héhé, pas de niveau maximal justement, sinon j'aurais utilisé une table d'expérience ^^"
Mod Message lu Posté le 03 Juin 2008 à 10:11 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Ca fait une petite heure que je fouine, et je dois dire que c'est assez ennuyeux à résoudre... On peut traduire le calcul sous forme de suite mathématique :

U(n) = U(n-1) + 100n

Le soucis, c'est que ça n'est ni une suite arithmétique (qui a une raison fixe, 100n est variable), ni une suite géométrique (pas de facteur différent de 1 pour U(n-1)), et du coup ce n'est pas plus une suite arithmético-géométrique. Bref, c'est casse-pieds :want: .

Je cherche encore...

[Edit] Après eux heures de tentatives... Bon je crois que je vais arrêter là pour l'instant :embarassed: .
Dernière édition le 03 Juin 2008 à 10:53
Tersaken Message lu Posté le 03 Juin 2008 à 11:46 Bulle
Avatar de Tersaken
Membre Confirmé

Messages : 302
GCPoints : 23103
Je ne suis pas sur d'avoir bien compris,
en gros, tu veux obtenir le niveau en donnant le nombre d'xp acquérit jusqu'ici ?

La première chose à faire est de diviser ce nombre d'xp par 100 et de ne garder que la partie entière ...

xp = int(xp/100.0) ;

Ensuite, en mathématique la somme des n premiers entiers est égale à (n²+n) / 2où n est justement le niveau nous intéressant ;

en gros, il suffit de trouver n tel que xp = (n²+n)/2
=> n²+n - 2xp = 0

Delta = 1 + 8xp

Donc la solution est ( -1 + [ Delta ] ^0.5 ) / 2 ou ( -1 - [ Delta ] ^0.5 ) / 2

On ne garde que la solution entière et positive ( en gras ) ... à laquelle on rajoute 1

Dans l'exemple du premier post,

le niveau 2 s'obtenait pour xp = 100 ;
xp = 100/100 = 1

n = ( -1 + [ 9 ] ^0.5 ) / 2 +1 = 1+1 = 2

Le niveau 4 s'obtenait comme xp = 600

n = ( -1 + [ 49 ] ^0.5 ) / 2 +1 = 3+1 = 4

Le niveau 4 peut aussi s'obtenir comme 850 ( par exemple)

xp = int(xp /100) = 8

n = ( -1 + 65^0.5 )/2+1 ~ 4.53, on ne s'occupe que de la partie entiere, on obtient encore une fois 4 ( rassurant :smile: )

etc ...

Dernière édition le 03 Juin 2008 à 14:10
Mod Message lu Posté le 03 Juin 2008 à 12:33 Bulle
Avatar de Mod
Webmaster

Messages : 4954
GCPoints : 2100823
Hum, vu l'endroit où je me dirigeait, je ne suis pas mécontent d'avoir arrêté :embarassed:.

J'ai l'impression que tu dois faire un petit peu de maths en cours ^^.
Répondre
GameCorp - Site d'apprentissage et d'entraide à la création de jeux vidéo.
XHTML Valid 1.1 - Page générée en 0.0291 secondes