Intro : A partir d'ici nous sommes capable de placer des symboles differents sur une grille et de gérer des tours de jeu ; on peut donc s'attaquer à n'importe quel "board game" qui se passe sur un damier ( bataille navale, puissance 4 etc.). Objectif : Implémenter les règles du morpion. Analyse des règles :
.On joue jusqu'a la victoire ou au match nul ( conditions d'arrêt )
=> la victoire 3 pions alignés verticalement(3), horizontalement(3) ou sur une des 2 diagonales (2)
il y a 3+3+2 = 8 combinaisons gagnantes.
=> le match nul : un pions sur chaque case (9) et aucune combinaison gagnante
Pour implémenter ces 2 règles, nous allons devoir faire une "représentation mémoire" du jeu
Il y a peu de cas de figure donc on peut très bien s'en sortir avec des variables
pour s'y retrouver il suffit d'imaginer un pavé numérique de téléphone par exemple.
var case1:Number = 0; // en haut à gauche
var case2:Number = 0; // toujours sur la même ligne mais juste à coté
var case3:Number = 0; // et etc.
var case4:Number = 0;
var case5:Number = 0;
var case6:Number = 0;
var case7:Number = 0;
var case8:Number = 0;
var case9:Number = 0; // le 9 derniere case en bas à droite
case1:Number = 0 // la case 1 est vide
case1:Number = 1 // le joueur 1 a joué ici (croix)
case1:Number = 2 // le joueur 2 a joué ici (rond)
Avec cette représentation mémoire du jeu, on est en mesure de savoir où les joueurs ont posé leurs pions.
Pour savoir si la 1ere ligne est complète et remplie par le je joueur 1 on peut faire :
// renvoi true si toutes les cases sont remplies
var ligne1_complete:Boolean = case1>0 && case2>0 && case3>0;
// ensuite ...
// la ligne est complète ET il n' a que des 1
if ( ligne1_complete && case1+case2+case3 == 3)
{
trace("le joueur 1 a gagné en remplissant la 1ere ligne");
}else if( ligne1_complete && case1+case2+case3 == 6) {
// la ligne est complète ET il n' a que des 2
trace("le joueur 2 a gagné en remplissant la 1ere ligne");
}
Pour savoir si une case est occupée afin d'éviter les superposition de pions, on peut faire un test
if(case0 == 0){
case0 = joueurEnCours; // 1 ou 2
trace("maintenant la case est occupée par le joueur "+joueurEnCours);
tour_de_jeu_en_cours++;
}
Pour savoir si il y a match nul ou non
if(tour_de_jeu_en_cours == 9)
{
// toutes les cases sont occupées
trace("La partie se termine sur un match nul !");
}
Aller + loin :
Plutôt que d'utiliser une variable différente pour chaque case, on peut utiliser une vraie structure pour stocker notre grille en mémoire.
Déclaration une matrice 3x3 "à la main"
var cases:Array = [
[0,0,0],
[0,0,0],
[0,0,0] ];
ou avec une fonction
//cette fonction crée une matrice(l,c) initialisée avec des 0 ( case vide )
function matrice0( lignes:Number, colonnes:Number )
{
var matrice:Array = new Array();
for(var l = 0 ; l < lignes ; l++)
{
matrice[l] = new Array();
for(var c = 0 ; c < colonnes ; c++)
{
matrice[l][c] = 0;
}
}
return matrice;
}
// exemple grille de morpion
var cases:Array = matrice0(3, 3);
On accède ensuite aux différentes cases comme suit :
trace( cases[0][0] ) // renvoi la valeur dans la case en haut à gauche
c'est plus élégant et surtout plus évolutif, si par exemple il fallait transformer notre morpion en puissance4.
// grille de puissance4, 6 lignes et 7 colonnes
var cases:Array = matrice0(6, 7);