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

Contribuez Java Discussion :

Programmez un jeu du serpent avec Java [Tutoriel]


Sujet :

Contribuez Java

  1. #1
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut Programmez un jeu du serpent avec Java
    Bonjour,

    L'article programmez un Snake avec Java2D est en ligne, n'hésitez pas à poster vos avis.

    Merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 858
    Points : 218 575
    Points
    218 575
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je lit l'article en travers, pour apprendre a faire un affichage dans Java.
    Mais j'ai remarque, dans la section "L'affichage du serpent" que le code suivant:
    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
     
    public class Case implements Constantes {
     
          private int xIndice;
          private int yIndice;
     
          public Case(int xIndice, int yIndice) {
                this.xIndice = xIndice;
                this.yIndice = yIndice;
          }
     
          // indice horizontal
          public void setIndiceX(int x) {
                this.xIndice = x;
          }
     
          // indice horizontal
          public int getIndiceX() {
                return this.xIndice;
          }
     
          // indice vertical
          public void setIndiceY(int y) {
                this.yIndice = y;
          }
     
          // indice vertical
          public int getIndiceY() {
                return this.yIndice;
          }
     
          // coordonnée horizontale en pixels
          public int getX() {
                return this.xIndice * CASE_EN_PIXELS;
          }
     
          // coordonnée verticale en pixels
          public int getY() {
                return this.yIndice * CASE_EN_PIXELS;
          }
     
          public int getLargeur() {
                return CASE_EN_PIXELS;
          }
     
          public int getHauteur() {
                return CASE_EN_PIXELS;
          }
     
    }
    Le "xIndice" et "yIndice" ne necessite ni getter, ni setter, si on les met en public.
    En fait, si vous faites un getter et setter ... pourquoi ne pas mettre en public? car cela reviendrai au meme (sauf que vous gagnez un appel, et puis vous faites votre code encore plus lisible )

    Voila tout
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    L'ajout de getter/setter pour l'attribut d'une classe fait partie des bonnes pratiques fortement répendu dans le monde java.
    Ces pratiques ne sont pas forcément très utiles dans tous les cas mais ont le mérite de produire un code qui est toujours semblable d'un projet à l'autre et qui par conséquent, sera plus facilement lisible et maintenable (surtout lorsque l'on doit reprendre le code d'autre personne) lorsque ces pratiques sont partagé par le plus grand nombre.
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  4. #4
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Tu n'as pas prévu une version pdf de ton article ?
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  5. #5
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Bonjour,

    Et bien non... l'article à été directement écrit en HTML.

  6. #6
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Ah bon ? Sans passer par l'éditeur ? pourquoi ?
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  7. #7
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Alors je viens carrément de dévorer ton article et je trouve qu'il est super. Toutefois j'ai quelques propositions que j'espère constructives.

    * Utilise du franglais : "estValide" --> "isValide"

    * Utilise les enum pour éviter de faire des switch, par exemple dans la méthode getNextCase() je te propose un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private Case getNextCase() {
      Case tete = ...
     
      Case next = this.direction.getNext(tete);
    }
    Et c'est dans l'enum que tu fait le cas...

    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
     
    enum Direction {
     
      VERS_LE_HAUT(0, 1);
      VERS_LA_DROITE(1, 0),
      VERS_LE_BAS(0, -1),
      VERS_LA_GAUCHE(-1, 0);
     
      final int horizontalChange;
      final int verticalChange;
     
      public Direction(int horizontal, int vertical) {
        this.horizontalChange = horizontal;
        this.verticalChange = vertical;
      }
     
      public Case getNext(final Case old) {
        return new Case(old.getXIndice() + horizontalChange, old.getYIndice() + verticalChange);
      }
     
    }
    * Pense à factoriser ton code, ex: even.getKeyCode()...

    * Tu lance getNextCase() trop de fois. Ca devrait être lancé une seule fois.

    * C'est quoi les valeurs 2 et 4 dans la méthode affichage() de grenouille ?

    * Perso j'aurais utilisé des exceptions pour le game over, genre GameOverException, et éventuellement j'aurais créé SerpentMortException extends GameOver et BordureException extends GameOver...

    Et surtout :

    * une grenouille, c'est plutôt vert, non ?
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  8. #8
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    3 points encore :

    * Pourrais-tu expliquer un peu pourquoi 40fps ?

    * A chaque itération de la boucle, tu appelles repaint() et si j'ai bien compris, ça va donc vider l'écran (ie. la zone d'affichage du jeu) puis tout redessiner. Comment faire pour ne dessiner que les pixels qui ont changé ?

    * Dans l'article tu te mélanges entre getXIndice et getIndiceX... Je suppose que tu as du le réécrire en cours de route.
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  9. #9
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Bonjour,

    Merci de t'intéresser à mon travail, et pour tes remarques pertinentes.

    Citation Envoyé par thierryler Voir le message
    Alors je viens carrément de dévorer ton article et je trouve qu'il est super.
    Et bien merci, ça fait plaisirs
    Citation Envoyé par thierryler Voir le message
    Ah bon ? Sans passer par l'éditeur ? pourquoi ?
    De quel éditeur parle-tu ? J'ai l'habitude d'écrire du HTML/CSS et cela ne me pose pas de problème.
    Citation Envoyé par thierryler Voir le message
    Pourrais-tu expliquer un peu pourquoi 40fps ?
    D'expérience, c'est une bonne vitesse pour pouvoir faire des animations sympa.
    Citation Envoyé par thierryler Voir le message
    Comment faire pour ne dessiner que les pixels qui ont changé ?
    Il existe une méthode repaint avec des arguments permettant de spécifier une zone à repeindre. Mais dans le cas présent, cela n'offre pas d'intérêt pratique.
    Citation Envoyé par thierryler Voir le message
    Dans l'article tu te mélanges entre getXIndice et getIndiceX
    Oui, l'article a été réécrit plusieurs fois, de même que le code, et c'est une erreur que je corrigerais, merci.
    Citation Envoyé par thierryler Voir le message
    Utilise du franglais : "estValide" --> "isValide"
    Oui, c'est encore une erreur. J'ai fait l'effort d'écrire des noms de méthode en français, j'ai plus l'habitude de les écrire en anglais. Pareil, le changement a été incomplet, je corrigerais aussi.
    Citation Envoyé par thierryler Voir le message
    Utilise les enum pour éviter de faire des switch
    Ca ne changerait pas grand chose, mais le code est plus clair me semble-t-il avec un simple switch...
    Citation Envoyé par thierryler Voir le message
    Tu lance getNextCase() trop de fois. Ca devrait être lancé une seule fois.
    Je suis d'accord, mais dans ce cas, cela n'a pas d'importance, c'est une optimisation.
    Citation Envoyé par thierryler Voir le message
    Pense à factoriser ton code, ex: even.getKeyCode()
    Toujours d'accord, mais c'est aussi une optimisation. Bon, elle est grosse celle là, j'en conviens.
    Citation Envoyé par thierryler Voir le message
    C'est quoi les valeurs 2 et 4 dans la méthode affichage() de grenouille ?
    C'est pour afficher un rectangle plus petit que ceux du serpent, pour une raison esthétique lorsque la grenouille apparait sur le serpent. Mais j'aurais pu écrire une phrase pour le dire.
    Citation Envoyé par thierryler Voir le message
    Perso j'aurais utilisé des exceptions pour le game over, genre GameOverException, et éventuellement j'aurais créé SerpentMortException extends GameOver et BordureException extends GameOver...
    Je ne suis pas d'accord. Les exceptions ne sont pas faites pour gérer le flux "naturel" du programme.
    Citation Envoyé par thierryler Voir le message
    une grenouille, c'est plutôt vert, non ?
    Lol. Hé bien je suis daltonien, alors je pense toujours que les autres le sont aussi A moins que ce ne sois par anti-conformisme

  10. #10
    Rédacteur
    Avatar de thierryler
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 078
    Points : 12 815
    Points
    12 815
    Par défaut
    Je parle de l'éditeur d'article de developpez, qui permet de générer automatiquement le layout et le pdf, etc.

    Pour le switch, l'idée est surtout d'éviter de faire un switch, d'autant que le code peut être déterminé par simple calcul.

    Pour le 2 et le 4, du coup tu peux faire une constante comme pour la taille du serpent

    Pour les exceptions, je te propose un DepassementDeBordureException completée par un GameOverEvent
    Thierry Leriche-Dessirier
    Consultant Java JEE Web Agile freelance
    Rédacteur pour Developpez
    Professeur de Génie Logiciel à l'ESIEA

    Site : http://www.icauda.com / Linked'in : http://www.linkedin.com/in/thierryler / Twitter : @ThierryLeriche

  11. #11
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Citation Envoyé par thierryler Voir le message
    Je parle de l'éditeur d'article de developpez, qui permet de générer automatiquement le layout et le pdf, etc.
    Cet outil, malheureusement, semble ne pas fonctionner avec Eclipse/Linux (ou certaines config), d'autres personnes ont le même problème. Apparemment, il n'y a pas de solution postée sur le forum. Pour le moins, je n'ai pas eu envie de passer trop de temps sur ce point, sans garantie de fonctionnement à la clef. En outre, l'article existait déjà en HTML.

    Citation Envoyé par thierryler Voir le message
    l'idée est surtout d'éviter de faire un switch
    Oui, ta façon de faire est sans doute meilleure. Mais en revanche je trouve l'utilisation du swicth plus simple : l'article s'adresse aussi à ceux qui débutent. Comme cela ne remet aucunement le fonctionnement du jeu en question, et que l'utilisation du switch n'est pas abominable, je préfère que le code reste le plus simple possible.

  12. #12
    Rédacteur

    Avatar de Mickael Baron
    Homme Profil pro
    Ingénieur de Recherche en Informatique
    Inscrit en
    Juillet 2005
    Messages
    14 974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche en Informatique
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2005
    Messages : 14 974
    Points : 73 024
    Points
    73 024
    Par défaut
    Bonjour visiwi,

    J'ai parcouru un peu ton article, c'est très intéressant et bien écrit. Les illustrations sont placées au bon endroit.

    C'est dommage que tu ne puisses pas utiliser les outils pour placer ton article sous le gabarit Developpez.com.

    Mickael
    Responsable Java de Developpez.com (Twitter et Facebook)
    Besoin d"un article/tutoriel/cours sur Java, consulter la page cours
    N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
    --------
    Ingénieur de Recherche en informatique au LIAS / ISAE-ENSMA
    Page de Developpez.com : mbaron.developpez.com
    Twitter : www.twitter.com/mickaelbaron
    Blog : mickael-baron.fr
    LinkedIn : www.linkedin.com/in/mickaelbaron
    DBLP : dblp.uni-trier.de/pers/hd/b/Baron:Micka=euml=l

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    C'est vraiment un super article, merci !

Discussions similaires

  1. [Article en ligne] Programmez un jeu du serpent avec Java
    Par visiwi dans le forum Contribuez
    Réponses: 6
    Dernier message: 10/11/2010, 08h53
  2. Programmer un jeu (space invader) avec Java Micro Edition
    Par Alain Defrance dans le forum Java ME
    Réponses: 5
    Dernier message: 16/06/2009, 21h21
  3. [Article] Programmer un jeu (space invader) avec Java Micro Edition
    Par Alain Defrance dans le forum Contribuez
    Réponses: 2
    Dernier message: 09/06/2009, 23h02

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