Quarto 3D en OpenGL

 Article modifié dernièrement le 10 Jan 2010 @ 22 h 22 min

Présentation

Le Quarto est un jeu de plateau se jouant à deux. On dispose de 16 pièces à placer sur un plateau carré de 16 cases (4×4). Les pièces possèdent 4 caractéristiques différentes :

  • Petite ou grande
  • Ronde ou carrée
  • Claire ou foncée
  • Pleine ou creuse

Le premier joueur donne la pièce de son choix au deuxième joueur afin que celui-ci la positionne sur le plateau. Puis le deuxième à son tour choisit la pièce que le premier joueur posera. Le but du jeu étant d’aligner 4 pièces ayant au moins une caractéristique commune, sur une ligne, colonne ou diagonale du plateau.

Plateau du Quarto

Plateau du Quarto original

Modélisation graphique

La modélisation des pièces est le plus difficile car les seules formes existantes dans la librairie GLUT ne pouvaient à elles seules permettre de créer les pièces du Quarto. Il a donc fallu modéliser complètement les pièces à partir d’un « patron » et selon le nombre de faces de la pièce (on considère qu’une pièce ronde possède 64 faces), les 16 pièces ont bénéficiées des fonctions GL_QUADS et GL_TRIANGLES :

  1. Pour chaque face, on détermine les coordonnées des points (3 pour le fond et le « toit » de la pièce, 4 pour le reste).
  2. A partir de ces points, on calcule la normale à la face, afin de permettre à openGL d’éclairer notre pièce correctement quand on appliquera les lumières.
  3. Puis on appelle notre normale via glNormal3f() avant de placer nos points via glVertex3f().
  4. On répète cette opération autant de fois qu’il y a de faces sur notre pièce.

Les caractéristiques de notre pièce sont passées en arguments de la fonction de création. Selon ces derniers, la fonction :

  • appliquera la couleur ROUGE aux pièces dites « foncées » et BLEUE aux pièces dites « claires »
  • appliquera ou non un paramètre « hauteur » si la pièce est grande ou petite
  • rendra creux ou non le haut de la pièce selon l’attribut « remplissage »
  • créera autant de faces que d’arguments « cotes » (4 pour une pièce carrée, 64 pour une ronde).

A noter que GL_RESCALE_NORMAL est utilisée (fonction d’openGL 1.2) car il permet un recalcul des normales plus léger que GL_NORMALIZE, chose nécessaire car nos pièces sont mises à l’échelle avant affichage.

Quarto départ

Quarto départ

Algorithme de victoire

Il est possible de représenter ces 16 pièces de façon binaire : 1 bit pour chaque caractéristique, à 0 ou 1 selon l’état (rouge/bleu, grand/petit..). Nos pièces seront alors numérotées de 0 à 15 :

EtatBit 0Bit 1Bit 2Bit 3
0CarréeCreusePetiteRouge
1RondePleineGrandeBleue

La vérification de la victoire est très simple : il suffit pour la ligne, colonne ou diagonale que l’on vérifie de faire un ET binaire sur chaque élément, et un ET binaire sur le complément binaire de chaque élément. Ainsi on peut vérifier si dans notre ligne, colonne ou diagonale, on a 2 pièces ayant une position de bit commune (à 0 avec le complément, à 1 sinon), ce qui correspond à une caractéristique commune.

Par exemple : 0 & 1 & 2 & 3 donne 0, mais ~0 & ~1 & ~2 & ~3 donne 8, soit le bit 3 commun, à savoir la couleur.
Il suffit alors de renvoyer une valeur si victoire il y a, et de la traiter.

Interactions avec l’utilisateur

La sélection d’une pièce autour du plateau se fait avec les flèches Gauche ou Droite (Dans le sens trigonométrique pour Gauche, inverse pour Droite). C’est la pièce pointée par le curseur qui sera sélectionnée à la pression sur Entrée. La pièce ainsi choisie doit alors être posée sur le plateau.

Les 4 flèches font alors bouger le spot sur les différents emplacements possibles. Si une pièce est présente là où le spot éclaire, il sera impossible de la poser. Si on souhaite annuler la sélection d’une pièce, la touche Backspace nous permet de recommencer. Toutefois, le placement d’une pièce est définitif.
Les touches 8 et 2 permettent de monter ou descendre la position de l’observateur, et les touches 4 et 6 tournent l’observateur autour du plateau. La touche 5 remet la vue à l’état initial.

Un menu apparaît au clic droit sur la fenêtre. Il est possible ainsi de recommencer une partie, afficher dans la console les différentes touches écoutées, prendre une capture d’écran du jeu, et quitter le jeu. La touche Echap permet aussi de quitter.

Quarto en cours

Quarto en cours

La programmation

Dans la rubrique « sources » se trouvent tous les fichiers nécessaires à l’utilisation du Quarto.
Quarto.c et Quarto.h sont les fichiers principaux contenant toutes les méthodes d’affichage, de recadrement, et de génération des listes d’affichage, ainsi que toute la partie gestion du jeu.
Vect.c et Vect.h contiennent les fonctions et définitions nécessaires au calcul des normales (Points, Vecteurs, produits scalaire et vectoriel..)
Construct.c et Construct.h contiennent les fonctions de modélisation 3D des pièces et des « socles ».

La compilation nécessite la librairie jpeg (normalement incluse par défaut avec Linux, sous Windows il faut installer Dev-c++ qui inclut toutes les librairies nécessaires) ainsi que glut et opengl. Les commandes étant:

Compilation des objets :
gcc -c vect.c
gcc -c construct.c
gcc -c quarto.c

Compilation du programme :
[Win32] gcc vect.o construct.o quarto.o -o quarto.exe -ljpeg -lm -lglut -lGLU32 -lopengl32
[Linux] gcc vect.o construct.o quarto.o -o quarto -ljpeg -lm -lglut -lGLU -lGL

Il suffit de lancer quarto (ou quarto.exe) pour jouer.

Sources

Voici les sources (écrites en C) de mon projet réalisé en Master 2 Informatique : disponibles ici

Trois flèches vers le bas

1- Logiciel de brouillage d’adresse IP :

Contourner la censure en surfant anonyme

2- L’article explicatif :

La différence entre un proxy et un VPN

3- Comment espionner un smartphone (app) :

L’application de référence

Commentez ici

  • Greg 3 janvier 2010, 14 02

    Hum.. Chapeau pour la programmation 🙂

  • Mimie 3 janvier 2010, 16 04

    Merci, dire que bientôt je pourrai porter ce code pour qu’il soit jouable depuis un navigateur grâce au futur standard WebGL qui utilise le langage OpenGL pour accéder aux ressources de notre carte graphique (voir article WebGL : le Web dans la troisième dimension

  • Greg 3 janvier 2010, 19 07

    En clair tu peux te monter un site quoi ?

  • Mimie 3 janvier 2010, 20 08

    Oui mais il faudrait retravailler le mode de jeu par le réseau car là ça se joue à 2 mais devant le même ordi … 🙂

  • ilys05 4 janvier 2010, 1 01

    Développer une petite IA serait aussi très bien. En tout cas bravo.

  • Mimie 4 janvier 2010, 9 09

    Merci ilys05, le but du projet était d’apprivoiser OpenGL mais c’est vrai qu’une petite IA serait la bienvenue 🙂 je note ça pour plus tard ^^

  • Matthieu 4 janvier 2010, 22 10

    C’est vachement bien codé ce truc … 😀

  • Mimie 4 janvier 2010, 22 10

    Merci à toi binôme 🙂 c’est toi le meilleur ^^

Article suivant:

Article précédent:

Share This