CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[JAVA] Tours de Hanoï, des avis/conseils sur mon code ?

JamereBurvelle
JamereBurvelle
Niveau 40
03 décembre 2018 à 15:15:09

Salut !

J'essaie de me remettre un peu à la programmation en changeant d'approche : au lieu de suivre des tutos sans pratiquer, je me fixe un objectif de programme à réaliser, et quand je bloque, je vois ce qui pourrait m'aider en relisant les chapitres qui me font défaut !

J'ai voulu faire un jeu de tour de Hanoï ce week end, en me forçant à utiliser des classes (pour les tours et pour les disques) et je viens de le terminer à l'instant. J'ai vraiment du mal à me mettre à la programmation orienté objet, j'ai fait un peu de C avant donc j'avais pas vraiment cette possibilité...

Du coup je voulais voir ce que vous en pensiez, si vous auriez fait autrement, des idées pour améliorer le code etc...

(Je suis parti sur l'idée de faire un jeu avec plusieurs niveaux de difficulté possibles, ajoutant des disques à chaque fois, c'est pas fonctionnel mais normalement j'ai qu'à le rajouter puisque c'est prévu pour, j'en ai juste un peu marre pour le moment je le finirai ce soir ou demain en tenant compte de vos conseils :hap: )

Main : https://pastebin.com/WauBdVax

Classe Tour : https://pastebin.com/AjihQV2g

Classe Disque : https://pastebin.com/NH2UZS45

Mon principal souci c'est la classe Disque, j'ai l'impression de ne pas l'avoir exploité du tout, je voulais faire sans et sais que ça aurait été plus simple, mais je veux vraiment me forcer à faire de l'objet donc...

Voilà j'attends vos avis, merci !

Bunyan
Bunyan
Niveau 17
03 décembre 2018 à 22:13:44

Évite d'utiliser des tableaux ( [] ) et passe plutôt aux List.
Sauf dans certains contextes (manipulation de bits, principalement), les tableaux sont rarement utilisés.

Préfère déclarer une variable par ligne, surtout si tu les initialises. Ca rallonge un peu, c'est sûr, mais la lisibilité y gagne.

Pense à utiliser des constantes.

Tu peux rendre encore plus générique afficherTour en créant une autre méthode qui ne prend qu'une simple Tour en argument.

Tu peux découper deplacerDisque en de plus petites méthodes.

Tu peux potentiellement améliorer en rendant une Tour consciente de la taille de son plus haut disque.
Idem, tu peux lui créer une autre méthode simple "estVide" par exemple, ou encore "estPleine".

Préfère utilise l'instruction "break" pour quitter une boucle.

Ton premier test ligne 86 n'a aucune raison d'être dans la boucle.

Tu peux beaucoup simplifier partieTeminee avec un simple return :)

Je ne vois pas de contrôle de la taille de l'anneau, l'as-tu prévu ? Un anneau plus petit ne peut être sous un plus grand.
C'est, je pense, ce qu'il te manque, pour que ta classe Disque ait une réelle utilité.

Tu peux aussi utiliser des Piles, pour tes tours :)

JamereBurvelle
JamereBurvelle
Niveau 40
04 décembre 2018 à 01:18:59

Le 03 décembre 2018 à 22:13:44 Bunyan a écrit :
Évite d'utiliser des tableaux ( [] ) et passe plutôt aux List.
Sauf dans certains contextes (manipulation de bits, principalement), les tableaux sont rarement utilisés.

:d) J'ai utilisé un ArrayList pour les emplacements des tours puisque ils augmentaient selon la difficulté, mais je pensais que lorsqu'on connaissait dès le départ le nombre d'éléments, et que celui-ci ne devait pas changer c'était mieux les tableaux :(
En quoi les List sont mieux du coup ?

Préfère déclarer une variable par ligne, surtout si tu les initialises. Ca rallonge un peu, c'est sûr, mais la lisibilité y gagne.

:d) Je vais essayer de prendre cette habitude alors, merci :oui:

Pense à utiliser des constantes.

:d) J'ai pas encore revu les constantes, je me souviens plus ou moins de ce que c'est mais j'y ai pensé que sur la fin et du coup pas envie de recommencer, j'irai lire la partie là dessus maintenant :oui:

Tu peux rendre encore plus générique afficherTour en créant une autre méthode qui ne prend qu'une simple Tour en argument.

Tu peux découper deplacerDisque en de plus petites méthodes.

