ETERNITY II WIZARD STRUCTURE DE DONNÉES ET ALGORITHMIQUE - BOUAZIZ AXEL NOUAILLAT FABIEN THEBAULT YANN - Free
←
→
Transcription du contenu de la page
Si votre navigateur ne rend pas la page correctement, lisez s'il vous plaît le contenu de la page ci-dessous
Techniques de Programmation en Langage C Projet 3 - Automates Cellulaires STRUCTURE DE DONNÉES ET ALGORITHMIQUE ETERNITY II WIZARD BOUAZIZ AXEL NOUAILLAT FABIEN THEBAULT YANN / 20 L2 - GROUPE B
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Sommaire Préambule 5 Introduction 6 Présentation générale du jeu I/ UN PROJET QUI NÉCESSITE UNE GESTION OPTIMALE 7 1.1. Aborder le sujet de façon mathématique 7 1.2. Choix des logiciels et langages 7 1.3. Elaboration du MCD (Modèle Conceptuel de Données) 8 1.4. Gestion du temps de travail 9 II/ PRÉSENTATION GÉNÉRALE DU JEU 10 2.1. Les pièces du jeu 10 2.2. Le plateau de jeu 10 2.3. Les fonctionnalités 11 2.3.1. Faire tourner une pièce (rotation) 11 2.3.2. Sauvegarder le jeu en cours 12 2.3.3. Charger une partie existante 12 2.3.4. Quitter la partie 13 III/ PROGRAMMATION DU SITE 14 3.1. Modélisation de notre BDD (Base De Données) 14 3.2. Organisation et architecture des pages 14 3.3. Développement objet et optimisation 15 3.4. Gestion de la sauvegarde 17 3.5. Fonction qui permet de créer un joueur 17 3.6. La gestion de l'affichage du jeu 18 3.7. Fonction permettant la recherche d'une pièce à partir des pièces proches 19 Conclusion 20 3 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Préambule Nous voici arrivés au premier semestre de SDD après une première année très riche en programmation (en langage C). Nous entrons à présent plus dans le coté fonctionnel et "performances" de la programmation, tel que nous le verrons dans ce projet traitant de la réalisation d'un très célèbre jeu, Eternity II. Au cours de ce projet, nous avons eu recours aux structures, fonctions...et bien d'autres outils de programmation. Nous avons cherché à apporter plus de stabilité à notre code et à le soutenir par plus de connaissances. Nous espérons que ce projet et que sa réalisation vous plaira... Bonne lecture 5 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Introduction Le jeu Eternity II a été lancé le 28 juillet 2007. L'éditeur et réalisateur du jeu promet alors la somme de 2 millions de dollars au premier qui réussira à la résoudre. Introduisons rapidement le jeu auquel nous allons être confrontés tout au long du projet. Nous sommes face à un plateau carré de 16 cases par 16 cases, donc un total de 256 cases, devant toutes être pleines pour espérer réussir une des 20 000 combinaisons possibles menant au succès. Pour cela, nous avons 256 pièces à placer, toutes étant différentes les unes des autres et comprenant chacune 4 motifs. Chaque pièce est disposable de 4 manières différentes, on a par exemple : Pour que les placements soient valides, il est nécessaire que les motifs de deux cases soient les mêmes, comme par exemple : On notera un autre point, tel que vu dans le premier DE de SDD de cette année, il y a trois types de pièces, les coins, les bords mais aussi les pièces centrales : Pour bien commencer à résoudre ce projet, nous avons commencé à faire des raisonnements "simples" sur des petits tableaux (3 par 3, 4 par 4...etc) pour ensuite en arriver au 16 par 16 qui sera la pièce maîtresse de notre rendu de projet. 6 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD I/ ETUDE PRÉALABLE La première grande partie de ce rapport est constituée de tous les détails concernant l'élaboration du projet, autrement dit une étude préalable. Celui-ci a été très compliqué à mettre en place, principalement à cause du grand nombre de fonctionnalités à gérer. Nous avons été confrontés tout au long du projet à des problèmes récurrents, comme la réponse aux contraintes fixées par le sujet du projet. Détaillons dans les sous parties suivantes notre façon d'aborder les problèmes qui nous ont été posés. 1.1. Aborder le sujet de façon mathématique Avant de nous lancer dans de longues discussions et explication de fonctions, abordons brièvement le problème auquel nous sommes confrontés. Chaque pièce a 4 façons d'être placée, donc on a 4 × 256 possibilités pour placer la première pièce que nous allons sélectionner. La deuxième pièce aura donc 4 × (256 − 1) = 4 × 255 manières d'être placée, et cela ainsi de suite pour chacune des 256 pièces du jeu. On a donc une idée précise du nombre de tableaux possibles, ne respectant pas tous les conditions du jeu. On chiffre ces plateaux à 4256 × 256! , ce qui correspond à environ 1,1 × 10662 plateaux possibles ! Autrement dit, nous aurions plus de chances de gagner à l'Euromillions que de réussir à trouver une des 20 000 combinaisons possibles gagnantes si l'on jouait totalement au hasard ! On voit dès à présent la réelle complexité du problème auquel nous allons devoir faire face. 1.2. Choix des logiciels et langage Pour notre projet, nous avons eu recours à la technologie Web, autrement dit nous nous sommes attardés sur les langages XHTML, CSS,PHP et Javascript. Chacun de ces langages a une utilité spécifique dans la construction du projet. Le langage XHTML est celui avec lequel nous avons tapé le contenu de notre site Web. Il contient des informations logiques. Par exemple, il y est inscrit que telle partie est le titre, telle autre est le menu… Le code en CSS nous sert uniquement à présenter la page Web. Grâce à ce langage, nous allons pouvoir créer rapidement et simplement la mise en page de notre site. 7 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Le langage PHP gère en fait l’intelligence du site (le site est donc dynamique). Le langage permet un grand nombre de possibilités, comme par exemple, charger les pièces de jeu, permettre d’effectuer des actions simples, telles les chargements de jeu préalablement sauvegardés. Le langage Javascript est un langage événementiel. Il permet, comme son nom de l’indique de gérer les événements. On s’en sert pour retranscrire la gestion des mouvements du jeu, le déplacement des pièces, la rotation et encore d’autres fonctions. Pour coder dans tous ces langages, nous avons utilisé deux logiciels, Zend Studio et DB Designer. Le premier sert à écrire le code en lui-même tandis que le second permet de gérer la base de données qui contient les différentes tables gérant le jeu. 1.3. Elaboration du MCD (Modèle Conceptuel de Données) Dans le but de représenter nos données, nous avons conçu un schéma relationnel (aussi connu sous l’appellation : « modèle conceptuel de données »). Par soucis d’évolution et d’optimisation, nous avons choisi de décomposer tout le diagramme en de nombreuses tables, qui faciliteront toute tentative d’ajout ou de suppression de fonctionnalités. Cette organisation a favorisé les jointures qui seront, une fois placées dans les classes, utilisées automatiquement par PHP, et a permis de séparer chaque élément pour lui donner une certaine autonomie. Ce schéma sera repris pour créer la base de données du jeu en MySQL. 8 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD 1.4. Gestion du temps de travail Afin d’optimiser la création du jeu en fonction de la deadline, nous avons mis en place, un planning de travail grâce à la méthode P.E.R.T. Le P.E.R.T. est une méthode consistant à mettre en ordre sous forme de réseau plusieurs tâches qui grâce à leur dépendance et à leur chronologie concourent toutes à l’obtention d’un produit fini. Le chemin en rouge correspond au chemin critique de notre projet. 9 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD II/ PRÉSENTATION GÉNÉRALE DU JEU Cette seconde partie vise à vous présenter le jeu dans sa généralité, sans aborder pour autant ce qui concerne le code. Les explications concernant la programmation en elle même seront traitées dans la prochaine partie. 2.1. Les pièces du jeu Afin de permettre une jouabilité optimale, et pour que notre projet réfère le plus possible au jeu de départ Eternity II, nous avons décidé d'utiliser la palette de pièces réelles, utilisant les motifs du "vrai" jeu Eternity II. Pour ce faire, nous avons eu recours au logiciel de graphisme Photoshop, que l'on ne présente plus, qui nous a permis de décomposer les motifs un à un, puis de former les 256 cases nécessaires (une à une) reprenant les numéros des motifs. Ci dessous, un petit panaché de pièces parmi celles réalisées : Pourquoi avoir choisi de dessiner les 256 pièces au lieu de créer un algorithme permettant de générer les pièces d'un plateau de n par m ? Vous vous posez sûrement la question ! Nous avons avant tout cherché à préserver l'"authenticité" du jeu officiel et c'est pour cette raison que nous avons eu recours à tout ce qui concerne le jeu officiel, que ce soit au niveau des pièces, du plateau de 16 par 16, et des règles du jeu. Passons à présent à notre plateau de jeu, qui s'affiche sur une page Web et qui reprend tous les points décris précédemment. 2.2. Le plateau de jeu Le plateau de jeu est représenté ci-dessous (capture d'écran de la page Web). Nous avons deux plateaux, un premier qui contient toutes les pièces du jeu que l'utilisateur va devoir placer dans le second plateau, qui est lui vide au départ, et se remplit au fur et à mesure. On a donc un tableau de départ et un tableau d'arrivée. Les deux plateaux sont constitués chacun de 256 espaces qui contiennent les 256 cases officielles du jeu. 10 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD On retrouve donc sur la capture ci-dessus le tableau de départ qui contient les pièces à droite et le tableau d'arrivée vide (car nous sommes sur une nouvelle partie) qui contiendra les 256 cases à gauche, si bien entendu, nous réussissons à finir intégralement le jeu Eternity (pas pour demain la veille☺). 2.3. Les fonctionnalités Une fois dans le jeu, nous avons la possibilité d’effectuer plusieurs actions. 2.3.1. Faire tourner une pièce (rotation) Une fois que le joueur a déplacé une pièce sur le plateau de jeu, il lui est possible de lui effectuer une rotation de 90° horaire en cliquant sur le bouton "Rotation". 11 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Le principe est simple : lorsqu’une pièce est déplacée du plateau de départ vers le plateau d'arrivée, elle est "sélectionnée", c’est- à-dire qu’on sait retrouver la pièce qui vient d’être déplacée, ainsi que toutes ses caractéristiques présentes dans la base de données. En cliquant sur le bouton "Rotation", la fonction JavaScript adéquate se déclenche pour effectuer la rotation de ladite pièce. Bien entendu, il est possible de "sélectionner" soi-même ses pièces : il suffit de cliquer sur une pièce du plateau. 2.3.2. Sauvegarder le jeu en cours Il existe un bouton "Sauvegarder" permettant d’enregistrer la partie en cours. Si l’utilisateur quitte la partie en cours, à sa prochaine connexion, il retrouvera le jeu en cours tel qu'il l'avait laissé au moment de sa dernière sauvegarde. 2.3.3. Charger une partie existante Lorsque le joueur choisi de charger une partie déjà présente, celui-ci clique sur le bouton "Charger une partie". Il s’affiche alors la liste des parties existantes, le joueur n’a plus qu’à cliquer sur la partie désirée pour relancer le jeu sauvegardé. 12 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD 2.3.4. Quitter la partie En bas à droite apparaît un bouton rouge qui requiert toute notre attention. Il s’agit du bouton "Quitter le jeu". Ce dernier est chargé de nous faire revenir au menu principal (la page d’accueil du site) sans sauvegarder le jeu. 13 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD III/ PROGRAMMATION DU SITE 3.1. Modélisation de notre BDD (Base De Données) 7 Dans cette base de données, un joueur est associé à un plateau, qui possède une liste de pièces composé de morceaux possédant des propriétés spécifiques à ce plateau. Ainsi, un joueur peu modifier ses pièces comme il le souhaite, la liste des pièces/morceaux restera intacte, afin de ne pas modifier le jeu des autres joueurs. 3.2. Organisation et architecture des pages 14 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Par volonté professionnelle, nous avons organisé tout le jeu en de multiples sections, afin d’accentuer la lisibilité et la facilité de codification future (les éventuelles modifications au cours du projet). Ici, l’index.php va faire appel a inc/functions.php qui contiens toutes les fonctions essentielles du jeu Eternity, puis vérifier et/ou connecter l’utilisateur, et lui attribuer une page en fonction de sa demande ; cette page ce trouve dans le dossier www. Les pages vont ensuite faire appel à des class qui sont contenues dans le dossier inc/class. Enfin le dossier "res" (abréviation de ressources) contient tout les fichiers de configurations, le css, les images et scripts. Note : les fichiers class utilisent également la variable/ l’objet global $db qui est défini dans inc/ db.class, appelé par functions.php. 3.3. Développement objet et optimisation Chaque page, lorsqu’elle se charge, fait appel aux objets qui seront nécessaires au lancement du jeu (à travers functions.php). 15 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Tous les objets utilisés ont été créés avec PDO, et sont donc de type PDOStatement ; c’est le résultat renvoyé après exécution d’une requête SQL. Pour parcourir les resultats en programmation objet, nous avons choisi d’utiliser la boucle de type foreach ("pour chaque" en francais), une boucle performante qui permet de parcourir les objets et d’affecter à chaque tour, le resultat dans la variable specifiée derrière le "AS" sous forme de tableau. Ci-dessous un exemple de parcours de résultats, affichant les données récupérées d'un objet PDOStatement. Par souci d’optimisation et d’allégement mémoire, chaque variable faisant appel à un objet, est ensuite passée à l’état NULL, libérant les ressources utilisées. Nous avons également décidé de réaliser de simplifier les calculs mathématiques à travers des requêtes SQL qui permettaient d’obtenir les résultats nécessaires, sans passer par plusieurs boucles de calculs. Ainsi, la gestion des pièces uniques était gérée par les id de la base (un unique pour chaque lot de joueur/pièces). De ce fait, la fonction testant si une pièce placée sur le jeu est correcte ce fait a l’aide des attributs de la base : 16 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Ici, la fonction Test_Piece reçoit en paramètre la pièce et ses coordonnées, puis récupère à chaque fois les coordonnées des pièces voisines pour tester si tout concorde. Si tout est ok, alors on autorise la sauvegarde a l’aide de la variable de session valid_save qui passe a true. 3.4. Gestion de la sauvegarde Dès que l’utilisateur effectue une modification sur son plateau, une fonction Ajax est appelée, qui génère et ajoute dans un tableau la requête SQL correspondant aux modifications effectuées par l’utilisateur. La fonction testant la position de la pièce permet ensuite d’autoriser ou non cette sauvegarde. Lorsque celle-cii est autorisée, et que l’utilisateur la déclenche en cliquant sur sauvegarder, la fonction récupère le tableau de sauvegarde qui est une variable de session et le parcours en exécutant chacune des requêtes le contenant. Ci dessous une boucle éxécutant les requêtes de modification du plateau de jeu. 3.5. Fonction qui permet de créer un joueur Lorsqu’un nouveau joueur souhaite jouer a Eternity, le programme, après avoir récupéré son nom, lui crée un jeu de pièces valides qui lui est propre (pour qu’il puisse modifier ses pièces, les placéer et effectuer les rotations qu'il désire) stocké dans la table ProprietePiece. Cette création de partie se fait de la façon suivante : 17 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD La fonction ci-dessus détecte qu'une partie a "besoin" d'être créée, et appelle les fonctions nécessaires pour cela. A partir de cette variable, on lui crée ensuite un jeu de pièce : 3.6. La gestion de l'affichage du jeu Notre fonction create_array est une fonction permettant de gérer l’affichage de la liste des pièces et des pièces sur la grille. La fonction récupère avant tout la liste de toutes les pièces de l’utilisateur puis les teste une par une afin de savoir si il faut les placer sur le plateau de jeu. Si elles sont placées, la fonction teste s’il faut effectuer une rotation dessus et l’ajoute dans un tableau qui sera le tableau contenant la liste des pièces à afficher sur la grille. 18 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Si en revanche, les pièces n’ont pas d’abscisses/ordonnées, alors elles sont envoyées dans un autre tableau qui constituera le tableau des pièces encore disponibles. Enfin, la fonction ajoute ces deux tableaux dans un seul tableau général, afin de pouvoir le retourner en l’appelant. 3.7. Fonction permettant la recherche d'une pièce à partir des pièces proches L’aide a la recherche de pièce ce fait aussi par le biais de MySQL, en lui demandant une pièce non placée (d’abscisse et d’ordonnée 0) possédant les caractéristiques nécessaires pour être placée sur le plateau. 19 / 20
STRUCTURE DE DONNÉES & ALGORITHMIQUE PROJET - ETERNITY II WIZARD Conclusion Ce projet qui nous a permis de gérer un jeu d'un nouveau type en deux dimensions nous donne un très rapide aperçu de la difficulté de réalisation de "réels" jeux vidéos, ce qui nous montre d'avantage que nous avons encore beaucoup de chemin à faire... A travers ce projet, nous avons cherché à montrer qu'un ordinateur est un outil qui se révèle être très puissant et capable de calculs très fiables en peu de temps. Ce projet nous a confrontés à beaucoup de problèmes, surtout concernant l’algorithmie et la logique qui se révèlent être plus que nécessaires pour mener à bien cette étude. Nous n'avons malheureusement pas pu finir le projet au vu de sa complexité, et ce malgré notre fort degré d'investissement. Nous avons approfondi les "bases" que nous avions acquises en programmation (en C) et avons pu travailler en équipe, ce qui a permis une entraide tout au long de la mise en place du projet. Il nous a aussi fallu travailler l'organisation, ce qui n'est pas simple à 3, pour permettre à chacun d'appoter sa contribution. Nous avons rencontré beaucoup de problèmes, notamment au niveau des structures, et comme pour les autres projets des bug de fonctions, ainsi qu'avec les différents langages des technologies Web que nous avons du utiliser pour réaliser ce projet. Nous avons été confrontés à toutes les difficultés qu’un ingénieur de l’EFREI aurait pu rencontrer, puis, en fonction de notre niveau, nous avons su résoudre certains de ces problèmes et certains autres non. Tel était le projet... 20 / 20
Vous pouvez aussi lire