Comparer 2 tableaux ? [Resolu] [Java] - Java - Programmation
Marsh Posté le 03-05-2005 à 10:47:07
tu as une classe java.util.Arrays qui contient une méthode equals qui fait ce que tu veux.
en gros, en java, != compare l'identité des tableaux, pas l'agalité. ça veut dire qu'il regarde si c'est le même alors que tou tu veux regader si 2 tableaux différents contiennent les même valeurs.
Marsh Posté le 03-05-2005 à 10:51:30
Merci bien, je savais pas que != ne comparé que l'égalité.
Je vais allez voir la class concerné.
Marsh Posté le 03-05-2005 à 11:01:25
Je comprend pas le dernier post ???
Par contre la classe java.util.Arrays m'oblige à sortir du traitement en cour pour traiter l'égalité et y revenir. N'y a-t-il pas une autre astuce ??
Je file une partie du code pour que tu vois. Le problème se situe à la ligne 9.
Code :
|
Marsh Posté le 03-05-2005 à 11:03:56
heu c'est quoi les règles de ce jeu déjà ?
je me souviens plus.
Marsh Posté le 03-05-2005 à 11:09:50
Bah, c'est censé être un bête jeu du pendu, mais c'est moi qui vais finir par me pendre...
Une personne rentre un mot qui est converti en tableau (tableauMot). Puis ensuite, le joueur cherche à le trouver en tapant des lettres. Si la lettre est dans tableauMot, ça retourne un tableau avec les emplacements de la lettre, sinon, ça retourne une étoile.
ex: mot=management,
tour 1 :lettre=m,
ça retourne un tableau (tableauReponse[m;*;*;*;*;*;m;*;*;*].
tour 2 :lettre=a,
ça retourne un tableau (tableauReponse[m;a;*;a;*;*;m;*;*;*].
Je voudrais comparer ce tableau là à tableauMot. Tant qu'ils sont différents, on continue à demander les lettres, si ils sont identiques, on arrête et on affiche un message de victoire.
Marsh Posté le 03-05-2005 à 11:17:17
frenchlover a écrit : Merci bien, je savais pas que != ne comparé que l'égalité. |
nraynaud a écrit : IDENTITE ! |
frenchlover a écrit : Je comprend pas le dernier post ??? |
nraynaud t'informe juste que != ne compare que l'identité.
Marsh Posté le 03-05-2005 à 11:22:30
ok, j'avais pas compris.
Normalement, on doit pas donner les réponses, mais j'ai pas trop envie de faire un long discours.
Code :
|
Marsh Posté le 03-05-2005 à 11:27:24
Ben, c'est gentil, mais là, il ne rentre plus dans la boucle
Marsh Posté le 03-05-2005 à 11:32:06
tu n'as pas oublié le point d'exclamation ?
Marsh Posté le 03-05-2005 à 11:32:30
frenchlover a écrit : Ben, c'est gentil, mais là, il ne rentre plus dans la boucle |
tu t'es posé la question du pourquoi ??
tu as fait des tests unitaires avec la méthode qui t'as été indiquée ?
Marsh Posté le 03-05-2005 à 11:33:20
bon et ton algo il est un peu compliqué en fait ...
Marsh Posté le 03-05-2005 à 11:35:59
Non, non, j'ai bien mis le point d'exclamation. Ce qui est bizarre, c'est que syntaxiquement, ça a l'air bon. Je comprend pas pourquoi ça ne rentre pas dans la boucle.
Le programme fonctionne bien jusqu'à cette ligne. Après, ben il rentre pas dans la boucle.
Faut-il importer la classe java.util.Arrays (ce que j'ai fait) ou est ce que "! java.util.Arrays" permet d'importer la classe ?
Marsh Posté le 03-05-2005 à 11:37:15
ça compilerait pas sinon.
Marsh Posté le 03-05-2005 à 11:39:28
frenchlover a écrit : Non, non, j'ai bien mis le point d'exclamation. Ce qui est bizarre, c'est que syntaxiquement, ça a l'air bon. Je comprend pas pourquoi ça ne rentre pas dans la boucle. |
Pöusse un peu, rentre le ventre, et si ça passe toujours pas, descend d'un cran
Marsh Posté le 03-05-2005 à 11:40:40
while(! java.util.Arrays.equals(tableauAnswer,tableauReponse)){
Ca signifie bien que tant que tableauAnswer et tableauReponse sont pas identique alors on continue la boucle. Sinon on arrête.
C'est bien ça ?
Ne doit-on pas à un moment introduire un boolean ?
Marsh Posté le 03-05-2005 à 11:52:00
Je pense avoir trouvé d'où vient l'erreur.
Je défini char[] tableauReponse=new char[art] et char[] tableauAnswer=new char[art] juste au-dessus. Du coup, maintenant, pour lui, les 2 tableaux sont identiques, car ils sont vide et ne rentre pas dans la boucle.
Mais comment initialiser les 2 tableaux à la même taille sans qu'ils soient identiques ???
Hum, hum... Je crois que je vais me pendre moi
Marsh Posté le 03-05-2005 à 12:07:03
Peut être en ne testant pas la condition lors de la première rentrée dans la boucle.
Marsh Posté le 03-05-2005 à 12:10:37
Dans la catégorie gros boulet, je demande.... moi.
Arg, je ne testais pas les bons tableau. Fallait tester tableauAnswer et tableauMot (et non pas tableauReponse).
En tout cas merci à nraynaud pour son aide très précieuse. Au passage, si jamais il repasse par ce topic, je sais pas si il va se souvenir de moi, mais on c'est connu à RadioU à Brest.
Salutation
Marsh Posté le 04-05-2005 à 11:08:02
frenchlover a écrit : Au passage, si jamais il repasse par ce topic, je sais pas si il va se souvenir de moi, mais on c'est connu à RadioU à Brest. |
iiiirk je suis là incognito ! qui es-tu illustre inconnu ? si c'est ton pseudo, je me souviens pas.
(t'as vu que j'essaye d'aller à la télé amateur maintenant ?)
sinon, pour pas tester la première fois, ben tu fais un :
Code :
|
Marsh Posté le 04-05-2005 à 11:59:53
do/while is teh evil§§
Marsh Posté le 04-05-2005 à 12:11:44
Ben, c'était pas mon surnom à la radio.
On a présenté la spécial téléton ensemble, et sinon, je présenter "chapitre 101.1" le vendredi soir. Mais ça remonte à au moins 2 ans. Un mec brun avec des lunettes. Je t'ai reconnu par ton site. Un mec avec des lunettes comme ça, ça ne s'oublie pas .
En tout cas merci pour le coup de main. Mon programme fonctionne maintenant. Reste plus qu'à comprendre comment marche la classe graphics, et je pourrais également retourner le mec qui se fait pendre .
Marsh Posté le 04-05-2005 à 13:19:15
frenchlover a écrit : Ben, c'était pas mon surnom à la radio. |
t'as fait les 30h aussi ? je me souviens qu'on était 2 mais je me souviens plus qui c'était l'autre, désolé
trop d'alcool depuis.
oui, effectivement, il m'est arrivé de porter ces lunettes dans la cité U ....
Marsh Posté le 04-05-2005 à 13:47:55
frenchlover, plutôt que de tester si les deux tableaux contiennent les mêmes éléments. Initialise un compteur que tu incrémentes à chaque fois qu'une ou plusieurs lettres sont trouvées et quand ce compteur arrive à la longueur du mot, c'est que ce mot a été trouvé. Y'aurait pas mal d'autres remarque à faire sur ton programme, mais il faut aussi que tu te mettes un reflechir un peu.
Marsh Posté le 04-05-2005 à 13:58:44
alerim > j'ai hésité à lui dire, je me suis dit que c'était un peu décourageant comme truc
Marsh Posté le 04-05-2005 à 14:54:21
Pour les 30h, c'était Felteux. Moi, je suis arrivé le matin avec les croissants. Bah, tant d'alcool depuis... Je sais ce que c'est. Sans la photo sur ton site, j'aurais pas fais le rapprochement.
Pour ce qui du compteur, pourquoi pas. C'est sur que mon prog dois avoir plein de truc bancal. Il fonctionne, mais surement pas de façon optimal. Toutes les remarques sont les bienvenu. Je ne demande qu'à m'améliorer.
Et dans ce but, merci d'essayer de pas perdre de vue que je débute le JAVA, et donc de ne pas être trop "technique" ou plutôt de ne pas utiliser trop d'abréviation.
Donc là, pour le coup du compteur, en fait on garde la partie qui compare la lettre tapé au mot du départ, mais toutes la partie qui place cette lettre dans un nouveau tableau qu'on teste avec le tableau du mot, on la dégage et on remplace par un compteur. C'est ça ?
Marsh Posté le 04-05-2005 à 15:52:09
en fait c'est nul le compteur, dans un pendu, on peut trouver les lettres dans le désordre, donc c'est soit à peu près bon ce que tu as fait.
Marsh Posté le 04-05-2005 à 15:58:31
Commence par penser l'algorithme indépendamment du code :
Tu dois avoir une boucle principale qui s'arrête quand le mot est trouvé ou quand le joueur est pendu.
Ensuite dans ta boucle tu lis une proposition du joueur. Tu as trois cas à distinguer : le joueur a entré une lettre, une proposition de mot ou une entrée incorrecte (tu vas pas te compliquer la vie, ici une entrée incorrecte c'est une chaîne dont la longueur n'est ni 1 ni la longueur du mot à trouver). Pour chaque cas tu fais le traitement approprié : si c'est un mot, c'est simple : tu les compares avec proposition.equals(mot_a_trouver) (ou tu crées une méthode "comparer" qui compare deux tableaux si tu choisis d'utiliser des tableaux de caractères). Si c'est une lettre, tu récupères le premier caractère de ta chaîne (proposition.charAt(0) ou proposition[0] si tu stockes la proposition dans un tableau) et tu le compares avec chaque caractère du mot à trouver. Dès que tu trouves une occurrences de la lettre, tu incrémentes le compteur correspondant au nombre de lettres trouvées et tu mets cette lettre dans un tableau annexe qui représente l'évolution du jeu (les lettres trouvées quoi).
Voilà c'est vraiment pas plus compliqué que ça et à part la méthode pour lire une chaîne au clavier, c'est vraiment très simple. Tu peux pratiquement traduire littéralement l'algorithme en Java.
Marsh Posté le 04-05-2005 à 16:00:01
nraynaud a écrit : en fait c'est nul le compteur, dans un pendu, on peut trouver les lettres dans le désordre, donc c'est soit à peu près bon ce que tu as fait. |
Hein ? Moi je parlais de compter le nombre de lettres trouvées. Ton compteur est incrémenté quand le test "lettre proposée == une lettre du mot" est vérifié.
Marsh Posté le 06-05-2005 à 13:19:15
Eh bien, c'est à peu près ce que j'ai fait. Lorsque la personne tape un mot ou caractère, je regarde si c'est valide (dans la fonction lireChaine).
Ensuite, je différencie le cas ou c'est un mot ou une lettre. Si c'est le bon mot, alors il fini en congratulant.
Si c'est une lettre, il regarde si elle est dans le mot. Si c'est le cas, il la met dans un nouveau tableau à tous les éventuelles emplacements, sinon, il remplit par une étoile.
Ensuite, il retourne le tableau pour que la personne voit si elle a bon ou pas.
Le truc, c'est que la j'utilise des tableaux. Est-ce que ça ne serait pas possible de faire la même chose directement avec les String ??? Ca ferait des ressources mémoires en moins.
PS : Voici le code actuel qui a pas mal changé.
Code :
|
Marsh Posté le 06-05-2005 à 14:17:22
frenchlover a écrit : Eh bien, c'est à peu près ce que j'ai fait. |
Très "à peu près" alors, pour ne pas dire pas du tout ce que je t'ai proposé de faire.
Il faut spécialiser tes méthodes au maximum pour rendre le code plus clair et plus modulaire. Tu peux pas faire une méthode ("compare" ) qui lit une entrée, la compare au mot à trouver, qui affiche le résultat qui compte le nombre de coups. Tu fais une ou deux méthode comparer qui se contentent de faire ce que leur nom indique : comparer.
Par exemple :
|
Et on pourrait imaginer une boucle principale :
|
Bon c'est totalement improvisé, je ne te garantis pas que c'est la meilleure façon de faire, mais ça a le mérite d'être clair (j'ai volontairement omis les commentaires ) et assez modulaire.
Marsh Posté le 07-05-2005 à 13:53:33
En effet, faut que j'essai de plus modulariser.
Par contre, je ne veux pas retourner le nombre de lettre trouvé, mais afficher les lettres trouvées, donc le premier module que tu proposes ne me paraît pas très utile, cependant, il permet de bien voir la modularité et il est faicle à modifier pour obtenir ce que je veux.
Je vais regarder ça avec attention.
Marsh Posté le 07-05-2005 à 17:11:18
frenchlover a écrit : |
Je ne vois pas où est le problème (et où est-ce que je fais quelque chose d'inutile). Où est-ce que je renvoie le nombre de lettres trouvées ? Mes deux méthodes "comparer" renvoient true si toutes les lettres ont été trouvées, false sinon. Pour ce qui est d'afficher les lettres trouvées, tu le fais à l'endroit où j'ai mis le commentaire "afficher l'avancement du jeu" et qui se fait simplement avec "System.out.println(avancement);".
Enfin fais le comme tu le sens et poste ton code.
Marsh Posté le 08-05-2005 à 17:25:49
Ah, pardon, j'avais pas compris ta fonction comme ça. Je pensais que tu voulais comparer le nombre de lettre. Si le mot fais 7 lettres et que le joueur a trouvé 7 lettres, alors, on affiche le message de victoire.
Désolé
Je vais avoir un peu moins le temps de m'occuper de ça maintenant, vu que je reprends les cours pour 3 semaines.
En fait, j'aime bien être en stage, j'ai plus le temps
Je vais essayer de moduler un peu le code et je le posterais. En plus, je vais essayer d'ajouter un personnage qui est pendu au fur et à mesure. Je pense qu'il faut utiliser la classe graphics ???
J'aimerais bien y ajouter 3 niveau de difficultés. Mais ça, je pense que ça devrais pas être trop dur. Suffit de changer le nombre de tentative et aussi la longueur du mot.
Est-ce que java a une sorte de dictionnaire ??? Je sais qu'il y a la fonction random qui permet d'avoir un nombre aléatoire. Je pense qu'il doit également y avoir une fonction qui doit permettre d'avoir un mot aléatoire... Parce que y a bien randomWord, mais faut définir une liste de mot. Alors, à moins de faire une liste avec tous les mots du dico, c'est chaud.
Marsh Posté le 08-05-2005 à 19:29:38
frenchlover a écrit : Ah, pardon, j'avais pas compris ta fonction comme ça. Je pensais que tu voulais comparer le nombre de lettre. Si le mot fais 7 lettres et que le joueur a trouvé 7 lettres, alors, on affiche le message de victoire. |
Ben si le mot fait 7 lettres et que le joueur a trouvé les 7 lettres il a gagné, hein.
Ca n'empêche pas d'afficher l'avancement du jeu.
Citation : Je vais essayer de moduler un peu le code et je le posterais. En plus, je vais essayer d'ajouter un personnage qui est pendu au fur et à mesure. Je pense qu'il faut utiliser la classe graphics ??? |
Mouais, faut utiliser Swing quoi.
Citation : |
Ca m'étonnerait que l'API Java contienne tous les mots du dictionnaire.
Marsh Posté le 03-05-2005 à 10:39:09
Salut,
je voudrais comparer 2 tableaux pour savoir si ils sont identiques.
exemple : tableau1=[m;o;t;o]
tableau2=[m;o;t;o]
Je pensais faire un truc du genre :
mais ça ne fonctionne pas. En fait, si j'affiche les tableaux avec un System.out.println, les valeurs retourné sont différentes.
1) Sauriez vous pourquoi ça ne fonctionne pas ?
2) Comment pourrais faire pour les comparer ?
Merci
Message édité par frenchlover le 03-05-2005 à 12:39:19
---------------
Ce n'est pas parce que c'est difficile que nous n'osons pas, c'est parce que nous n'osons pas que c'est difficile