2010-02-23 2 views
3

Je crée un émulateur de jeu Blackjack Card. Je suis un SCJP, familier avec les concepts Core Java. J'ai une compréhension très basique de Java Swings et awt. Déjà terminé l'écriture de la logique de jeu de base, une logique CLI. Ma conception comprend plusieurs classes comme, concessionnaire, joueur, table, carte, casino et quelques autres .. Enums pour cartes et suite. J'ai lu sur MVC comme un concept théorique, familier avec le nom de «design patters» (aucune compréhension quelle qu'elle soit quant à la façon dont ils sont mis en œuvre) Partout où je suis suggéré d'apprendre en écrivant du vrai code.Alors j'ai commencé avec this ...Comment faire avec le vrai développement de l'interface graphique avec Java Swing et MVC

Je suis coincé maintenant, comment dois-je faire pour écrire du code pour mon projet ?? Ecrire le code de l'interface graphique et l'organiser dans le code existant.

+0

Je n'ai pas comprendre à quel MVC est implémenté en Java. :( –

+0

MVC ne nécessite pas d'implémentation dans la langue dans laquelle vous programmez. La seule condition requise est une séparation de concept lâche, c'est-à-dire le modèle, la vue et le contrôleur.Vous ne devez pas étendre un modèle ou une vue ou un contrôleur. –

Répondre

2

Il m'a fallu des années pour apprendre MVC (j'ai appris des choses incorrectes à ce sujet à l'université, et de plus, beaucoup de sources en ligne à l'époque avaient tort à ce sujet). Quoi qu'il en soit, le cœur de votre besoin est de ne pas avoir d'informations d'affichage dans votre modèle (c'est-à-dire, à quoi ressemble le joueur sur l'écran, le framebuffer, les polygones de vos modèles). Au lieu de cela, vous créez la vue et le modèle dans des espaces de noms distincts, puis utilisez des événements pour lier les deux ensemble. Lorsque cela se produit parfois dans votre modèle, la vue est notifiée et des modifications sont apportées à la vue. En outre, lorsque la souris est enfoncée ou qu'une touche est enfoncée, l'événement d'entrée est transformé en un autre événement orienté modèle qui peut prendre la forme d'un appel de méthode dans le modèle. Tous les changements dans le modèle sont ensuite réinjectés sur la vue. Rappelez-vous ceci: le modèle devrait être fonctionnel sans que la vue ne soit attachée, et ne devrait rien afficher sur l'écran pendant l'exécution (à l'exception peut-être des informations de débogage dans la console).

+0

Dans quelle classe devrais-je mettre mon code Gui ?? Avec autant de classes ... où gérer les événements ?? Comment décider? –

+0

À titre d'exemple Blackjack (modèle) et BlackJackApp (affichage) Vous pouvez attacher BlackJackApp au modèle (qui peut invoquer un JFrame ou quelque chose du genre) en utilisant le modèle notify/listener, et notifier la vue lorsque le modèle change (créer un gros écouteur) pour l'ensemble de l'état du jeu, au départ.) Ensuite, toutes les opérations standard dans la vue appellent simplement des méthodes dans le modèle, par exemple, Card [] getCards (Player p), showHand (Player p), w ith un événement comme onShowHand (Player p) notifiant la vue à travers l'auditeur. Vous pourriez vouloir une méthode next() dans le modèle qui fait avancer le jeu –

1

Voici un exemple simple de la façon dont cela pourrait être divisé.

Vraisemblablement, les cartes d'un joueur sont représentées comme une 'main' ou un objet similaire (c'est-à-dire une collection de cartes). Ceci est votre modèle. Appelons donc votre modèle:

package casino.blackjack.model; 
class DealtCards 
{..} 

Vous affichez vos cartes en utilisant peut-être un JPanel ou une autre construction Swing. Ainsi, vous pouvez mettre tous les objets qui font réellement le rendu de chaque carte dans un paquet séparé:

package casino.blackjack.view; 
class DealtCardsView 
{..} 

Les existe indépendamment de l'objet DealtCards comment il est affiché, mais son état peut changer si un utilisateur fait quelque chose sur la GUI. Par exemple, demander à être «touché». Vraisemblablement, il pourrait y avoir un bouton pour le faire. La vue est dérivée de votre modèle. Maintenant, si un joueur décide de frapper, son objet DealtCards change. Nous voulons donc implémenter une manière de mettre à jour votre modèle. Vous pouvez le faire en utilisant une classe de contrôleur. La classe de contrôleur implémente l'interface ActionListener. Lorsqu'une action est effectuée (c'est-à-dire que l'utilisateur clique sur le bouton "hit"), le contrôleur met à jour le modèle. La vue ne peut donc pas mettre directement à jour le modèle. Il envoie juste une notification qu'une «action» s'est produite. Toute partie intéressée, en l'occurrence notre contrôleur, peut alors prendre les mesures appropriées.

package casino.blackjack.controller; 
class DealtCardsController implements ActionListener 
{ 
    DealtCards cards; 
    DealtCardsView cardView; 
    public DealtCardsController(DealtCards myHand, DealtCardsView myView) 
    { 
    cards = myHand; 
    cardView = myView; 
    cardView.hitMeButton.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) 
    { 
    cards.changed(); 
    } 
} 

Vous divisez donc votre application en trois couches. Votre modèle contient uniquement l'état actuel (ou les données actuelles) et toute validation qui le contourne. Vos classes d'affichage rendent le modèle de manière appropriée. Toute interaction de l'utilisateur, sur la vue, est gérée par le contrôleur, dont la responsabilité est alors de mettre à jour le modèle.De cette façon, si vous voulez changer votre vue, (dis utiliser une applet au lieu d'une fenêtre) votre modèle s'en fout.
Désolé pour la réponse longue et sinueuse, mais espérons que cela aide un peu!

EDIT: Une belle explication MVC ici: java/gwt UI coding - clean code

Questions connexes