Comment structurez-vous un programme java?


Depuis un certain temps, j'essaie de faire un simple "jeu" en Java qui n'est vraiment qu'une applet avec un carré et une grille. Ce que je veux faire au final c'est l'utilisateur clique sur le carré va se déplacer à l'endroit où l'utilisateur a cliqué arrondie au carré de la grille.

Le problème est que je suis un débutant autodidacte et que j'ai du mal à comprendre comment structurer réellement le programme, quelques exemples:

  • devrais-je avoir une classe distincte écoutant la souris clics?
  • Lorsque je reçois un clic, dois-je l'envoyer à un autre objet qui représente la boîte et le laisser décider ce qu'il veut faire ou simplement appeler une fonction qui fait bouger la boîte?

Je veux vraiment apprendre tout cela "quand utiliser quoi" pour moi-même afin que tous les liens ou conseils généraux soient appréciés.

Author: Ed Altorfer, 2010-01-06

8 answers

Ce que vous demandez vraiment, c'est comment développer un jeu, ce qui est particulièrement différent d'une application Java typique. Cependant, je vais vous donner quelques idées pour au moins vous orienter dans la bonne direction.

  • Profitez du fait que Java est un langage orienté objet. Autrement dit, les objets devraient chacun avoir leur propre responsabilité .
  • Séparez votre jeu en trois couches clés: la couche application, la couche logique du jeu et la présentation couche.

    • La couche application doit contenir tous vos assistants et sous-systèmes génériques, des choses comme les générateurs de nombres aléatoires, les analyseurs de texte, les modules d'accès aux fichiers, les chargeurs de maillage, etc.
    • La couche logique du jeu doit implémenter toutes les règles de votre jeu et être responsable du maintien de l'état canonique. Fondamentalement, lorsque vous appuyez sur le " W " sur le clavier pour avancer, la couche logique de jeu devrait recevoir MOVE_FORWARD_REQUEST de l'interface utilisateur.
    • La couche de présentation doit être responsable de deux choses: obtenir des entrées et rendre votre monde. Lorsqu'il reçoit une entrée, comme la clé "W", il doit la mapper à une action et l'envoyer à la couche logique du jeu à traiter. Ensuite, il devrait rendre le monde en fonction de ce que la logique du jeu lui a dit de faire.

Le développement de jeux est évidemment un domaine entier avec de nombreux livres qui lui sont dédiés. Un de mes favoris est Game Coding Complete , qui se concentre sur C / C++, mais devrait vous donner un bon idée sur la façon dont vous devez structurer votre jeu.

Bonne chance!

 7
Author: Ed Altorfer, 2010-01-06 15:33:06

Un principe fondamental du bon développement logiciel est le principe de responsabilité unique . Il indique qu'une fonction ou une classe ne doit avoir une responsabilité.

De cette façon, vos classes et objets ne devraient pas devenir trop gros et ingérables.

 5
Author: Ikke, 2010-01-06 15:26:24

Je pense que l'un des concepts les plus importants à maîtriser lors du développement de logiciels est le concept ou Orthogonalité. Ce n'est pas la définition la plus simple, mais cela signifie essentiellement qu'un composant (comme la lecture des clics de souris) ne doit pas être directement lié à un composant non lié (déplacer un carré à l'écran).

Dans votre cas, les clics de souris de lecture de code doivent être séparés du code qui déplace réellement la boîte. Que vous l'implémentiez en tant que classes internes / anonymes ou non, c'est à vous. Mais si vous suivez le principe d'Orthogonalité, il sera facile de changer à une date ultérieure si vous changez d'avis.

 1
Author: Jason Nichols, 2010-01-06 15:30:45

Un problème ici est que toutes les règles ont une certaine marge de manœuvre où vous devez utiliser votre propre jugement.

Par exemple, l'application que vous décrivez maintenant me semble si simple que je le ferais probablement dans une seule classe, avec peut-être quelques classes imbriquées, peut-être anonymes. En tout état de cause, je pourrais faire un cas décent pour adapter le tout dans un seul fichier source, affirmant que plusieurs fichiers source augmenteraient en fait la complexité de l'ensemble chose.

Mais si votre interface graphique avait un certain nombre de contrôles différents, chacun contrôlant peut-être un comportement différent, il deviendrait temps de diviser la fonctionnalité afin que vous ne vous retrouviez pas avec un gros bol de code spaghetti.

Les bibliothèques Java GUI essaient de séparer naturellement (view+controller) du model. Vous êtes encouragé à définir et à afficher l'interface graphique dans un module (= fichier) mais à avoir votre modèle de données et peut-être votre fonctionnalité dans un autre. Pour les interfaces graphiques compliquées, il peut également y avoir plusieurs modules d'implémentation GUI maintenus ensemble par code.

Une façon de garder les choses "propres" est de travailler dans des "calques" où chaque calque "ne sait" que ce qu'il doit savoir. Pour être spécifique, la couche GUI doit connaître l'existence de ses modèles sous – jacents-tables et listes et autres choses n'ont pas besoin d'être connectées à TableModels et ListModels, etc. Il n'a cependant pas besoin de connaître les détails de ces modèles, il peut donc simplement se référer à ces modèles par interface.

La couche modèle, sur le d'autre part, besoin de ne rien savoir sur l'interface graphique. Moins il en sait, mieux c'est, et cela vous permettrait théoriquement d'échanger des interfaces graphiques sans avoir besoin de toucher les modèles.

Mon modèle peut également contenir ActionListener s pour répondre aux actions entreprises par exemple en appuyant sur des boutons dans l'interface graphique.

Bien sûr, les actions et les modifications apportées au modèle entraînent souvent des modifications de l'interface graphique. Comment communiquer ces modifications à l'interface graphique si la couche modèle ne connaît pas l'interface graphique? Vous pouvez utiliser un haricot lié propriétés ici. Voici un court tutoriel: http://www.javalobby.org/java/forums/t19476.html . Vous avez donc le même type de structure: les changements se produisent dans votre modèle, ils sont communiqués aux beans avec le support de changement de propriété dans le modèle, et l'interface graphique peut attacher des écouteurs à ces propriétés pour découvrir quelque chose de changé.

Si vous effectuez des actions réelles et efficaces (par exemple, écrire des fichiers, convertir des données, etc.) dans votre code de modèle ou si vous divisez le " traitement" le code dans un autre module dépend de vous et dépendra à nouveau de l'encombrement de votre modèle. S'il y a une petite poignée de champs et de méthodes qui se sentent seuls, vous pouvez décider d'écraser les choses ensemble, mais au moment où cela commence à paraître désordonné, vous voudrez refactoriser votre code de traitement dans son propre module. Le traitement ressemble au type de module qui ne veut pas non plus connaître les autres modules; vous pouvez simplement appeler ses méthodes à partir du modèle niveau.

J'ai décrit mon style de base pour faire le développement de l'interface graphique. Il existe certainement d'autres recommandations, et vous développerez probablement votre propre style en fonction de votre expérience. C'est juste destiné à vous donner une idée et un point de départ possible.

 1
Author: Carl Smotricz, 2010-01-06 15:45:37

... l'utilisateur clique et le carré se déplace à l'endroit où l'utilisateur a cliqué arrondi, au carré de grille le plus proche.

Voici un exemple de faire cela dans une vue à l'échelle.

 1
Author: trashgod, 2016-09-12 18:29:11

Étape 1 - trouvez les applets de démonstration fournis par Sun. http://java.sun.com/applets/jdk/

Étape 2 - lisez ces applets de démonstration. Au moins trois. De préférence, chacun d'entre eux.

Si vous avez lu plusieurs applets, vous devriez voir un peu plus clairement comment organiser les programmes. Vous pouvez ensuite poser des questions avec beaucoup plus de concentration pointant vers des exemples d'applet spécifiques et votre problème de programmation spécifique.

 0
Author: S.Lott, 2010-01-06 15:30:48

Ouais, je suis moi-même un programmeur débutant. Oui, la séparation des fonctionnalités entre plusieurs classes est un bon moyen de réduire la complexité et d'augmenter la cohésion des classes individuelles.

Augmenter la cohésion est bon car en ayant une structure de données plus complexe, vos algorithmes deviennent moins complexes et votre code est moins dépendant les uns des autres.

Par exemple, dans votre cas, il pourrait être judicieux de séparer les classes conformément à MVC (Model View Controler ).

  • Vous avez un modèle qui représente la façon dont vos données de jeu sont structurées.
  • Vous avez une visionneuse qui présente votre Modèle sous la forme que vous voulez.
  • Avoir un contrôleur qui capte les changements dans le modèle (via les écouteurs) puis met à jour la visionneuse

Vous pouvez maintenant modifier votre modèle et ajouter des fonctionnalités supplémentaires ne nécessitant que de petites modifications dans le fonctionnement de la visionneuse.

Il y a beaucoup de Modèles, mais il y n'est pas une règle difficile quand utiliser l'un sur l'autre. Il y a certains cas dans lesquels vous pouvez en utiliser plusieurs et il y a des cas dans lesquels vous devrez choisir un modèle de conception plutôt que l'autre.

 0
Author: Daniel Fath, 2010-01-06 15:35:31

Chaque programmeur Java débutant doit commencer par les tutoriels Sun. Ils sont très bons.

Une autre bonne source, en particulier parmi les sources libres, est "Thinking in Java" de Bruce Eckel, disponible à partir de http://www.mindview.net/Books/TIJ/.

Mais ce dernier est un peu daté par rapport au premier. C'est pourquoi je recommande à la fois.

 0
Author: Matt J., 2010-01-06 17:13:38