Forums Développement Multimédia

Aller au contenu

[exercice] Jeu de Tic Tac Toe

CODE

7 réponses à ce sujet

#1 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 12 December 2012 - 18:53 PM

Bonjour,

Voici un petit exercice pour réaliser un jeu de TIC TAC TOE.

La série d'exercice rétrospective pour réaliser des petits jeux d'arcade continue, le prochain sera Space Invader, j'espère que vous la trouvez agréable et qu'elle vous aide dans vos réflexions.

Je vous laisses jeter un œil au jeu du jour ici : http://forums.mediab..._le_tic_tac_toe

Puis nous pouvons en discuter si vous le souhaitez ;-)

#2 bObdade

    Ceinture Bleue

  • Members
  • PipPipPipPipPip
  • 75 messages

Posté 13 December 2012 - 10:03 AM

Hello !

Je traîne dans le coin et découvre ces petits "exercices" pratiques.
Super clairs, avec des ptites astuces bien venues (qui me rappellent que j'ai encore des milliers de choses à savoir pour éviter de crouler sous les lignes de codes :)).

Enfin tout ça pour dire : merci quoi ;)

#3 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 13 December 2012 - 10:14 AM

Hello,

Merci à toi pour ce retour, n'hésites pas si tu as des questions ;-)

#4 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 16 December 2012 - 14:55 PM

coucou;
En tout cas tes tuto ou exercices lol sont très instructifs !!merci encore

#5 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 16 December 2012 - 16:39 PM

Merci, content que ça plaise, j'en ai encore un bon paquet sur le feu, hier j'ai sorti le Space Invader et là je bosse sur un Démineur ;-)

#6 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 31 December 2012 - 11:16 AM

coucou;
Voici ce qu'on peut faire avec les OSB (Operateurs Sur le Bit)
J'ai très peu touché a l’intelligence artificielle sinon ca rend le jeu trop dur. je prépare une autre version ou l'on peut choisir ou au hasard celui qui commence. :smile: si Monsieur Spi ni voit pas inconvénient j'aimerai en faire comme lui un exercice qui rentrerai dans le cadre du tuto sur les OSB en pratique. voici un peu de code et quelques explications succintes..

//variables
var grille:Grille =  new Grille();
var largeur:uint=grille.width;
var hauteur:uint=grille.height;
var colLig:uint=3;//nombre de colonne et ligne
var place:uint;
var changer:Object = conteneur.accueil;
var libre:Array;
var ligneO:Array=[]
var colonneO:Array=[];
var ligneColonneO:Array=[];
var ligneX:Array=[];
var colonneX:Array=[];
var ligneColonneX:Array=[];
var choix:int;
var etatDesLieux:uint=0;//cette variable contient la place des rond et la place des croix

changer.text="Tic Tac toe \n cliquez pour commencer";
conteneur.addEventListener(MouseEvent.CLICK,debut)
grille.addEventListener(MouseEvent.CLICK,remplir)

function debut(e:MouseEvent):void{
changer.text="bonne chance"
while(grille.numChildren> 1) grille.removeChildAt(1);
addChild(grille);
grille.y=80;
grille.x=10;
grille.buttonMode=true;
etatDesLieux=0;
for(var p:int=0;p<3;p++){
ligneO[p]=ligneX[p]=colonneO[p]=colonneX[p]=ligneColonneO[p]=ligneColonneX[p]=0}
}


