ETERNITY II WIZARD STRUCTURE DE DONNÉES ET ALGORITHMIQUE - BOUAZIZ AXEL NOUAILLAT FABIEN THEBAULT YANN - Free

 
CONTINUER À LIRE
ETERNITY II WIZARD STRUCTURE DE DONNÉES ET ALGORITHMIQUE - BOUAZIZ AXEL NOUAILLAT FABIEN THEBAULT YANN - Free
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
ETERNITY II WIZARD STRUCTURE DE DONNÉES ET ALGORITHMIQUE - BOUAZIZ AXEL NOUAILLAT FABIEN THEBAULT YANN - Free
STRUCTURE DE DONNÉES & ALGORITHMIQUE   PROJET - ETERNITY II WIZARD

                                                           2 / 20
ETERNITY II WIZARD STRUCTURE DE DONNÉES ET ALGORITHMIQUE - BOUAZIZ AXEL NOUAILLAT FABIEN THEBAULT YANN - Free
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
ETERNITY II WIZARD STRUCTURE DE DONNÉES ET ALGORITHMIQUE - BOUAZIZ AXEL NOUAILLAT FABIEN THEBAULT YANN - Free
STRUCTURE DE DONNÉES & ALGORITHMIQUE   PROJET - ETERNITY II WIZARD

                                                           4 / 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