Bon, j'ai récupéré ton code et j'y ai vu des choses un peu bizarre à plusieurs niveau (conception, code, autres).
Tout d'abord, j'ai l'impression que tu as commencé la programmation avec du C. Je veux dire par là que ça se "sent" dans ton code, ce n'est pas vraiment réfléchi objet même si le fait de tout séparer en classe est une bonne habitude (tu verras, après tu en feras trop, des classes, mauvaise habitude du codeur java ^^).
C'est très bien d'avoir séparer le "business", le vrai code du jeu, de la partie "UI", la partie qui va gérer seulement l'affichage. Pareil pour la bibliothèque, là c'est des mots en dur mais plus tard, pourquoi pas aller fouiller dans un fichier qui contient tous les mots du dictionnaires (c'est très bien aussi de se mettre des objectifs "facile" pour avancer petit à petit, ainsi tu verras ton application avancée et c'est très motivant).Au niveau des problèmes (que je vois à mon humble niveau), tu devrais améliorer le découpage en classe. Par exemple, Bibliothèque ne devrait que fournir le mot mystère. Pourquoi est-ce que tu demande dans le Main à Bibliothèque de générer la liste (sans la stocker), puis (la ligne d'après), demander le mot mystère à ta Bibliothèque ? Je pense que ta méthode listeMot() devrait être privé et c'est motADeviner() qui va l'appeler en interne. Toi tu t'en fout de savoir comment il fait (si tu es dans Main), tu veux juste un mot mystère. Donc tu ne dois faire appel à Bibliothèque qu'une et une seule fois. Si ça se trouve, c'est pas toi qui code Bibliothèque, et tu t'en fiche de savoir comment le mec il a fait, tu veux juste un mot mystère, t'imagine si le mec il avait fait appel à 10 méthodes différente pour générer sa liste ? Tu te vois faire
1 2 3 4 5 6
| bibliotheque1.methodGenStack0();
bibliotheque1.methodGenSuite0();
bibliotheque1.listCreation();
bibliotheque1.listEnhanced();
bibliotheque1.listShake();
... |
Horrible non ? Tu veux juste
bibliotheque1.donneMoiMonMotMystèreJeMenFicheDeCommentTuFais();
et c'est une notion très importante en Java (et en objet), la séparation. C'est pour ça que j'insiste (un peu) ![:mouarf:](https://www.developpez.net/forums/images/smilies/toine.gif)
Ensuite, je vais te faire une remarque un peu personnelle et peut-être que d'autres me le reprocheront mais j'aime pas du tout gérer des char. C'est toujours chiant, la plupart des trucs intéressant utilise des String, du coup, tu dois toujours t'emmerder à caster et re-caster, tronquer, pour au final retrouver ton char. Et puis, le test d'équivalence avec '==', j'aime pas, ça fais trop impératif, j'aime pas.
Alors que si tu gères une String, là c'est mieux, là tu as le equals(), tu à le nextLine(), là tu t'amuses un peu plus. Alors on va me dire que c'est con d'avoir une String avec un seul caractère, je répondrais que oui mais j'ai pas envie de m'emmerder pour quelques octets et quelques millisecondes (je parle dans le cas d'un projet perso, aller pas me sortir le projet haute dispo sur atari...).
Donc tu peux faire un passage dans ta classe Partie, histoire de voir. Par contre, essaie de peut-être plus découper tes méthodes (bon, là, ça m'a l'air pas mal mais c'est important) et un peu plus d'attribut de classe. Tiens, ça me fait penser que dans Bibliothèque t'as "liste" qui n'a pas de visibilité (par défaut, c'est package la visibilité, je te rassure tout de suite, personne ne l'utilise) donc tu peux mettre ta liste private. C'est pas bien de ne pas mettre de visibilité, essaie de prendre l'habitude.
Plateau : J'ai rien compris au code
C'est moche, et il faut arrêter avec les tableaux, sincèrement, c'est un truc très marrant en C mais en Java utilise un ArrayList, pour commencer, ça va largement couvrir tes besoins. Ah oui, ça me fait penser (encore!) dans Bibliothèque, tu as déclarer ta liste comme ça
ArrayList<String> liste = new ArrayList<String>();
alors (outre le fait que tu as oublié le scope), il ne faut pas type liste avec ArrayList mais avec son interface List. Ça te permet de changer l'implémentation de ta "liste" sans foutre en l'air ton code. Bon, c'est peut-être un peu poussé pour ton niveau mais bon. Imaginons que là, tu utilises un ArrayList parce que ça te va, donc si tu veux manipuler ta "liste" tu dois foutre des ArrayList partout. Plus tard, imaginons que tu veuilles mettre ton pendu sur plusieurs processeurs (c'est pour l'exemple) et tu t'aperçois que mince ArrayList n'est pas synchronisé et que du coup, y'a des bugs bizarre quand les 2 processeurs veulent lire "liste" en même temps. Mais tu vois que ouf, y'a un SynchronizedList qui existe. Donc tu va changer tous les endroits où y'a ArrayList par des SynchronizedList. Alors que si tu avais déclaré ta "liste" en List qui est une interface implémenté par ArrayList et SynchronizedList, il te suffisait juste de changer le new ArrayList par un new SynchronizedList. Je sais pas si j'ai été très clair mais c'est aussi un truc important en Java donc je me devais de te le dire.
Revenons à Plateau, j'ai l'impression que tu t’embête la vie pour rien. Pourquoi ne pas gérer une liste et gérer le '|' et les '.' à part.
1 2 3
| List<String> lettresJouees = new ArrayList();
for(int i = 0; i < nbEssais; i++)
print(lettresJouees.get(i) + '|');//enfin un truc dans le genre, j'ai écrit le code à la va vite |
Un dernier truc, mais qui est important. J'espère que tu bosses via un IDE (eclipse, intellij, autre on s'en fout), si c'est pas le cas, fonce en télécharger un, ça change la vie, vraiment (les vieux qui grognent au fond de la salle, on se calme). Et donc, avec un IDE, tu peux facilement, grâce à l’auto complétion, accélérer ta vitesse de frappe. Donc on ARRÊTE de nommer ses variables avec un 1 ou 2 caractères ! Les Random r, Valeur v ou Plateau p parce que si je commence à t'écrire
1 2
| c = p.get(v,s);
c.do(k,l,m/n); |
tu fais comment pour débugger ce truc... DONC, on écrit des nom de variable et de méthode et de tout avec un ou deux mots qui expliquent le fonctionnelle (oui parce que faire Valeur valeur, ça change rien par contre Valeur nombreEssais, là ça parle).
Voilà pour ma modeste contribution, j'espère que ça t'a aidé !
Partager