function remplir(e:MouseEvent):void{
var clicX:uint=grille.mouseX;
var clicY:uint=grille.mouseY;
var coefX:uint=int((clicX-largeur) / (-largeur/colLig));
var coefY:uint=int((clicY-hauteur) / (-hauteur/colLig));
place=coefX+(coefY*colLig);
if( etatDesLieux & 1<<place){ changer.text="vous ne pouvez pas jouer cette case";return;}
etatDesLieux |= 1<<place//  on impute a true le bit de rang  "place"  et  poids 2 puisance place
ligneO[coefY] |=1 << coefX;//pareil; ceci a pour but de basculer le bit incriminé a true
colonneO[coefX] |=1 << coefY;
if( coefY-coefX ==0) {ligneColonneO[coefY-coefX]|=1<<coefX;}//pour les ligne colonne pareil; afin d'eviter de creer des variables innutilesje pose des conditions
if( coefX+coefY ==2){ ligneColonneO[coefX+coefY]|=1<<coefY;}
var tileO:TileO= new TileO();
tileO.x=largeur-((largeur/colLig) * (coefX+1));//on met en place la tuile rond qui est celle du joueur
tileO.y=hauteur-((hauteur/colLig) * (coefY+1));
grille.addChild(tileO)
if(ligneO[coefY]==7 || colonneO[coefX]==7 || ligneColonneO[0]==7 || ligneColonneO[2]==7) {changer.text="vous avez gagné";return};
jeuxOrdi();
}

function jeuxOrdi() : void{
if(etatDesLieux==511) {changer.text="Veuillez rejouer";;return};//si la grille est pleine on rejoue
  for(var k:int=2; k>=0;--k) {
   for(var j:int=0;j<3;++j){
   if( ligneO[k]== 7-(1<<j) &&  (ligneX[k] ^ ligneO[k]) <7) {miseEnPlaceOrdi(j,k);return}// * j'explique apres le code
   if( ligneX[k]== 7-(1<<j) &&  (ligneO[k] ^ ligneX[k]) <7) {miseEnPlaceOrdi(j,k);return}
   //les colonnes
   if( colonneO[k]== 7-(1<<j) && ( colonneX[k] ^ colonneO[k]) <7) {miseEnPlaceOrdi(k,j);return}
   if( colonneX[k]== 7-(1<<j) && ( colonneO[k] ^ colonneX[k]) <7) {miseEnPlaceOrdi(k,j);return}
   //les lignecolonne (diagonale) codée en dur pour eviter les test inutiles
   if(ligneColonneO[0]==7 -(1<<(j)) &&  (ligneColonneO[0] ^ ligneColonneX[0]) <7){miseEnPlaceOrdi(j,j);return}
   if(ligneColonneO[2]==7 -(1<<(j)) &&  (ligneColonneO[2] ^ ligneColonneX[2]) <7){miseEnPlaceOrdi(k-j,j);return}
   if(ligneColonneX[0]==7 -(1<<(j)) && ( ligneColonneO[0] ^ligneColonneX[0]) <7){miseEnPlaceOrdi(j,j);return}
   if(ligneColonneX[2]==7 -(1<<(j)) && ( ligneColonneO[2] ^ligneColonneX[2]) <7){miseEnPlaceOrdi(k-j,j);return}
   }}
   //le premier coup au hasard
   libre=[];//on remet le tableau des place libre a 0
   for ( var i:int=0;i<9;i++) if ( !( etatDesLieux & 1<< i)) libre.push(i);//on teste les place libre
   if( !(etatDesLieux & (1<<4 ))) {choix=4;miseEnPlaceOrdi(choix % colLig,int(choix/colLig)) ;return;}//on force l'ordi aa jouer au milieu si la place est libre
   choix=libre[int(Math.random()*libre.length)];// l'ordi joue une place libre au hasard
   miseEnPlaceOrdi(choix % colLig,int(choix/colLig)) ;return;
   }

function miseEnPlaceOrdi(arg:uint,arg1:uint):void {
var tileX:TileX= new TileX();
tileX.x=largeur -((largeur/colLig)*(arg+1));
tileX.y=hauteur-((hauteur/colLig) *(arg1+1))
   etatDesLieux |= 1<< (arg +(arg1*colLig));//on fait basculer le bit de rang=(arg +(arg1*colLig)) a true
ligneX[arg1] |= 1<< arg;//pareil
colonneX[arg]|=1<< arg1;
if( arg1-arg ==0) {ligneColonneX[arg1-arg]|=1<<arg ;}
if( arg+arg1 ==2) {ligneColonneX[arg+arg1]|=1<<arg1;}
  grille.addChild(tileX)
if(ligneX[arg1]==7 || colonneX[arg]==7 || ligneColonneX[arg1-arg]==7 || ligneColonneX[arg+arg1]==7) {changer.text="vous avez perdu";return};
}



 