:d) C'est vrai que je me suis vraiment fait chier à les écrire celles là (surtout déplacerDisque). Ca pose pas de souci d'impriquer plusieurs méthodes dans une méthode ? Même si elle est aussi "petite" que celle là ?
Par contre je peux pas afficher les tours une par une ou alors il faudrait qu'elles soient à la verticale...

Tu peux potentiellement améliorer en rendant une Tour consciente de la taille de son plus haut disque.
Idem, tu peux lui créer une autre méthode simple "estVide" par exemple, ou encore "estPleine".

:d) Même si je peux le vérifier en une seule condition comme là dessus ?

Préfère utilise l'instruction "break" pour quitter une boucle.

:d) Ok, j'avais oublié cette instruction :hap:

Ton premier test ligne 86 n'a aucune raison d'être dans la boucle.

:d) Dans la boucle for ? C'est vrai ça simplifierait le code :oui:

Tu peux beaucoup simplifier partieTeminee avec un simple return :)

:d) Si j'enlève "else return false;" ça revient au même ?

Je ne vois pas de contrôle de la taille de l'anneau, l'as-tu prévu ? Un anneau plus petit ne peut être sous un plus grand.
C'est, je pense, ce qu'il te manque, pour que ta classe Disque ait une réelle utilité.

:d) C'est la ligne 92, je vérifie plutôt si un anneau plus grand n'est pas posé sur un plus petit

Tu peux aussi utiliser des Piles, pour tes tours :)

:d) Pas encore vu les piles :-(

En tout cas un gros merci pour ta réponse et pour avoir pris le temps de lire et comprendre cette bouillie qui sert de code :rire:

Bunyan
Bunyan
Niveau 17
04 décembre 2018 à 07:58:57

En quoi les List sont mieux du coup ?

En déclarant par List<MonObjet> tu peux facilement changer le type concret derrière, sans compter que leur taille sont variables, à la différences des tableaux. Utiliser un tableau au lieu d'une List est du pouillème d'optimisation. Si tu es à l'octet prêt en RAM, ça va peut-être t'aider (et encore, j'ai un gros doute, vu comment m'a l'air de fonctionner la JVM).
Pour info, une ArrayList est un "simple" wrapper autour d'un tableau (d'où son nom) :)

C'est vrai que je me suis vraiment fait chier à les écrire celles là (surtout déplacerDisque). Ca pose pas de souci d'impriquer plusieurs méthodes dans une méthode ? Même si elle est aussi "petite" que celle là ?

Par contre je peux pas afficher les tours une par une ou alors il faudrait qu'elles soient à la verticale...

Alors, je ne comprends pas "imbriquer des méthodes". Basiquement, tu ne fais quasiment qu'invoquer des méthodes partout :)
Pour moi, une grande méthode est environs à partir de 100 lignes. Sauf si je ne peux réellement pas faire autrement, je préfère faire en sorte d'avoir plus de méthode (quitte à avoir un peu plus de difficulté durant le débuggage et une empreinte mémoire un peu plus conséquente) du moment que j'augmente la lisibilité, la testabilité et la maintenabilité.

Basiquement, pour moi, déplacerDisque ressemblerait à un truc comme ça :


    public static void deplacerDisque(Disque disque[], Tour tour[]) {
        int tourDepart = 0, tourArrivee = 0, disquePris = 0;
       
       tourDepart = selectionnerTourDepart();

       disquePris = prendreDisque(tourDepart);
       
       selectionnerTourCible(disquePris);
       
        }

Concernant partieTerminee :


    public static boolean partieTerminee(Tour tourDroite) {
        return tourDroite.getEmplacement(tourDroite.getTaille()-1) == 1
    }    

Pour la afficherTour à laquelle je pense :


    public static String afficherTours(Tour tour) {
       return tour.getEmplacement(tour.getTaille() + "";
    }

C'est la ligne 92, je vérifie plutôt si un anneau plus grand n'est pas posé sur un plus petit

OK, je n'avais pas bien compris ce test. Au temps pour moi.

JamereBurvelle
JamereBurvelle
Niveau 40
04 décembre 2018 à 11:22:35

Merci pour l'exemple, c'est vrai que c'est beaucoup plus clair comme ça... J'essaierai de faire un effort là dessus du coup !

Encore un gros merci pour ton aide !

Message édité le 04 décembre 2018 à 11:22:53 par JamereBurvelle
Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment