logo Homepage
+  NewbieContest
|-+  Général» Général» Aide Java Mastermind
Username:
Password:
Pages: [1] 2
  Imprimer  
Auteur Fil de discussion: Aide Java Mastermind  (Lu 14603 fois)
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« le: 27 Février 2013 à 20:53:18 »

Bonsoir,

J'ai une petite application de mastermind à programmer et j'ai quelques difficulté, si quelqu'un sais m'aider je lui en serais reconnaissant :

Problème 1 :
//*lettre 1

 System.out.print(" rentrer lettre 1 : ");
            do
            {
            V=Saisie.lire_char();
            V=java.lang.Character.toUpperCase(V);
            }
            while((V<'A')||(V>'F'));


                System.out.print(" rentrer lettre 2 : ");
                do
                {
                W=Saisie.lire_char();
                W=java.lang.Character.toUpperCase(W);
                }
                while((V<'A')||(V>'F'));

//*lettre 2

Quand je rentre une autre lettre que a,b,c,d,e,f dans la lettre 1 pas de problème je peux rectifier mais quand je rentre une auter lettre dans lettre 2 la condition de ma boucle while ne fonctionne pas !
c'est pourtant la même !

Problème N°2 :
deux int : D (difficulté rentré par le joueur) et n (nombre de coup possible )

         System.out.println(" rentrer difficulte (1, 2 ou 3)  ");
         D=Saisie.lire_char();
         if (D==1)
          {
          n=12;
          System.out.println(" Nombre d'essaie : " +n);
          }
             else if (D==2)
             {
             n=8;
             System.out.println(" Nombre d'essaie : " +n);
             }
                else if (D==3)
                {
                n=5;
                System.out.println(" Nombre d'essaie : " +n);
                }

j'ouvre ensuite une boucle


do
          {
*tout mon programme
          }
          while (i!=n);

apparemment je n'ai pas le droit de mettre une lettre derriere le = ?? j'ai fais quelques essais mais infructueux !


dernier problème pour le moment :

Je cherche un moyen pour ne rentrer qu'un seul caractère ( si je rentre un r ou un j le programme repose la question, mais si je rentre ''aa'' ou ''bc'' le programme ne vois pas d’erreurs, j'aimerai donc ne pouvoir en rentrer qu'une !

Merci beaucoup pour votre aide

Cordialement christian
Journalisée
Opsse
Profil challenge

Classement : 1832/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 27


Voir le profil
« #1 le: 27 Février 2013 à 21:49:37 »

Problème 1 :

Oui les deux conditions sont les même et un peu trop, tu as oublié de changer la variable, c'est while((W<'A')||(W>'F')); et pas while((V<'A')||(V>'F'));

Problème 2 :

Sur : while (i!=n); i c'est ton compteur de tour ?
C'est quoi l'erreur que ça t'affiche ?

Problème 3 :

Je ne connais pas de moyen pour empêcher l'entré de plusieurs caractères dans la console.
Essaye de faire un System.out.println(V); juste après la V=Saisie.lire_char(); pour voir ce qu'il récupère lorsque tu rentres plusieurs caractères.
Journalisée
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« #2 le: 27 Février 2013 à 22:14:57 »

pour l'erreur n1 c'etait vraiment gros j'ai honte -_- !


Pour la deux j'ai oublié de mettre D=Saisie.lire_int(); à la place de lire_char mais ce n'était pas sa !

i est bien mon compte tour qui fonctionne trés bien si je met 5 à la place de n.

rapport d’erreur :
master2.java:172: error: variable n might not have been initialized
          while (i!=n);
                    ^

avec systeme_out_print il récupère la première lettre rentré, seulement si la première fait partie des bonnes lettres
« Dernière édition: 27 Février 2013 à 23:54:39 par KriKri Noob » Journalisée
Opsse
Profil challenge

Classement : 1832/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 27


Voir le profil
« #3 le: 28 Février 2013 à 00:06:03 »

Essaye d'initialiser ta variable n avant ta boucle de jeu, comme ca :

int n = 0;

*Choix de la difficulté

int i = 0;
{
     *tout mon programme
     i++;
}
while (i!=n);

Et du coup pour Saisie.lire_char(); ca doit enregistrer la première lettre qui est détecté en entrée sur le terminal mais je ne vois pas comment tu peux empêcher l'utilisateur d'en taper d'autre. Peut être une autre méthode de Saisie qui récupère toute la ligne un truc du genre Saisie.lire_String() si ca existe, et après tu vérifie que la variable récupéré n'a qu'un seul caractère.
Journalisée
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« #4 le: 28 Février 2013 à 00:24:59 »

Merci pour le n=0; je pensais que le définir une fois suffirait
 