ca fait un peu insipide :smile: mais rien de complique
explication de :
if( ligneO[k]== 7-(1<<j) &&  (ligneX[k] ^ ligneO[k]) <7) {miseEnPlaceOrdi(j,k);return}

Toutes les lignes ou colonne ou ligneColonnes sont egales a 7 lorsque elle sont pleine.
cela se calcule ainsi on ajoute tous les poids du bit.
bit 0 lorsque il est a true egale a 1 (Math.pow(2,0) ) ou 1<<0
bit 1 lorquil est a true egale 2 a 2 (Math.pow(2,1) ) ou 1<<1
bit 2 lorquil est a true egale 2 a 2 (Math.pow(2,2) ) ou 1<<2
donc si le bit 1 et 2 de la ligneO s ont a true ca donne ligneO= 6 (2+4)
mon code dit si la ligneO est egale a 7 - le poids du bit; cest a dire le bit 0; puisque 7 - 1 egale bien 6 qui est la valeur de ma ligne le bit 0 egale bien 1; je sais donc puisque je parcours mes valeurs de droite a gauche que j egale 0 a ce moment la; donc j'ai la valeur pour retrouver la place sur les .x et k qui est l'indice de ma ligne est par exemple a ce moment la egale a 2..ca me donne la valeur pour retouver mon .y
par la suite je dois savoir si cette place est libre sinon je fais rien..

je mes sers pour cela de loperateur XOR ou ^

cet operateur lorsque'on s'en sert sur deux operandes combine les bit correspondants deux a deux le resulta est 0 si les bit sont identiques et 1 s'ils sont different
donc ma ligneO a le bit1 et le bit2 a true(1) et le bit0 a false(0)
ma ligneX a le bit1 et bit2 a false et le bit0 on sait pas encore..
dcon on fait l'operation avec XOR
donc ma ligneO = 110
^
ma ligneX = 000 le resultat est 110 donc 6 donc inferieur a 7 ma verification a marché; je peux envoyer ma fonction..


apres je sais pas trop ce qu'il faut expliquer. si vous avez des questions.. ;-)

Fichier(s) joint(s)



#7 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7017 messages

Posté 31 December 2012 - 13:38 PM

Yop,

Ca a l'air sympa, mais vachement plus compliqué à suivre par contre.
Pas le temps de m'y plonger là tout de suite, départ pour soirée de réveillon, mais je regarde dès que possible.
Pas de problème de mon côté si tu veux t'en servir en exercice pour tes tutos ;-)
A la limite pense à rajouter des liens entre les versions pour montrer qu'on peut résoudre le problème de différentes façons, l'idéal serait aussi d'expliquer quel gain on a de travailler avec l'une ou l'autre.

Bon courage et merci de participer ;-)

#8 hubeert

  • Members
  • PipPipPipPipPipPipPipPip
  • 925 messages

Posté 31 December 2012 - 14:14 PM

coucou;
oui il va de soit qu'il y aura de liens vers ton travail ( lol je me suis servi de tes graphiques :oops: ) ici le gain n'est surement pas visible ici que en soit en temps ou en ligne de code, le gains n'est pas en compréhension c'est sur ; mais c'est une autre manière de voir; si on fait un jeu de croix ( il faut aligner 5 croix et lordi tente de faire pareil avec une grille de 20*20 soit 400 case tu as a mon avis un gains de temps..mais de ligne de code aussi.. je sais pas faut voir. Lol je te mets le morpion; il est pas fini; il y a encore des bug de fonctionnement. Donc le but c'est de faire voir autre chose autrement pour moi; l'utilisateur il s'en fou un peu si ca marche comme il l'entend; et le développeur fait avec ses habitudes

bon reveillona tous et merci a toi aussi..

Fichier(s) joint(s)





1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)