Forums Développement Multimédia

Aller au contenu

jeu 421

CODE TUTO

61 réponses à ce sujet

#1 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 31 December 2014 - 08:58 AM

Début en programmation niveau débutant.
j'essaie de faire un jeu de 421, sur les 3 lancer, je voudrais conserver le lancer qui affiche un 4 ou 2 ou 1 et seulement relancer les mauvais résultats.

mon code


function onClic4(pEvt:Event):void

{
       
       
        var gal:Number=Math.round(Math.random()*6);
        var val:Number=Math.round(Math.random()*6);
        var tal:Number=Math.round(Math.random()*6);
        if (val==0){
                val=1
        }
        if (tal==0){
                tal=1
        }
        if (gal==0){
                gal=1
        }
        texte1.text= (gal)
        texte3.text= (val)
        texte2.text= (tal);
        var st=texte1.text
       
       
        if (gal==4 )
        {
                resultat1.text=st;
        }
       
         if (gal==2 ){
                        resultat1.text=st
         }
                 if(gal==1 )
        {
                resultat1.text=st;
                }
               
               
               
       
        if (tal==4 )
        {
               
                resultat2.text=tal;
                }
        if (tal==2 )
        {
               
                resultat2.text=tal;
                }
       
        if (tal==1 )
        {
               
                resultat2.text=tal;
                }
        if (val==4 )
        {
               
                resultat3.text=val;
                }
        if (val==2 )
        {
               
                resultat3.text=val;
                }
       
        if (val==1 )
        {
               
                resultat3.text=val;
                }
       
       
       
       
if(texte1.text=="4"&& texte2.text=="2" && texte3.text=="1"){
        texte4.text="Bravo Gagné"

}

if(texte1.text=="4"&& texte2.text=="1" && texte3.text=="2"){
        texte4.text="Bravo Gagnéb"

}

if(texte1.text=="1"&& texte2.text=="4" && texte3.text=="2"){
        texte4.text="Bravo Gagné"

}
if(texte1.text=="1"&& texte2.text=="2" && texte3.text=="4"){
        texte4.text="Bravo Gagné"

}
if(texte1.text=="4"&& texte2.text=="1" && texte3.text=="2"){
        texte4.text="Bravo Gagné"

}
if(texte1.text=="2"&& texte2.text=="1" && texte3.text=="4"){
        texte4.text="Bravo Gagné"

}
if(texte1.text=="2"&& texte2.text=="4" && texte3.text=="1"){
        texte4.text="Bravo Gagné"

}

}


tous.addEventListener(MouseEvent.CLICK, onClic4);
tous.addEventListener(MouseEvent.CLICK, qdClicBt);

var compte : Number = 0;

function qdClicBt (e : MouseEvent)
{

        compte = compte + 1;
       

        txtCompteur.text = compte.toString();
        if (compte==4){
        gotoAndStop(2)
        }
}


#2 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 31 December 2014 - 10:33 AM

bonjour tu mets

var gal:Number=Math.round(Math.random()*6);
var val:Number=Math.round(Math.random()*6);
var tal:Number=Math.round(Math.random()*6);
if (val==0){ val=1 }
if (tal==0){ tal=1 }
if (gal==0){ gal=1}
 
je mettrais

var gal:uint=Math.round(Math.random()*5)+1;
var val:uint=Math.round(Math.random()*5)+1;
var tal:uint=Math.round(Math.random()*5)+1;
 
je sais ça répond pas a t'as demande.
@+ gustave02

#3 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 31 December 2014 - 10:45 AM

Merci pour ta reponse j'en tien compte, comme tu dis ça ne epond pas à ma demande , j'aimerais conservé les bonnes réponses et juste relancé les mauvaises.

#4 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 31 December 2014 - 11:19 AM

dans l'idée

var nEssais:int = 20; // le nombre de lancer de dés
function joue():void{
var d1:uint = Math.round(Math.random()*5)+1;  //  valeur du dé numero1
        var d2:uint = Math.round(Math.random()*5)+1; //  valeur du dé numero2
        var d3:uint = Math.round(Math.random()*5)+1; //  valeur du dé numero3
        trace(d1 + "   " +d2+"   "+ d3);          // en faisant un coipier coller tu peux voir
        if( d1+d2+d3 == 7){ trace("ok");        // 421 donne un total de 7 donc deja il faut un total de 7
  var test:uint = 0;    // sert de reference pour le test
  if(d1 == 4 || d1 == 2 || d1 == 1){ test++;}  // si le dés 1 = 4 ou 2 ou 1 on ajoute +1 a test donc passe a 1
  if(d2 == 4 || d2 == 2 || d2 == 1){ test++;} // si le dés 2 = 4 ou 2 ou 1 on ajoute +1 a test donc passe a 2
  if(d3 == 4 || d3 == 2 || d3 == 1){ test++;} // si le dés 3 = 4 ou 2 ou 1 on ajoute +1 a test donc passe a 3
}
if (test == 3){   //si test = 3 c'est que tu as 421;
  trace("youpi");
} else {
  if( nEssais > 1){  // si tu as pas utilisé tous les essais  refais la fonction jour
   nEssais--;
          joue();
  }
}
}
joue(); // la fonction joue est lancé au départ elle peut être lancé par un bouton
 
j’espère que ça répond a ta question.
@+ gustave02

#5 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 31 December 2014 - 11:22 AM

Salut !

Moi je mettrais "int et non "uint".
Mais bon,.... La réalité c'est que pour l'heure on s'en moque un peu.

Il faut lâcher prise ! parait-il.

Hors là tu t'es coincé dans un code sans queue ni tête :

