JeuWeb - Crée ton jeu par navigateur
Centraliser les données - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Centraliser les données (/showthread.php?tid=2009)



Centraliser les données - Zamentur - 13-11-2007

Centralisation et séparation des données


Introduction

L'objectif de ce tutorial est d’éviter l'erreur classique d'insérer des données dans du traitement.
Il montre à l'aide d'un exemple les problèmes engendrées par cette erreur et donne quelques solutions.


Pourquoi centraliser les données?

Un jeu par navigateur représente souvent une quantité de code importante.
Il est souvent nécessaire de faire des mise à jour durant plusieurs années.

Si l'on ne pense pas à centraliser les données du jeu, il arrive un moment ou faire une mise à jour est un risque, car on oublie tous les endroits ou une donnée est inscrite dans le code!

Exemple:
L'exemple est un jeu (fictif) en tour par tour du nom de "war", ce jeu est l'équivalent de millier de ligne de code et de dizaine voir centaine de fichier.
Dans ce jeu, on attribut des caractéristiques aux joueurs qui se renouvelle à chaque tour (un classique)!

On a donc entre autre:
  • un fichier inscription.php, ou l'on enregistre le joueur avec ses caractéristiques
    Code PHP :
    <?php
    //...
    $sql="INSERT INTO `war_perso`
    ( `id` , `nom` , `xp` , `ville` , `arme` , `energie` , `Vision`, `force`, `potion`)
    VALUES ('
    $id', '$nom', '0', '$ville', '', '1', '10', '0.1', '0')";

    //...
    echo 'Votre perso est crée';
    //...
    ?>

  • un fichier nouveau_tour.php ou l'on renouvelle les caractéristiques
    Code PHP :
    <?php
    //...
    $sql="UPDATE `war_perso`
    SET `energie`='1', `vision`='10', `force`='0.1'
    WHERE `id`='
    $id'";

    //...
    $historique='Votre perso perd son bonus de potion éphémère';
    //...
    ?>

  • un fichier potion.php ou l'on augmente les caractéristiques pour un tour lorsque l'on prend une potion
    Code PHP :
    <?php
    //...
    $carac_basique=array(
    'energie' => 1,
    'vision' => 10,
    'force' => 0.1
    );
    $ajout=$carac_basique[$potion_type]*mt_rand(50,100)/100;
    $sql="UPDATE `war_perso`
    SET `
    $potion_type`=`$potion_type`+'$ajout'
    WHERE `id`='
    $id'";

    //...
    echo 'Gloup Gloup';
    //...
    ?>

Tout çà en gardant en tête que nous avons des dizaines ou centaines de script et des milliers de ligne de code
Le problème c'est que si a un moment d'année par exemple 1 an plus tard on se rend compte qu'il faudrait plus de force, il faudra alors reprendre tout les script qui utilise la donnée de force initial et les mettre à jour Ce qui peut prendre beaucoup de temps!
Il est surtout probable d'oublier un des fichiers et donc de générer des incohérences!

De même si vous vous rendez compte que vous avez fais une faute d'orthographe, ou que vous vouliez traduire votre jeu pour ouvrir le jeu à d'autre pays, çà prendra du temps!


La solution: séparer et centraliser les données

Il y a plusieurs méthodes pour le faire ce qui importe c'est d'y penser et de le faire.

Quelques approches:
  • stocker dans des fichiers à part
    Les données peuvent être enregistrées sous différents format (php, xml, javascript, txt etc...).
    Attention toutefois le temps d'accès à une variable ne doit pas être trop long!
    C'est pourquoi dans l'exemple qui suis le format php est retenue, car il est naturellement court!
    Cela dit avec de nombreuse données, il peut être judicieux de les séparer en plusieurs paquet de façon à ne pas charger des donnée inutile au script qui les utilisent!
    De plus il est imaginable de faire une console d'administration qui modifie ces fichiers et ainsi de permettre à des Mjs de pouvoir opérer des réglages sans avoir besoin de demander à un programmeur!

    Voici donc notre exemple, avec des données centralisées:
    • un fichier var_carac_basique.php, ou l'on centralise les réglages concernant les caractéristiques
      Code PHP :
      <?php
      //...
      $cb= array(
      //...
      'energie' =>1,
      'vision' =>10,
      'force' =>0.1,
      'min_potion' =>0.5
      );
      //...
      ?>

    • un fichier fr.php, ou l'on centralise les textes français (Attention il peut être utile de séparer les texte par paquet afin d'éviter de charger des textes qui n'ont rien à faire dans le script!)
      Code PHP :
      <?php
      //...
      $textes= array(
      'perso_creer' =>'Votre perso, %s, est crée!',
      'perte_bonus' =>'Votre perso, %s, perd son bonus de potion éphémère',
      'utilise_potion'=>'Gloup Gloup'
      );
      //...
      ?>

    • un fichier inscription.php, ou l'on enregistre le joueur avec ses caractéristiques
      Code PHP :
      <?php
      //...
      require_once($file_lang);
      require_once(
      'var_carac_basique.php');
      //...
      $energie=$cb['energie'];
      $vision=$cb['vision'];
      $force=$cb['force'];
      $sql="INSERT INTO `war_perso`
      ( `id` , `nom` , `xp` , `ville` , `arme` , `energie` , `Vision`, `force`)
      VALUES ('
      $id', '$nom', '0', '$ville', '', '$energie', '$vision', '$force')";

      //...
      echo sprintf($textes['perso_creer'],$nom);
      //...
      ?>

    • un fichier nouveau_tour.php ou l'on renouvelle les caractéristiques
      Code PHP :
      <?php
      //...
      require_once($file_lang);
      require_once(
      'var_carac_basique.php');
      //...
      $energie=$cb['energie'];
      $vision=$cb['vision'];
      $force=$cb['force'];
      $sql="UPDATE `war_perso`
      SET `energie`='
      $energie', `vision`='$vision', `force`='$force'
      WHERE `id`='
      $id'";

      //...
      echo sprintf($textes['perte_bonus'],$nom);
      //...
      ?>

    • un fichier potion.php ou l'on augmente les caractéristiques pour un tour lorsque l'on prend une potion
      Code PHP :
      <?php
      //...
      require_once($file_lang);
      require_once(
      'var_carac_basique.php');
      //...
      $min_potion=$cb['min_potion'];
      $precision=100;
      $ajout=$cb[$potion_type]*mt_rand(round($min_potion*$precision),$precision)/$precision;
      $sql="UPDATE `war_perso`
      SET `
      $potion_type`=`$potion_type`+'$ajout'
      WHERE `id`='
      $id'";

      //...
      echo sprintf($textes['utilise_potion']);
      //...
      ?>
  • stocker toutes les données dans une table d'une base de donnée
    Une autre solution est de tout mettre dan une table, cela dit attention l'accès aux base de données est assez long!
    En revanche, c'est peut être plus simple à mettre en place.
    Donc il faut bien peser le pour et le contre

  • faire un peu des 2 précédents
    Il peut être judicieux de faire un mélange des 2 effectivement. L'idée c'est d'éviter d'avoir des fichier énorme et donc

    d'utiliser des ressources inutilement. Pour ce faire on met dans la base de donnée les données occasionnelles et dans les

    fichier les donnée très courante
    Il semble judicieux de rassembler le tout avec une fonction ou une classe pour éviter de salir le script de traitement.

  • il y a sûrement d'autre façon
    Oui là je vous ai montré quelques façon que j'ai utilisé maintenant il y a sûrement d'autre approche pour le faire.


Conclusion

Voilà le but de ce tutorial était surtout d'attirer l'attention sur le problème de redondance des données dans les scripts.
J'espère que maintenant vous essayerez de mettre en place quelques choses afin d'éviter cette erreur récurrente!

NB: Le problème est identiques dans les bases de données, il y a d'ailleurs un tutorial à ce sujet.


RE: Centraliser les données - Plume - 14-11-2007

L'aide pour ce tutoriel ce trouve à cette adresse :
http://www.jeuweb.org/board/showthread.php?tid=2805