Journalisée
Opsse
Profil challenge

Classement : 1832/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 27


Voir le profil
« #5 le: 28 Février 2013 à 03:48:44 »

C'est pas top de définir une variable dans un if, mieux vaut l’initialiser avant et la modifier dans le if comme ça tu est sur qu'elle existe dans tout les cas.
Journalisée
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« #6 le: 28 Février 2013 à 10:28:45 »

j'aimerai également faire un rappel des coups joué avant,

après avoir rentré la dernière lettre, le code rentré s'affiche

System.out.print(" rentrer lettre 5 : ");
                         do
                         {
                         Z=Saisie.lire_char();
                         Z=java.lang.Character.toUpperCase(Z);
                         }
                         while((Z<'A')||(Z>'F'));

                         System.out.println(" Code saisi :" +V+","+W+","+X+","+Y+","+Z);

est ce que je peux m'en resservir pour le mettre quelque part ? ( un tableau ? autre chose ? )
Je sais pas trop comment faire sa 
Journalisée
Opsse
Profil challenge

Classement : 1832/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 27


Voir le profil
« #7 le: 01 Mars 2013 à 05:55:44 »

Oui tu peux les stocker dans un tableau :

Tu la déclare au début de ton jeu :
int[] derniereCombi = new int[5];

A chaque fin de tour tu remplis le tableau et à chaque début tu l'affiches. 
Journalisée
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« #8 le: 01 Mars 2013 à 14:21:13 »

Ma partie ne veux pas se relancer à 0 je ne comprend pas ^^
n'hésiter pas à me proposer des améliorations ou des simplifications ( n'oubliez pas que je suis un noob   )
Code:
  {
/*
v = lettre aléatoire N°1,
w = lettre aléatoire N°1,
x = lettre aléatoire N°1,
y = lettre aléatoire N°1,
z = lettre aléatoire N°1,

V = première valeur rentrée par le joueur,
W = deuxieme valeur rentrée par le joueur,
X = troisieme valeur rentrée par le joueur,
Y = quatrieme valeur rentrée par le joueur,
Z = cinquieme valeur rentrée par le joueur,

i = compteur de tentative,
bien_place = compteur de lettre bien placée dans la combinaison,
mal_place = compteur de lettre mal placée dans la combinaison,
D = niveau de difficulté du jeux rentré par le joueur,
n = nombre de coup que le joueur est autorisé à jouer en fonction du niveau de difficulté,
J = autorise le joueur à relancer une nouvelle partie quand la précedente est terminée,
*/

  char v, w, x, y, z, V, W, X, Y, Z;
  int i, bien_place, mal_place, D, n, J;
  

        System.out.println(" Bienvenue dans ma version de Mastermind ");

[color=red]do
 {[/color]
    /* définition des variables à 0 */

  J=0;
  i=0;
  n=0;

    /* définition aléatoire de la combinaison */

         v = (char)('A' + (int)(Math.random()*5));
         w = (char)('A' + (int)(Math.random()*5));
         x = (char)('A' + (int)(Math.random()*5));
         y = (char)('A' + (int)(Math.random()*5));
         z = (char)('A' + (int)(Math.random()*5));

    /* difficulté du jeux qui définie le nombre d'essaie */

         System.out.println(" rentrer une difficulte (1, 2 ou 3)  ");
         D=Saisie.lire_int();
         if (D==1)
          {
          n=12;
          System.out.println(" Nombre d'essaie : " +n);
          }
             else if (D==2)
             {
             n=8;
             System.out.println(" Nombre d'essaie : " +n);
             }
                else if (D==3)
                {
                n=5;
                System.out.println(" Nombre d'essaie : " +n);
                }


         System.out.println(" Code secret = " +v+","+w+","+x+","+y+","+z);
          do
          {
            /* définition des variables compteur bien_place et mal_place à 0 */

              bien_place=0;
              mal_place=0;

           /* Le joueur entre sa combinaison qui s'affiche au fur et à mesure */

            System.out.print(" rentrer lettre 1 : ");
            do
            {
            V=Saisie.lire_char();
            V=java.lang.Character.toUpperCase(V);
            }
            while((V<'A')||(V>'F'));

                System.out.print(" rentrer lettre 2 : ");
                do
                {
                W=Saisie.lire_char();
                W=java.lang.Character.toUpperCase(W);
                }
                while((W<'A')||(W>'F'));

                   System.out.print(" rentrer lettre 3 : ");
                   do
                   {
                   X=Saisie.lire_char();
                   X=java.lang.Character.toUpperCase(X);
                   }
                   while((X<'A')||(X>'F'));

                      System.out.print(" rentrer lettre 4 : ");
                      do
                      {
                      Y=Saisie.lire_char();
                      Y=java.lang.Character.toUpperCase(Y);
                      }
                      while((Y<'A')||(Y>'F'));
          
                         System.out.print(" rentrer lettre 5 : ");
                         do
                         {
                         Z=Saisie.lire_char();
                         Z=java.lang.Character.toUpperCase(Z);
                         }
                         while((Z<'A')||(Z>'F'));

         /* affichage du code saisi */

                         System.out.println(" Code saisi :" +V+","+W+","+X+","+Y+","+Z);

        /* incrément et affichage du compteur de tentative */

               i++;
               System.out.println(" Tentative numero : " +i);

        /* recherche dans la combinaison de lettre bien placé ou mal placé et incrément des compteurs */

               if (v==V)
               {
               bien_place++;
               }
                 else if ((v==W)||(v==X)||(v==Y)||(v==Z))
                 {
                 mal_place++;
                 }

                 if (w==W)
                  {
                   bien_place++;
                  }
                      else if ((w==V)||(w==X)||(w==Y)||(w==Z))
                        {
                        mal_place++;
                        }

                        if (x==X)
                         {
                           bien_place++;
                         }
                            else if ((x==W)||(x==V)||(x==Y)||(x==Z))
                             {
                             mal_place++;
                             }

                              if (y==Y)
                                {
                                 bien_place++;
                                }
                                  else if ((y==W)||(y==X)||(y==V)||(y==Z))
                                  {
                                  mal_place++;
                                  }

                                              if (z==Z)
                                               {
                                               bien_place++;
                                               }
                                                else if ((z==W)||(z==X)||(z==Y)||(z==V))
                                                {
                                                 mal_place++;
                                                }

          /* affichage des compteurs de lettre bien placé et mal placé */

               System.out.println(" mal place : " +mal_place);
               System.out.println(" bien place : " +bien_place);

         /* affichage d'une fenetre si le joueur trouve la bonne combinaison */

             if ((v==V)&(w==W)&(x==X)&(y==Y)&(z==Z))
             {
             JFrame frame = new JFrame(" BRAVO!!");
             JLabel label = new JLabel(" Tu as trouvé la bonne combinaison !", JLabel.CENTER);
             frame.getContentPane().add(label);
             frame.setSize(300,100);
             frame.setVisible(true);

        /* Incrément de la variable J pour une nouvelle partie en cas de partie gagné*/

             System.out.println(" Partie fini ");
             [color=red]System.out.println(" REJOUER (tapez 1)");
             J=Saisie.lire_char();[/color]
             }
        /* Affichage d'une fenetre si le joueur atteint le nombre maximum de tentative */

             if  (i==n)
             {
               JFrame frame = new JFrame(" Désolé!!");
             JLabel label = new JLabel(" Tu  n'as réussie à trouver la bonne combinaison !", JLabel.CENTER);
             frame.getContentPane().add(label);
             frame.setSize(300,100);
             frame.setVisible(true);
            
       /* Incrément de la variable J pour une nouvelle partie en cas de partie perdu */
          System.out.println(" Partie fini ");
         [color=red] System.out.println(" REJOUER (tapez 1)");
          J=Saisie.lire_char();[/color]
          }
          }
      /* Relance d'une nouvelle tentative tant que le nombre de tentative maximum n'est pas atteint ou que la partie n'est pas terminé */
        [color=red]  while ((i!=n)||(J!=1));[/color]

 }
      /* Relance d'une nouvelle partie si la partie en cour se termine ( gagné ou perdu ) */
[color=red]while (J!=1);[/color]




  }
}
« Dernière édition: 01 Mars 2013 à 17:58:55 par KriKri Noob » Journalisée
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« #9 le: 01 Mars 2013 à 14:57:31 »

char[] derniereCombi = {'V','W','X','Y','Z'};
System.out.println(" Derniere combinaison rentree "+derniereCombi);

Sa ne m'affiche pas les lettres que je rentre   , mais plutot un **No Sms** charabia ^^
De plus pour le moment je ne sais pas comment garder mes valeurs de tableau dans le tour d'après

ex :

je rentre A,A,A,A,A
*à la fin du tour j'appel mon tableau *
derniere combi : A,A,A,A,A  ( pour l'instant plus simple de faire System.out.println(" Derniere combi :" +V+","+W+","+X+","+Y+","+Z);
je rentre ensuite B,B,B,B,B
*à la fin du tour j'appel mon tableau *
derniere combi : B.B.B.B.B
sauf que moi j'aurai voulu avoir
derniereS combi : A,A,A,A,A
                        B,B,B,B,B

C'est possible ?

System.out.println(" J : "+J);
j'ai fais ce test après avoir taper 1 pour rejouer

et sa me met J:49
Je comprend pas trop 
« Dernière édition: 01 Mars 2013 à 17:57:58 par KriKri Noob » Journalisée
Opsse
Profil challenge

Classement : 1832/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 27


Voir le profil
« #10 le: 01 Mars 2013 à 17:56:16 »

Bon déjà quadruple poste les modos risquent de ne pas aimer et quand tu met autant de code met le entre balise [*code*][/*code*] (sans les *)

Pour afficher les valeurs d'un tableau fais plutôt ça :
Code:
char[] derniereCombi = {'V','W','X','Y','Z'};

System.out.print(" Derniere combinaison rentree :");

//Un tour de boucle par element du tableau
for(char lettre : derniereCombi )
{
    System.out.print(" " + lettre ); //Chaque element du tableau est récupérable avec la variable "lettre" et change à chaque tour de boucle
}

Veux tu que je te fasse une correction de ton algo de la façon dont je l'aurais fait, ou tu veux continuer à chercher ?
Journalisée
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« #11 le: 01 Mars 2013 à 18:07:39 »

Je n'ai pas trés envie de continuer à monopoliser ton temps ^^
donc pas besoin de me faire toute une correction !
Par contre j'aimerai savoir pourquoi mon jeux ne se relance pas 

j'ai fais les corrections que tu m'as donnée pour mes messages, et je vais faire celles pour mon algo.


merci 
Journalisée
Opsse
Profil challenge

Classement : 1832/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 27


Voir le profil
« #12 le: 01 Mars 2013 à 18:14:50 »

Essaye en changeant le "while (J!=1);" par "while (true);"

Si je te propose de réécrire ton algo c'est que j'ai le temps de le faire et qu'il y a pas mal de truc qui ne sont pas très "propre" donc ça serait plus rapide de tout réécrire que tout énumérer ^^
Journalisée
KriKri Noob

Profil challenge

Classement : 11437/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 12


Voir le profil
« #13 le: 01 Mars 2013 à 18:23:42 »

Merci de ta proposition ! J'accepte si mon programme reste personnel, si j'avais voulu copier quelqu'un j'aurai pris un des nombreux programme dispo sur internet ^^ ( ce qui n'est absolument pas mon but )
Pour le true c'est pas bete du tout  ! à la place de regarder si il est à 1 je regarde si il est différent de 0!
Journalisée
Opsse
Profil challenge

Classement : 1832/55006

Néophyte
*
Hors ligne Hors ligne
Messages: 27


Voir le profil
« #14 le: 01 Mars 2013 à 18:58:46 »

Bon dans ce cas tu as raison je vais plutôt te faire la liste des trucs qui me choque dans ton code :

Pour commencer les variables d'une lettre c'est juste illisible, il faut remonter en haut de ton algo toutes les 2 min pour voir à quoi correspond ta variable.
Par exemple "D = niveau de difficulté du jeux rentré par le joueur" tu appels ta variable "nivDifficulte" ou "niv_difficulte".

Quand tu as plusieurs variables du même type qui peuvent être regroupé met les dans un tableau, par exemple pour ta solution
Code:
 
char[] solution = new char[5];

for(int i = 0; i < solution.length; i++)
{
      solution[i] = (char)('A' + (int)(Math.random()*5));
}
Tu peux faire la même chose pour les valeurs entrée par le joueur, et lors de la vérification pour compter le nombre de bien placé et mal placé tu fais une boucle plutot que ton interminable suite de if else.


Quand tu récupères le niveau de difficulté c'est typiquement le cas où tu peux utiliser un switch à la place d'une suite de if else
Code:
System.out.println(" rentrer une difficulte (1, 2 ou 3)  ");
nivDifficulte = Saisie.lire_int();

switch(nivDifficulte )
{
      case 1 :
           nbCoup = 12;
           break;
      case 2 :
           nbCoup = 8;
           break;
      case 3 :
           nbCoup = 5;
           break;
      default:
            nbCoup = 8;
            break;
}

System.out.println(" Nombre d'essaie : " + nbCoup);


Voila en gros si tu corriges tout ca ton algo sera beaucoup plus lisible et facilement modifiable.
Si il y a des lignes que tu ne comprends pas dans ce que j'ai écris dis le moi.


Pour ce qui est de l'historique des coups joués tu peux les enregistrer dans double tableau : un tableau qui a une case par nombre de tour qui contient un tableau qui lui a une case par lettre mais c'est peut être un peu compliqué pour toi pour le moment.
« Dernière édition: 01 Mars 2013 à 19:02:10 par Opsse » Journalisée
Pages: [1] 2
  Imprimer  
 
Aller à: