JeuWeb - Crée ton jeu par navigateur

Version complète : Centraliser les données
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
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:

  • 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.
    L'aide pour ce tutoriel ce trouve à cette adresse :
    http://www.jeuweb.org/board/showthread.php?tid=2805