Tu compares des String et non les résultats eux mêmes.
Tu multiplies les tests, imagines que tu doivent faire non un 421 mais un 5321 ! Ouch le nombre de lignes !
Tu raisonnes "Objet" mais non pas pas " Objet conceptualisé " mais " objet du monde réel ".

Alors. Avant d'aller plus loin... Tenter de prendre tout de suite de bonnes habitudes avant de tomber dans la même melasse que la mienne.

Mais...
Si vraiment ça te fait plaisir ou que tu en as un besoin impérieux...
J'te ferais ta ptite fonction.
Promis.
Mais ce serait un mauvais service à rendre.

#6 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 31 December 2014 - 11:37 AM

Beuh non Gustave.

Faut rejouer que les dés qui qui n'ont pas les bonnes valeurs.!

C'est ça le problème de Billy.

Bonne fête les gars !

#7 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 31 December 2014 - 11:41 AM

ok je viens de comprendre?

#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 31 December 2014 - 11:49 AM

Bonjour,

@ hbilly : je n'ai pas repris ton code, je ne me suis pas plongé dedans en fait.
J'ai juste quelques remarques :
- quand tu poste du code, utilise la balise qui permet la coloration automatique (c'est un bouton en forme de <> dans la palette de mise en forme des commentaires)
- quand tu as un problème, décris-le, explique ce que tu as essayé et ce qui te bloques. Simplement poster un code, ça n'aide pas à te comprendre, ça demande d'investir du temps avant de savoir si on peut te répondre et ça risque de diminuer beaucoup nombre de personnes qui vont te répondre

- sinon, la problématique du jeu du 421 est sympa pour commencer à programmer. C'est une bonne idée.
Ton souci, je pense, c'est essentiellement de stocker les infos.
- infos des tirages des dés
- infos des dés écartés
- infos des objectifs à atteindre…
C'est en structurant bien tes données que tu partiras sur le bon pied. Pour cela, tu devrais apprendre à te servir des objets.
Je je mets un code complet, mais uniquement abstrait, qui simule les tours de jeux et trace les résultats.
Regarde comment c'est construit et essaye de t'en servir.


// Nombre de lancés maximum :
var lancés_max:int = 5;

// Les 3 dés + un tableau pour les parcourir
var dé_A:Object = {selection:false,valeur:6};
var dé_B:Object = {selection:false,valeur:6};
var dé_C:Object = {selection:false,valeur:6};
var dés:Array = [dé_A,dé_B,dé_C];

// Des variables temporaires pour les tours de jeu
var dé:Object;// permettra de parcourrir le tableau
var objectifs:Array;// stockera les objectifs restants à atteindre

// Appel de la fonction principale
jouer (lancés_max);

// Fonction principale
function jouer (lancés_restants,init:Boolean=true):void
{
  // Si init == vrai, c'est le premier tour. On prépare les variables nécessaires
  if (init)
  {
   objectifs = [4,2,1];
   for each (in dés) dé.selection = false;
  }
  // dans tous les cas, on parcourre la liste des dés
  for each (in dés)
  {
   // si un dé n'est pas déjà sélectionné
   if (dé.selection == false)
   {
        // On tire sa valeur au hasard
        dé.valeur = int(Math.random() * 6) + 1;
        // et si la valeur sortante fait partie des objectifs
        // on sélectionne le dé et on supprime l'objectif
        var id:int = objectifs.indexOf(dé.valeur);
        if (id != -1)
        {
         dé.selection = true;
         objectifs.splice (id,1);
        }
   }
  }
  // Tests de fin de tour
  lancés_restants -= 1;
  if (objectifs.length==0) afficher ("*** GAGNÉ ***",lancés_restants);
  else if (lancés_restants == 0) afficher ("*** PERDU ***",lancés_restants);
  else {
   afficher ("*** EN COURS ***",lancés_restants);
   jouer (lancés_restants,false)
  }
}

// Affichage : pour vérifier le déroulement des tours
function afficher (commentaire:String,coups:int):void
{
  trace ("**********************************");
  trace (commentaire);
  trace ("Valeur du dé A : ",dé_A.valeur,", sélection : ", dé_A.selection);
  trace ("Valeur du dé B : ",dé_B.valeur,", sélection : ", dé_B.selection);
  trace ("Valeur du dé C : ",dé_C.valeur,", sélection : ", dé_C.selection);
  trace ("Objectifs restants : ",objectifs);
  trace ("Nombre de coups restants : ",coups);
}
 


@ gustave02 et hbilly :
attention aux probabilités.
En faisant comme vous faites : le 6 ne sort qu'une fois sur 12, et le 1 sort 3 fois sur 12

Je conseille toujours un typage en int plutôt qu'un arrondi, sur le principe :
int(Math.random()*6)+1;

#9 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 31 December 2014 - 12:37 PM

Merci à tous de vos commentaires et réponses c'est super, merciiiiiiiiiiiiiii

#10 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 31 December 2014 - 12:39 PM

ma logique en prenant compte du conseille de dldler et en esperant pas mettre trop de bêtise.

var nEssais:uint = 20;
var d1:uint;
var d2:uint;
var d3:uint;
function joue(rd1:Boolean,rd2:Boolean,rd3:Boolean):void{
if(rd1 == true){
  d1 = uint(Math.random() * 6) + 1;
  if(d1 == 4 || d1 == 2 || d1 == 1 ){
   if(d1 != d2 && d1!= d3 ){
                 rd1 = false;
   }
  }
}
        if(rd2 == true){
  d2 = uint(Math.random() * 6) + 1;
  if(d2 == 4 || d2 == 2 || d2 == 1 ){
                 if( d2 != d1 && d2 != d3){
                        rd2 = false;
          }
  }
}
if(rd3 == true){
  d3 = uint(Math.random() * 6) + 1;
  if(d3 == 4 || d3 == 2 || d3 == 1 ){
                   if( d3 != d1 && d3 != d2){
                rd3 = false;
         }
        }
}
        trace(d1 + "   " +d2+"   "+ d3);
 
if( rd1 == false && rd2 == false && rd3 == false){
  trace("oupy");
} else {
  if( nEssais > 1){
   nEssais--;
          joue(rd1,rd2,rd3);
  }
}
}
joue(true,true,true);
 


#11 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 31 December 2014 - 13:06 PM

Salut,

J'ai lu en diagonale, et je n'ai pas vérifié mon code, c'est juste mon approche logique de la chose :


// variables
var d:int = 0;
var resultat:Array = [];
var gagne:Boolean = true;
var solution:Array = [1, 2, 4];


// exemple de tirage pour un dé
function tirage():void {
        d = Math.random() * 6 + 1;
        if (solution.indexOf(d) != -1) {
                // vous pouvez conserver ce dé si vous le souhaitez ou tout relancer
                // si le joueur souhaite conserver le dés on le stocke dans un tableau
                resultat.push(d);
                //sinon on refait le tirage pour ce dé
        }
}

// vérifier le tirage
function validation():void {

    gagne = true;

        // on ordonne le tableau de résultat par ordre croissant
        resultat.sort();

        // on compare les deux résultats
        for (var i:int = 0;i<solution.length, i++){
                if (solution[i] != resultat[i]) {
                        gagne = false;
                }
        }
       
        if (gagne) {
                // le joueur à gagné
        } else {
                // le joueur à perdu
        }
}
 

Reste à faire le nombre de tirages possibles et le nombre de dés déjà stockés (pour ne pas les retirer)

#12 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 31 December 2014 - 14:47 PM

Billy tu n'est qu'un Salop !
( cf. panique au village )

J'ai plein de trucs à faire mais je me suis mis dans la tête de trouver ma solution.
ce serait genre :

var MayDay: Array = new Array;

function joue(event: MouseEvent): void {
for (var j: int = 1; j < 4; j++) {
  var lance: int = int(Math.random() * 6) + 1;
  if ((MayDay[j] != 4 && MayDay[j] != 2 && MayDay[j] != 1)) {
   MayDay[j] = lance;
  }
}
trace(MayDay);
}
TIR.addEventListener(MouseEvent.CLICK, joue);
 

Et j'ai pas envie de voir les autres solutions avant d'avoir résolu mon dernier test. RAAHHHHH.....

Faut que j'ouvre des huitres, prépare un rôti de queue de lotte, tournedos rossini et quelques vérines...
Je cherche un bel algorithme.
Bouh....

#13 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 31 December 2014 - 15:16 PM

hou la la je m excuse pour tout ce travail que j ai provoqué,

#14 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 31 December 2014 - 15:53 PM

Et encore...
M. SPI et Didier ça se gère.
( ils sont gentils )
Moi ça craint. ( j'suis pas encore un bon )
Mais tu verras Pol te causer JSON et Draad québecois.
Et alors là !!!!

hi hi hi...

#15 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 01 January 2015 - 19:46 PM

Voir le messagehbilly, le 31 December 2014 - 15:16 PM, dit :

hou la la je m excuse pour tout ce travail que j ai provoqué,

Pas de problème, au contraire ;)
C'est par ce genre de petits exercices que tout le monde "s'amuse" (et progresse), si on répond c'est que c'est plaisant à faire ;)
A toi de piocher, dans les solutions données, les méthodes et astuce qui te semblent pertinentes (et de venir nous donner ta solution finale quand tu en sera satisfait )

#16 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 02 January 2015 - 08:28 AM

Bonjour à tous et meilleurs voeux pour cette nouvelle année 2015.

J'ai travaillé sur vos réponses merci a vous.
Sur celle de gustave02
je n'arrive pas à appellé la fonction joue avec un bouton type d'erreur.
ArgumentError: Error #1063: Non-correspondance du nombre d'arguments sur mon421dfgh_fla::MainTimeline/joue(). 3 prévu(s), 1 détecté(s).


var nEssais:uint = 20;
var d1:uint;
var d2:uint;
var d3:uint;
bt.addEventListener(MouseEvent.CLICK, joue);
function joue(rd1:Boolean,rd2:Boolean,rd3:Boolean):void{
if(rd1 == true){
  d1 = uint(Math.random() * 6) + 1;
  if(d1 == 4 || d1 == 2 || d1 == 1 ){
   if(d1 != d2 && d1!= d3 ){
   rd1 = false;
   }
  }
}
    if(rd2 == true){
  d2 = uint(Math.random() * 6) + 1;
  if(d2 == 4 || d2 == 2 || d2 == 1 ){
   if( d2 != d1 && d2 != d3){
          rd2 = false;
   }
  }
}
if(rd3 == true){
  d3 = uint(Math.random() * 6) + 1;
  if(d3 == 4 || d3 == 2 || d3 == 1 ){
         if( d3 != d1 && d3 != d2){
         rd3 = false;
  }
    }
}
    trace(d1 + "   " +d2+"   "+ d3);

   texte1.text=(d1.toString())
   texte2.text=(d2.toString())
   texte3.text=(d3.toString())
texte4.text=( nEssais.toString())
if( rd1 == false && rd2 == false && rd3 == false){
  trace("youpy");
 
} else {
  if( nEssais > 1){
   nEssais--;
   //joue(rd1,rd2,rd3);
  }
}
}
joue(true,true,true);

 


#17 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 02 January 2015 - 08:43 AM

Réponse a M Spi

je mets mon fichier.fla serait 'il possible de mettre 3 checkbox pour désactiver les bonnes réponses lors des prochains lancer

je le vois à ma façon de débutant.

merci à tous

#18 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 02 January 2015 - 09:05 AM

fichier.fla j'ai oublier d appuyer sur joindre

Fichier(s) joint(s)

  • Fichier joint  421d.fla   1.11 Mo   12 téléchargement(s)


#19 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 02 January 2015 - 11:50 AM

bonjours a tous espérant que cette nouvelle année nous rende meilleur (en Prog).
tu as
Error #1063: Non-correspondance du nombre d'arguments sur mon421dfgh_fla::MainTimeline/joue(). 3 prévu(s), 1 détecté(s).
ce qui veut dire
function joue(rd1:Boolean,rd2:Boolean,rd3:Boolean):void{ == 3 argument true,true et true
et la bt.addEventListener(MouseEvent.CLICK, joue); pas d’argument donc erreur
j'avais appelé avec joue(true,true,true) 3 arguments


en partant de ton fla (ton environnemet ) et ma logique je fais ceci www.citroen-france-tours-nord.fr/as3 forum/421/421d.swf.

#20 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 02 January 2015 - 12:29 PM

je précise après beaucoup de modifications bien sur.
tu as ajouter des élément non pris en charge par mon ex Bouton .

#21 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 02 January 2015 - 13:11 PM

www.citroen-france-tours-nord.fr/as3 forum/421/421d.swf. Super comme tu l' a réalisé ça me convient.


pour l'autre

bt.addEventListener(MouseEvent.CLICK,joue(true,true,true));
function joue(rd1:Boolean,rd2:Boolean,rd3:Boolean){


TypeError: Error #2007: Le paramètre listener ne doit pas être nul.
at flash.events::EventDispatcher/addEventListener()

bt.addEventListener(MouseEvent.CLICK,joue(true,true,true));
function joue(rd1:Boolean,rd2:Boolean,rd3:Boolean):void{
Séquence 1, Calque 'Calque 1', Image 1, ligne 6 1067 : Contrainte implicite
d'une valeur du type void vers un type sans rapport Function.


at _421e_fla::MainTimeline/frame1()


merci beaucoup

#22 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 02 January 2015 - 16:30 PM

ok normal
bt.addEventListener(MouseEvent.CLICK,joue(true,true,true));
function joue(rd1:Boolean,rd2:Boolean,rd3:Boolean):void{
function joue(rd1:Boolean,rd2:Boolean,rd3:Boolean):void{ // ou est l'event

tu pourrais mettre

bt.addEventListener(MouseEvent.CLICK,jouer());
function jouer(event:MousseEvent):void{
                        joue(true,true,true);
}
 
de toute façon vue que tu a ajouté un bouton utilisons le

donc le code avec ton environnement pris de ton fla.

var nEssais:int = 3; //le nombre d'essais ou le nombre de jeter de dés

var d1:uint;// les trois valeur de dés
var d2:uint;
var d3:uint;

var rd1:Boolean = true;// les trois variable qui vont servir pour voir si le résultat du dés est sélectionné
var rd2:Boolean = true;
var rd3:Boolean = true;

texte1.text = "Vous avez 3 essais";// initialisation du texte.

bt.addEventListener(MouseEvent.CLICK, joue); //l’écouteur pour le bonton "lancer"

function joue(event:MouseEvent):void{   la fonction
if( nEssais == 1 ){   //  si on a  plus d' essais , si tous les essais on ete jouer on a perdu donc plus le droit de lancer
  bt.removeEventListener(MouseEvent.CLICK, joue); // remove == retire l'écouteur au bouton lancer
}
           if(rd1 == true){ // si le dés peut etre rejoué
                         d1 = uint(Math.random() * 6) + 1; // lancer au hazard avec le conseil de dldler
                         if(d1 == 4 || d1 == 2 || d1 == 1 ){ //on vérifie les conditions
                                if(d1 != d2 && d1!= d3 ){
                          rd1 = false;
   }
  }
}
        if(rd2 == true){ //idem pour le dés 2
  d2 = uint(Math.random() * 6) + 1;
  if(d2 == 4 || d2 == 2 || d2 == 1 ){
   if( d2 != d1 && d2 != d3){
                  rd2 = false;
   }
  }
}
if(rd3 == true){
  d3 = uint(Math.random() * 6) + 1;
  if(d3 == 4 || d3 == 2 || d3 == 1 ){
                 if( d3 != d1 && d3 != d2){
                 rd3 = false;
  }
        }
}
 
   de1.text = String(d1);// c'est le texte de tes dés;
   de2.text = String(d2);
   de3.text = String(d3);
if( rd1 == false && rd2 == false && rd3 == false){  // la c'est quand tout est réuni on a gagné
texte1.text = "Gagné en " + (2 - nEssais) + "essais"; // la il faut revoir mais a toi de bosser un peu
texte2.text = "youpy";
bt.removeEventListener(MouseEvent.CLICK, joue); // vu que c'est gagné je retire l'écouteur du bouton.
// ce qui implique qu'on peut plus lancer
} else {
  if( nEssais > 1){ // si on a pas 421 et si il reste le droit de rejouer
   nEssais--; // on a un essais en moins
   texte1.text = "Il vous reste "+ nEssais + "essais" ; // le texte
  } else { // si on a plus de tentative perdu
   texte1.text = "";
   texte2.text = "Perdu"; //
  }
}
}
 

voila tu peux ajouter un bouton rejouer qui initialise les variables et remet l'écouteur sur le bouton lancer
c'est a dire d1 d2 d3 et rd1et....

tu peut charger le fla www.citroen-france-tours-nord.fr/as3%20forum/421/421d.fla

a savoir que si tu veux apprendre, la solution avec un tableau est a voir, car plus tu vas faire de projet complexe plus cela sera nécessaire d'utiliser les tableaux.Obligatoire

@+ gustave02

#23 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 02 January 2015 - 18:17 PM

Ok c'est super et sympa, Gustave02 merci.


ps :J'ai testé le code de Didier, mais on fait 421 à tous les coups

#24 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 02 January 2015 - 18:19 PM

Salut,

Au cas où, voici une solution qui fonctionne avec le FLA que tu as envoyé, tu as juste à remplacer tout ton code par celui-ci :


var solution:Array;
var nombreCoups:int;
var tirage:Array;
var rouge:int;
var des:Array;
var i:int;

init();

function init():void{
        solution = [1,2,4];
        nombreCoups = 3;
        tirage = [0,0,0];
        rouge = 0xFF0000;
        des = [de1,de2,de3];
        bt.addEventListener(MouseEvent.CLICK, lanceDes);
        for(i = 0; i<des.length; i++){
                des[i].addEventListener(MouseEvent.CLICK, choisir);
        }
}

// sélectionner les dés à conserver
function choisir(e:Event):void{
        e.target.removeEventListener(MouseEvent.CLICK, choisir);
        e.target.textColor = rouge;
}

// lancer les dés
function lanceDes(e:MouseEvent):void{

        for(i = 0; i<des.length; i++){
                if(des[i].textColor != rouge) {
                        tirage[i] = int(Math.random()*6+1);
                        des[i].text = tirage[i];
                } else {
                        tirage[i] = des[i].text;
                }
        }
        nombreCoups--;
        if(nombreCoups==0){
                validation();
        } else {
                texte1.text="Dés à conserver ?"
        }
}

function validation():void{
       
        var gagne:Boolean = true;
        bt.removeEventListener(MouseEvent.CLICK, lanceDes);
        tirage.sort();

        for(i = 0; i<solution.length; i++){
                if(tirage[i] != solution[i]) gagne = false;
        }
        if(gagne) {
                texte1.text = "";
                   texte2.text = "c'est gagné, bravo!";
        } else {
                texte2.text = "";
                  texte1.text = "c'est perdu";
        }
}
 

Quand on clique sur un chiffre il se met en rouge et il est considéré comme étant conservé pour les autres tirages.
Arrivé à trois tirages on vérifie si le joueur a gagné.
La fonction "init()" permet de relancer le jeu (si tu crée un bouton "relancer le jeu"...).

Ce n'est pas une solution miracle car largement optimisable, mais pour un début ça peut te donner les pistes utiles...

#25 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 02 January 2015 - 19:14 PM

Ok merci beaucoup M Spi c'est super on peut conserver les bonnes réponses, c'est ce que je voulais bravo.merci mille fois.

#26 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 02 January 2015 - 22:23 PM

De rien, à toi à présent de comprendre ce que nous avons tous proposés et comment le code est écrit, si tu as des questions n'hésite pas, et je le re-dit, mélanger timeline et code n'est pas une bonne solution.

#27 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 02 January 2015 - 23:20 PM

Re,

On augmente un peu la difficulté d'apprentissage, tout en proposant plus d'options de jeu :

var solution:Array;
var nombreCoups:int;
var tirage:Array;
var rouge:int;
var noir:int;
var des:Array;
var i:int;
var gagne:Boolean;

init(null);

function init(e:Event):void{
        solution = [1,2,4];
        nombreCoups = 3;
        rouge = 0xFF0000;
        noir = 0x000000;
        gagne = true;
        texte1.text = "";
        des = [de1,de2,de3];
        bt.removeEventListener(MouseEvent.CLICK, init);
        bt.addEventListener(MouseEvent.CLICK, lanceDes);
        for(i = 0; i<des.length; i++){
                des[i].addEventListener(MouseEvent.CLICK, choisir);
                des[i].text= "";
                des[i].textColor = noir;
        }
}

// sélectionner les dés à conserver
function choisir(e:Event):void{
        var couleur:int = e.target.textColor;
        couleur == rouge ? e.target.textColor = noir : e.target.textColor = rouge;
}

// lancer les dés
function lanceDes(e:MouseEvent):void{
        for(i = 0; i<des.length; i++){
                if(des[i].textColor != rouge) des[i].text = int(Math.random()*6+1);
        }
        tirage = [des[0].text,des[1].text,des[2].text];
        if(--nombreCoups == 0) validation() else texte1.text = "Dés à conserver ?";
}

// validation
function validation():void{
        bt.removeEventListener(MouseEvent.CLICK, lanceDes);
        bt.addEventListener(MouseEvent.CLICK, init);
        tirage.sort();
        for(i = 0; i<solution.length; i++){
                if(tirage[i] != solution[i]) gagne = false;
        }
        gagne ? texte1.text = "c'est gagné, bravo!" : texte1.text = "c'est perdu";
}

Cette fois j'ai introduit une écriture ternaire, en gros trois solutions pour écrire la même chose :


if(gagne==true) {
code
} else {
code
}
 


Ou :

if(gagne)  code else  code;

Ou :

gagne ? code : code;

Ca ne change rien au fonctionnement du code, c'est juste une manière plus élégante d'écrire des if/else

Ensuite, j'ai introduit l'incrémentation directe (voir les opérateurs ici : http://help.adobe.co...90204-7fd1.html ), cela permet là aussi de rendre le code plus "lisible" (avec le minimum requis de connaître la syntaxe bien sur), en gros on peut écrire :


nombreCoups = nombreCoups -1;
if(nombreCoups == 0) code;
 


Ou :


nombreCoups--;
if(nombreCoups == 0) code;
 


Ou :

if(--nombreCoups == 0) code;

Ici il faut bien faire la différence entre "--nombreCoups" et "nombreCoups--" ;)

Enfin, j'ai un peu simplifié l'ensemble (bien que ce soit pas encore top) et j'ai ajouté la possibilité de rejouer lorsqu'on à terminé une partie (recliquer sur le bouton "lancer", à toi de faire un autre bouton si tu le souhaite). Tu as aussi la possibilité de sélectionner ET déslectionner un chiffre (en recliquant dessus), ceci permet de choisir les combinaisons ou dés à relancer à chaque tirage, intéressant si tu as des combinaisons multiples comme au Poker ou au Yams, le joueur peut choisir de modifier la combinaison qu'il souhaite atteindre en cours de partie (par exemple choisir entre deux paires et un brelan ou un full), avec la structure que je te propose tu n'es pas limité à 3 dés ou chiffres, tu peux faire autant de combinaisons que tu le souhaites avec autant de dés que tu le souhaites.

Ça te fait un jeu presque complet en à peine 50 lignes de code, que tu peux faire évoluer vers un jeu de Yams, de Poker ou que sais-je encore, à toi de bosser et surtout de bien comprendre l'utilité de chaque ligne de code.

Bon courage.

#28 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 03 January 2015 - 07:53 AM

M. Spi, vous êtes un GRAND MALADE ! :shock:

Néanmoins,
Certes il y a moins de ligne et j’apprends ici une syntaxe qui m'était inconnu.
Mais,
1. Le code est il plus efficace / rapide ? ( même si ici cela a bien peu d'importance )
2. Cela est il réellement plus lisible ? ( pour moi par exemple une série de if se lit comme un roman... La bah faut s'y reprendre à 2 fois )

Merci :Hola:

#29 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 03 January 2015 - 09:10 AM

M Spi Sur votre dernier code j'ai beaucoup d'erreurs et pas d affichage des dés.

j'ai modifié l'avant dernier code comme ceci, l 'affichage , "gagné" ne s'affiche pas toujours.


Merci

Fichier(s) joint(s)

  • Fichier joint  essai2.fla   1.11 Mo   9 téléchargement(s)


#30 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 03 January 2015 - 10:13 AM

Salut,

Citation

Certes il y a moins de ligne et j’apprends ici une syntaxe qui m'était inconnu.

C'est justement le but, sur un code d'une cinquantaine de lignes ça peut valoir le coup de glisser quelques petites méthodes d'écriture un peu plus complexes, le programme n'étant pas dur à décrypter en lui même.

Citation

1. Le code est il plus efficace / rapide ? ( même si ici cela a bien peu d'importance )

Non, juste moins verbeux.

Citation

2. Cela est il réellement plus lisible ? ( pour moi par exemple une série de if se lit comme un roman... La bah faut s'y reprendre à 2 fois )

Lorsque tu te retrouve avec des programmes plus longs, ça devient rapidement essentiel de pouvoir synthétiser ton code pour le rendre lisible à plus grande échelle, et justement pouvoir le lire à la manière d'un roman et non d'une suite d'instructions, dans un roman je lis des phrases, pas des blocs entourés d'accolades, de parenthèses et de points virgules. Mais bon ce n'est qu'une manière d'écrire, rien n'empêche de remplacer tout ça par des structures classiques si c'est plus simple pour vous dans un premier temps, le tout est de comprendre ce qui est écrit.

Citation

M Spi Sur votre dernier code j'ai beaucoup d'erreurs et pas d affichage des dés.

Chez moi tout fonctionne sur la base du code que je t'ai envoyé, je n'ai pas jeté un oeil à ton dernier FLA, mais j'ai testé chez moi avec mon code et ton ancien FLA et tout marche, essayes de voir quelles sont les erreurs signalées et surtout de les comprendre pour cibler où se trouvent les problèmes et les corriger, tu as surement dû modifier quelque chose, soit dans la structure, soit dans le code, voici l'exemple qui fonctionne :



- Afficher le SWF -
Fichier joint  421d.swf   43.53 Ko   17 téléchargement(s)

A toi de fouiller un peu, ça ne serait pas te rendre service que de te donner la solution toute cuite à chaque fois ;)

#31 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 03 January 2015 - 12:00 PM

résolu M Spi
C'est genial ça fonctionne nickel chrome je suis content merci.

#32 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 03 January 2015 - 12:13 PM

Yo Billy : J't'avais dit que se serait coriace !
Yo M. Spi : Ca le fait grave le vouvoiement ? hi hi hi.

- Billy,
1. sur ton "fla" j'ai un problème de texte TLF J'sais pas ce que c'est ! :sad:
2. Faut améliorer le code de M SPI ( il n'affiche c'est gagné qu'au bout des 3 tirages ) :mad:

Bon, je retourne à mes propres désidératas....

#33 hbilly

    Ceinture Jaune

  • Members
  • PipPip
  • 19 messages

Posté 03 January 2015 - 12:42 PM

Bonjour Archiroc

moi aussi j'ai eu problème de texte TLF
incorporer la police
j'ai remis le texte des boutons en statique . et incorporer la police

j'ai la tête qui chauffe

Oui si on fait 421 au bout de deux essais pas d'affichage "c"est gagné"


Merci à vous tous

#34 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6947 messages

Posté 03 January 2015 - 14:08 PM

Citation

2. Faut améliorer le code de M SPI ( il n'affiche c'est gagné qu'au bout des 3 tirages ) :mad:

Citation

Oui si on fait 421 au bout de deux essais pas d'affichage "c"est gagné"

Lisez le code...
Il suffit de modifier la fonction "validation" pour vérifier à chaque coup si la combinaison est bonne.
Si c'est le cas on stoppe le jeu (on retire les écouteurs, etc...), sinon on stoppe le jeu lorsque le nombre de tirage à atteint le nombre max.

Je vous ai déjà mis en place la plus grosse partie, pour le reste à vous de jouer ;)
Le code fait une cinquantaine de lignes dont à peu près 30 de déclarations de variables de base, ce qui veut dire que la partie "fonctionnelle" du jeu tient en une vingtaine de lignes, munissez-vous de la doc pour les thermes que vous ne comprenez pas, pour le reste c'est de la logique, il y a donc 20 lignes à "traduire" pour les comprendre et adapter selon vos besoins.

Bon courage.

#35 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 05 January 2015 - 16:15 PM

A y est !

J'ai moins de ligne que toi M. SPI ! :P
( mais je ne gère pas l'affichage.... )

Le principe :
Je tire de façon systématique les 3 dés.
Mais ils ne comptent pas car si le tirage est bon alors le dé est affecté.
Ca fait ça :


var MayDay: Array = new Array;
var nbcoups: int = 0;
MayDay = [0, 1, 2, 3]

function joue(event: MouseEvent): void {
for (var j: int = 1; j <= 3; j++) {
  var lance: int = int(Math.random() * 6) + 1;
  if (MayDay[j] == lance) {
   MayDay[j] = 0;
  }
}
nbcoups++;
if (MayDay.toString() == "0,0,0,0") {
  trace("C'est Gagné en " + nbcoups + "coups !");
  MayDay = [0, 1, 2, 3];
  nbcoups =0;
}
trace(MayDay);
}
TIR.addEventListener(MouseEvent.CLICK, joue);
 

Sachant que 3 = 4 mais peu importe puisqu'il ne s'agit que d'affichage.
Avec une réduction syntaxique on pourrait tenir en moins de 10 lignes !

Qu'en pensez-vous ?...

#36 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 05 January 2015 - 17:07 PM

si je comprend bien
le des1 bois faire automatiquement un 1 pour être valider
le des2 bois faire automatiquement un 2
le des3 bois faire automatiquement un 3

c'est plus la règle du 421 ?
gustave02

#37 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 05 January 2015 - 17:12 PM

Si si !

Regarde bien... C'est la règle !

C'est juste que j'inverse la logique mais ça marche.

:smile:

#38 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 January 2015 - 17:18 PM

Ça marche plus ou moins :-) en plus, je dois dire un gros Bravo : c'est une belle abstraction de la règle du jeu. Par contre, statistiquement, c'est faux…

#39 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 05 January 2015 - 17:20 PM

Citation

Par contre, statistiquement, c'est faux…

ou ?

Le fait de tirer 3 dés à chaque augmente en effet la statistique de gagner.

BOUH.....

J'y arriverais.

Hi hi hi

Modifié par archiroc, 05 January 2015 - 17:24 PM.


#40 gustave02

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 166 messages

Posté 05 January 2015 - 17:26 PM

j'ai mis des trace sur ton code et je joue ca donne
3
1
1

essai numéro 1

0,1,2,3 le dés 1 fais un trois et le trois reste le des 2 et 3 font un 1 et le 1 reste a faire ?

1
6
6

essai numéro 2 la comme le des 1 est egal a 1 la valeur 1 du tableau passe a zéro donc le dés 1 doit faire un 1

0,0,2,3

@+

#41 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 January 2015 - 17:26 PM

Parce que dans ton raisonnement, seul le dé 2 peut faire la valeur 2, un dé n'accepte que la valeur qui lui est associée. Mais dans le jeu, n'importe quel dé fait l'affaire.


Exemple :
j=1
tirage aléatoire = 2
donc le tirage de j=1 n'est pas validé, mais il devrait être validé pour j=2…

#42 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 05 January 2015 - 17:37 PM

Pas d'accord Didier !
Statistiquement tout va bien.

Le seul truc qui cloche c'est que je tire à chaque fois le dé 3 fois.
Il faut que je décrémente le nombre de tir dés lors q'un résultat est bon.
Mais pour autant je ne peux décrémenter que si j'ai tiré 3.

Donc, si je tire 1 ou 2 alors je dois affecté 1 ou 2 à 3 puis décrémenter une variable nombre de tir.

C'est tout ce qu'il reste à faire.
Mais m'y mettrais plus tard.

#43 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 05 January 2015 - 17:47 PM

Tu joues sur les mots ! C'est simple a vérifier : lance ton jeu 1000 fois et vois combien de fois il gagne :-)
Règle le truc qui cloche et je te dirai si la statistique est bonne ;-)

#44 archiroc

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 250 messages

Posté 05 January 2015 - 19:21 PM

Rah Didier !
t'as raison.
compris.
mais c'était pas si mauvais...

Je reviendrais...
un jour.

#45 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 January 2015 - 12:38 PM

Un petit exemple en guise de corrigé (sans prétention) pour ceux qui voudraient aller plus loin.


- Afficher le SWF -
Fichier joint  dés.swf   6.07 Ko   9 téléchargement(s)

Voici une version jouable, esthétique (chacun ses goûts), animée, avec messages personnalisés, gestion multilingue et enchaînement de parties.
Quand on enlève les commentaires + les langues fr et uk, il ne reste pas grand chose à comprendre je pense, mais si vous avez besoin d'explications, je repasserai par là.
Sur le principe : le joueur est libre de sélectionner les dés de son choix.
Le programme vérifie la présence du 4-21 en 2 circonstances :
– fin du 3e lancé,
– sélection de 3 dés
Sur la pratique : les éléments sont hiérarchisés dans la scène en 2 groupes :
– interaction (messages et boutons)
– jeu (tapis et réserve)

Avoir ajouté de l'animation rend le code moins linéaire puisqu'il y a une interruption le temps que l'animation s'exécute. Si quelqu'un était vraiment perdu dans le code mais voulait comprendre la partie principale, je pourrais faire une version sans animation.

Je n'ai pas vu de "trous" logiques, dites-moi si vous en voyer un.

Le code pour les curieux impatients (sinon, vous le trouverez dans le fichier joint) :
/*
* Messages textes, en français et en anglais
*/

var fr:Object =new Object();
fr.titres  =[ "TENTEZ DE RÉALISER UN 4–21",
         "SÉLECTIONNEZ LES DÉS À CONSERVER",
         "FAITES VOTRE DERNIÈRE SÉLECTION",
         "PERDU",
         "BRAVO"];
fr.légendes =[ "vous avez droit à 3 lancés",
         "puis relancez les dés restants",
         "et bonne chance !",
         "vous aurez plus de chance la prochaine fois",
         "c'est gagné !"];
fr.labels  =[ "Jouer", "Relancer", "Dernier lancé", "Rejouer","Recommencer"];

var uk:Object =new Object();
uk.titres  =[ "CAN YOU GET A 4–21 ?",
         "KEEP THE DICES YOU WANT",
         "LAST SELECTION",
         "LOST",
         "WIN"];
uk.légendes =[ "you have 3 tries",
         "then run the remaining dice",
         "and good luck !",
         "you will be luckier next time",
         "you did it !"];
uk.labels  =[ "Play", "Run", "Last run", "Play again","Try again"];

/*
* Variables du jeu
*/

var coups:int = 0;
var dés:Array = [jeu.tapis.A,jeu.tapis.B,jeu.tapis.C];
var animateur:Timer = new Timer(50,40);
var langue:Object=fr;

/*
* Événements écoutés
*/

interaction.bouton.addEventListener (MouseEvent.CLICK,lancer);
animateur.addEventListener (TimerEvent.TIMER,animer);
animateur.addEventListener (TimerEvent.TIMER_COMPLETE,afficher);
jeu.addEventListener (MouseEvent.CLICK,sélectionner);
drapeau.addEventListener(MouseEvent.CLICK,traduire);

/*
* CODE PRINCIPAL
*/

// Initialiser les valeurs des dés
// et afficher un 4-21 (purement décoratif)
dés[0].gotoAndStop (4);
dés[1].gotoAndStop (2);
dés[2].gotoAndStop (1);
// Lancer le premier affichage
afficher ();

/*
* Fonctions de rappel des événements
*/

function lancer (event:MouseEvent):void {
  // Gérer les cas particuliers
  if (coups>3) coups=1;
  if (coups==1) for each (varin dés) dé.jouable = true;
  // Empêcher le joueur d'intervenir durant l'animation
  // et activer le timer qui anime les dés
  interaction.visible = jeu.mouseChildren = jeu.mouseEnabled = false;
  animateur.reset();
  animateur.start();
}
function animer (event:TimerEvent):void {
  // Affecter une valeur aléatoire à chacun des dés jouables
  for each (varin dés) if (dé.jouable) dé.gotoAndStop (int(Math.random()*6+1));
}
function afficher (event:TimerEvent=null):void {
  if(coups==3) vérifier();
  // Affichager les messages correspondants au coup actuel
  // Et permettre au joueur d'intervenir
  afficher_textes(coups++);
  interaction.visible = true;
  jeu.mouseChildren = jeu.mouseEnabled = (coups<4);
}
function sélectionner (event:MouseEvent):void {
  // Passer le dé cliqué en non jouable(ou inversement)
  // et le déplacer du tapis à la réserve (ou inversement)
  var dé:MovieClip = event.target as MovieClip;
  dé.jouable = ! dé.jouable;
  dé.jouable ? jeu.tapis.addChild():jeu.réserve.addChild();
  if(jeu.tapis.numChildren==0) {
   coups=3;
   afficher(null);
  }
}
function vérifier ():void {
  // Vérifier les valeurs des dés
  var somme:uint=0;
  var produit:uint=1;
  for each (varin dés) {
   dé.jouable=false;
   jeu.tapis.addChild();
   somme+=dé.currentFrame;
   produit*=dé.currentFrame;
  }
  // En cas de défaite, laisser le nombre de coups à 3 (indice des messages perdants),
  // En cas de victoire, passer le nombre de coups à 4 (indice des messages gagnants)
  if (somme==7 && produit==8) coups++;
}
function traduire(event:MouseEvent):void {
  langue = langue == fr ? uk : fr;
  drapeau.gotoAndStop(langue==fr ? 1 : 2);
  afficher_textes(coups-1);
}
function afficher_textes(id:int):void {
  interaction.bouton.label.text = langue.labels[id];
  interaction.message_box_1.text = langue.titres[id];
  interaction.message_box_2.text = langue.légendes[id];
}

Fichier(s) joint(s)

  • Fichier joint  dés.fla   635 Ko   16 téléchargement(s)




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

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

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP