IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Mastermind: compter les pions biens placés/de bonnes couleurs


Sujet :

avec Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Debutant
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Debutant

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Par défaut Mastermind: compter les pions biens placés/de bonnes couleurs
    Bonjour à tous,

    Me voici en train de coder un mastermind, tout était impec, jusqu'à la fonction qui est censée donner le nombre de pions de bonnes couleurs et le nombre de pions bien placés. Je pense que c'est plus un problème algorithmique qu'un problème propre au java, mais j'aimerai bien savoir pourquoi ceci ne marche pas (je précise que dans la combinaison secrète (var csecrete) et dans la combinaison saisie par le joueur (var cjoueur) il peut y avoir plusieurs fois la même couleur (d'où mon problème)):

    Je pense que ça vient des lignes 35 à 47.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    public class Test2 {
     
     
    	public static void main(String[] args) {
    		String[] a={"a", "b", "c", "d"};
    		String[] b={"c", "a", "a", "a"};
     
    		float[] d = positionnement(a,b);
     
    		System.out.println("bien placés =   " + d[0]);
    		System.out.println("bonne couleur = "+d[1]);
    	}
     
     
    	/*
    	 * Methode censée donner le nombre de pion bien placé et le nombre de pion de la bonne couleur
    	 * @param String[] cjoueur
    	 * @param String[] csecrete
    	 * @return float[nbeBienPlace, nbBonneCouleur]
    	 */
    	public static float[] positionnement(String[]cjoueur, String[] csecrete){
    		float nbBienPlace = 0;
    		float nbBonneCouleur = 0;
    		for(int i = 0; i<cjoueur.length; i++){
    			if(nbreFoisCouleurDansListe(cjoueur[i], csecrete) == 1){
    				if(bienPlace(cjoueur[i], i, csecrete)){
    					nbBienPlace++;
    					nbBonneCouleur++;
    				}
    				else if(bonneCouleur(cjoueur[i], csecrete)){
    					nbBonneCouleur++;
    				}
    			}
    			else if(nbreFoisCouleurDansListe(cjoueur[i], csecrete) == 2){
    				if(bienPlace(cjoueur[i], i, csecrete)){
    					nbBienPlace++;
    					nbBonneCouleur = nbBonneCouleur+(float)1/2;
    				}
    				else if(bonneCouleur(cjoueur[i], csecrete)){
    					nbBonneCouleur = nbBonneCouleur+(float)1/2;
    				}
    			}
    			else if(nbreFoisCouleurDansListe(cjoueur[i], csecrete) == 3){
    				if(bienPlace(cjoueur[i], i, csecrete)){
    					nbBienPlace++;
    					nbBonneCouleur = nbBonneCouleur+(float)1/3 ;
    				}
    				else if(bonneCouleur(cjoueur[i], csecrete)){
    					nbBonneCouleur = nbBonneCouleur+(float)1/3;
    				}
    			}
    			else if(nbreFoisCouleurDansListe(cjoueur[i], csecrete) == 4){
    				if(bienPlace(cjoueur[i], i, csecrete)){
    					nbBienPlace++;
    					nbBonneCouleur = 1;
    				}
    				else if(bonneCouleur(cjoueur[i], csecrete)){
    					nbBonneCouleur = 1;
    				}
    			}
    		}
     
     
    		float[] nbre = {nbBienPlace, nbBonneCouleur};
    		return nbre;
    	}
     
    /*
    	 * Methode comptant le nombre de fois qu'une string apparait dans une liste de String
    	 * @param String str
    	 * @param String[] cjoueur
    	 * @return int nbe
    	 */
    	public static int nbreFoisCouleurDansListe(String str, String[] cjoueur){
    		int nbe=0;
    		for(int i=0; i<cjoueur.length; i++){
    				if(cjoueur[i].equals(str)){
    					nbe++;
    				}
    		}
    		return nbe;
     
     
    	}
     
    	/*
    	 * Methode testant si un pion est bien Place
    	 * @param String Couleur
    	 * @param int j (position du pion dans la cjoueur)
    	 * @param String[] csecrete
    	 * @return boolean bienPlace
    	 */
    	public static boolean bienPlace(String couleur, int j, String[] csecrete){
    		boolean bienPlace = false;
    		for(int i=0; i<csecrete.length; i++){
    			if(couleur.equals(csecrete[i]) && i == j){
    					bienPlace = true;
    			}
    		}
    		return bienPlace;
    	}
     
     
    	/*
    	 * Methode testant si la couleur du pion est présente dans la combi secrete
    	 * @param String Couleur
    	 * @param String[] csecrete
    	 * @return boolean bonneCouleur
    	 */
    	public static boolean bonneCouleur(String couleur, String[]csecrete){
    		boolean bonneCouleur = false;
    		for(int i=0; i<csecrete.length; i++){	
    			if(couleur.equals(csecrete[i])){
    				bonneCouleur = true;
    			}
    		}
    		return bonneCouleur;
    	}
    }
    Merci d'avance pour votre aide.

    PS: c'est la variable nbeBonneCouleur qui merde, nbeBienPlace marche nickel!

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le problème vient effectivement de l'algorihtme :
    1. Il y a "a" dans la combinaison proposée, et 3 x "a' dans la secrete : donc on obtient1/3 (0.33)
    2. puis il y a "c" proposé, qui est une fois dans la combinaison à deviner, donc on ajoute 1, et on obtient 1,33

    On voit que le .33 n'a aucun sens, ou en tout cas, pas le sens qu'il y a 1 pion de la bonne couleur mal placé.

    Déjà, ça me semble bizarre de compter les biens placés dans les couleurs mal placées, mais je n'ai plus en mémoire les règles exactes du MasterMind.

    L'algorithme que je mettrais en place est le suivante :

    je parcours les couleurs de la combinaison proposée :
    1. je stocke une seule fois chaque couleur (donc je détermine la liste des couleurs distinctes présentes dans la proposition)
    2. pour chaque couleur, je détermine son nombre dans la combinaison à deviner et dans la combinaison proposé
      • si le nombre proposé est supérieur au nombre à deviner, je stocke le nombre à deviner (en effet, dans ce cas, le nombre à deviner est le maximum de couleurs mal ou bien placées)
      • sinon je stocke le nombre "proposé" (en effet, dans ce cas, le nombre proposé est le maximum de couleurs mal ou bien placées)

    La somme de tous les nombres est le nombre de couleurs mal placées et bien placées.

    puis je reparcours les couleurs de la combinaison proposée :
    1. je détermine les pions bien placés : en faisant une comparaison 2 à 2, et je cumule le nombre : ça me donne le nombre de couleurs bien placées
    2. pour chaque bien placés, je décrémente le nombre de calculé dans la première partie, pour décompter un bien placé

    La somme des nombres déterminé par la première partie est le nombre de couleurs mal placées (puisque j'ai supprimé les bien placées).

    Pour la première partie, le mieux serait d'utiliser une Map, mais tu n'as peut-être pas encore vu ça en cours : tu peux remplacer la map par 2 tableaux, un de String, pour les couleurs, et un de int, pour le nombre de ces couleurs, en faisant correspondre les indices (nbCouleur[i] est le nombre de couleurs couleurs[i]).

    Comme on calcule le compte des couleurs distinctes, on peut fusionner les 2 boucles sur la combinaison proposée en une seule.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Homme Profil pro
    Debutant
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Debutant

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Par défaut
    Salut. Merci pour ta réponse.
    En effet on ne comprend pas d'où sort le 0.33334, mais en fait comme il y a un for(int i = 0; i<4; i++) avant les instructions if, je pensais (enfin j'aurai aimé) que justement à chaque instance de "a", c'est à dire 3 fois, la variable nbeBonneCouleur allait augmenter de 1/3, soit de 1 car il y a 3 fois la string "a" dans le paramètre cjoueur (même fonctionnement pour un string apparaissant 2 fois, on rajoute +(float)1/2). Et je ne vois pas pourquoi ça ne fonctionne pas ici.

    Effectivement, je ne pense pas que ce soit nécessaire de compter les couleurs des pions bien placés.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Je comprends ton idée avec tes 1/2, 1/3, etc, de compenser le nombre de couleur à placer. Mais il ne faut pas seulement compter les couleurs à placer.
    Dans une combinaison proposée, mettons Rouge, Rouge, Bleu, Vert et Une combinaison à déviner Rouge, Rouge, Rouge, Jaune, il y a 2 pions bien placés, c'est tout. Alors qu'il y a 3 pions rouges dans la combinaison à trouver. Toi tu obiendrais 0.66. Pas 0.
    De même, si on propose rouge, rouge, vert, vert pour vert, vert, rouge, rouge à trouver, tu obiendras 2 mal placés (1/2+1/2+1/2+1/2), alors que c'est 4.
    C'est encore plus flagrant avec rouge, noir, noir, noir et noir, rouge, rouge, rouge. On obtient 3.33 : ça ne veut rien dire. La réponse étant 2 mal placées.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Homme Profil pro
    Debutant
    Inscrit en
    Février 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Debutant

    Informations forums :
    Inscription : Février 2016
    Messages : 8
    Par défaut
    C'est bon, travaillant en groupe nous avons résolu le soucis de cette fonction (sans trop s'inspirer de ce qui nous a été proposé). Par ailleurs nous avons aussi effectué une fonction qui permet à l'ordinateur de trouver une combinaison quelconque en 6 coups maximum (une sorte "d'IA" pour utiliser des grands mots).
    S'il existe des repository sur ce site, je posterai le code source plus tard.

    Merci tout de même de votre aide.

    Je passe en résolu.

  6. #6
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Il se trouve que j'ai dépanné quelqu'un sur ce sujet précis il y a déjà pas mal d'années. J'ai quelque part le code enfoui dans mes archives....

    Je n'ai plus les références mais il y a une stratégie avec tirage aléatoire qui obtient des résultats très proches de l'optimum théorique .... et qui présente l'avantage considérable de s'écrire en quelques lignes de code!
    Donc cherchez dans ce sens car je conseille fortement cette stratégie pour son économie de moyens!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compter les syllabes d'un mot français
    Par david_chardonnet dans le forum Langage
    Réponses: 4
    Dernier message: 09/05/2014, 10h57
  2. Réponses: 19
    Dernier message: 03/08/2004, 10h26
  3. [langage] compter les retour à la ligne
    Par Kinethe dans le forum Langage
    Réponses: 4
    Dernier message: 16/07/2004, 16h36
  4. [C#] Compter les lignes d'un DataSet
    Par alexischmit dans le forum ASP.NET
    Réponses: 13
    Dernier message: 26/04/2004, 15h17
  5. Compter les valeurs d'un tableau
    Par leeloo076 dans le forum ASP
    Réponses: 6
    Dernier message: 30/03/2004, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo