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

C# Discussion :

Architecture du programme/Communication entre l'interface et les classes


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Etudiant en maths sup
    Inscrit en
    Novembre 2011
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Etudiant en maths sup

    Informations forums :
    Inscription : Novembre 2011
    Messages : 31
    Points : 15
    Points
    15
    Par défaut Architecture du programme/Communication entre l'interface et les classes
    Bonjour,

    Je reprends en ce moment un projet que j'avais laissé de côté car j'arrivais à une partie que je ne savais absolument pas faire.
    Il s'agit d'un jeu de poker, avec une IA. J'avais codé entièrement le moteur de jeu, manque plus que l'interface, et l'IA, mais je ne sais pas comment faire un programme propre et faire communiquer mes différentes parties ensemble...

    Par exemple dans ma classe Program.cs, j'ouvre une fenêtre Form, et j'aimerais afficher des infos dans un label, mais je ne sais pas comment changer le texte de mon label en dehors de celui-ci... (à partir de la classe Program où est créé le Form).
    Sinon dans ma classe Program je crée plusieurs Joueurs, ensuite je crée une Table qui contient ces Joueurs, pour ensuite démarrer une partie (fonction disponible dans ma classe Table), au cours de cette partie, j'aimerais solliciter les joueurs et leur demander de prendre une décision, quand c'est leur tour de jouer, via l'interface graphique (boutons suivre, coucher, etc...) et je ne sais pas comment faire communiquer ma classe joueur avec l'interface graphique non plus...

    J'espère que vous avez compris ce que je cherchais à faire, toute piste pour m'aider sera appréciée.

    Merci d'avance !

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    et j'aimerais afficher des infos dans un label, mais je ne sais pas comment changer le texte de mon label en dehors de celui-ci... (à partir de la classe Program où est créé le Form).
    Exemple pour modifier le label d'une Form depuis le Program.cs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label temp = maForm.Controls["lblLogin"] as Label;
    où maForm est la form créée (et donc utilisée) dans Program.cs

    et je ne sais pas comment faire communiquer ma classe joueur avec l'interface graphique non plus...
    Un peu plus d'infos sur ce que tu entends par "communiquer" ?
    "Hope for the best, but prepare for the worst."

  3. #3
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    petite précision sur la réponse de casii sur le Label : par défaut, quand tu ajoutes des contrôles depuis le designer, ils sont insérés en "private" (et donc inaccessibles depuis ta class Program). Il faudra donc aller dans ton fichier MaForm.Designer.cs pour les passer en "public".

    Pour la suite, comme casii : il nous faut plus de précision.
    Au fait c'est du client/server ou une appli locale (single player vs IA) ?
    Plus je connais de langages, plus j'aime le C.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    petite précision sur la réponse de casii sur le Label : par défaut, quand tu ajoutes des contrôles depuis le designer, ils sont insérés en "private" (et donc inaccessibles depuis ta class Program). Il faudra donc aller dans ton fichier MaForm.Designer.cs pour les passer en "public".
    Je n'appelle pas le contrôle comme une propriété de la Form (qui, comme tu dis, n'est pas possible à cause de sa visibilité) mais je cherche dans la liste des contrôles que possède la Form, qui elle, connaît ses différents contrôles (mais je ne suis vraiment pas sûr que ce soit la meilleure solution).
    "Hope for the best, but prepare for the worst."

  5. #5
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    J'ai lu trop rapidement ton message, mon erreur

    J'ai jamais utilisé cet indexer, ça fonctionne si le contrôle n'est pas de "top niveau" (contenu dans un autre contrôle) ?
    Plus je connais de langages, plus j'aime le C.

  6. #6
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par jopopmk Voir le message
    J'ai jamais utilisé cet indexer, ça fonctionne si le contrôle n'est pas de "top niveau" (contenu dans un autre contrôle) ?
    C'est une bonne question...
    "Hope for the best, but prepare for the worst."

  7. #7
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Je viens de tester et malheureusement ça ne fonctionne pas si le label est contenu, par exemple, dans un panel.
    Mais si on connait l'enchaînement ta méthode est quand même envisageable avec un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Controls["panel1"].Controls["label1"].Text = "trukshoz";
    Plus je connais de langages, plus j'aime le C.

  8. #8
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    oui enfin le plus propre est de fournir une méthode ou une proprité qui dans son setter (ou dans le cors de la méthode) ira mettre la bonne info
    au bon endroit.

    Vaut mieux éviter de faire avec les Controls[] car si tu changes, ça sera le bordel...

    et pis, si un jour, tu veux mettre autre chose qu'un label ca sera plus simple à gérer dans la classe de la forme plutôt que dans l'appelant !!!
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2008
    Messages
    233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Janvier 2008
    Messages : 233
    Points : 336
    Points
    336
    Par défaut
    Citation Envoyé par theMonz31 Voir le message
    oui enfin le plus propre est de fournir une méthode ou une proprité qui dans son setter (ou dans le cors de la méthode) ira mettre la bonne info
    au bon endroit.

    Vaut mieux éviter de faire avec les Controls[] car si tu changes, ça sera le bordel...

    et pis, si un jour, tu veux mettre autre chose qu'un label ca sera plus simple à gérer dans la classe de la forme plutôt que dans l'appelant !!!
    Désolé, c'est mon côté "ASP.NET" qui ressort là

    Le mieux en effet de mettre une propriété "public" avec get et set sur le label "private" (et non pas changer l'accessibilité dans le designer)
    "Hope for the best, but prepare for the worst."

  10. #10
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour

    pour un game il te faut un class static MainGame qui gere tout cela savoir:
    -un form modal Splash de bienvenue pour demarrer le jeu
    -un form modal GameOver qui affiche si on Over
    -un form PlateauJeu de jeu( ou GameField des joueurs)

    Plus un
    - ton class GameEngine (moteur)
    - class JoueurPoker( Player)
    - ton eventuel class AI
    Le gros du travail du class MainGame consiste à affiche le Splash et à l'appui du button Start (avec prop dialogresult=ok) à lancer le jeu:
    -affichage de WinPLateau
    -tant que GameEngine not Over la boucle While interne tourne indefiniment..
    -sinon GameOver s'affiche pour nous discrediter ...et on repart car la boucle While principale voit toujours dialogresult=ok
    -si l'user ferme WinPlateau on sort du While principal...(par defaut dialogresult=cancel) ..et on quitte le jeu...

    code behind de

    du class JoueurPoker:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace WinGame
    {
        public class JoueurPoker
        {
            public bool IsComputer = true; // Defaults To Computer-Controled JoueurPoker
            public bool IsDead = false;    // Defaults To Alive 
     
            public CompassDirections  Direction { get; set; }
            public int ID { get; set; }
        }
    }
    du class GameEngine:
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace WinGame
    { 
        public enum CompassDirections
        {
                North = 1,
                NorthEast = 2,
                East = 3,
                SouthEast = 4,
                South = 5,
                SouthWest = 6,
                West = 7,
                NorthWest = 8
        }
        public class GameEngine
        {
            public JoueurPoker  Player1 = new JoueurPoker();
     
            //Controls The Game End
             public bool GameOver ;
             public bool Paused;
     
             public GameEngine()
             {
                 Player1.ID = 1;
                 Player1.Direction = CompassDirections.East;
                 Player1.IsComputer = false;
             }
            }
    }
    du form Splash:
    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinGame
    {
        //form modal de bienvenue avecun button Start (mettre sa prop DialogResult =OK)
     
        public partial class Splash : Form
        {
            public Splash()
            {
                InitializeComponent();
            }
        }
    }
    du form GameOver
    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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinGame
    {
        //form modal avec un bouton OK (mettre sa prop DialogResult =OK)
        public partial class GameOver : Form
        {
            public GameOver()
            {
                InitializeComponent();
            }
     
            private void GameOver_Load(object sender, EventArgs e)
            {
               this.label1.Text = MainGame.engine.Player1.ToString();
               this.label2.Text = MainGame.engine.Player1.IsComputer==true ?"Human":"Computer"; 
     
            }
     
     
        }
    }
    du form PlateauJeu :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinGame
    {
        //appele aussi GameField
        public partial class PlateauJeu : Form
        {
            public PlateauJeu()
            {
                InitializeComponent();
                this.label1.Text ="Player"+ MainGame.engine.Player1.ID.ToString() ;
                this.label2.Text = MainGame.engine.Player1.IsComputer.ToString();
            }
     
     
            private void GameField_Activated(object sender, EventArgs e)
            {
                Application.DoEvents();
            }
            private void GameField_Deactivate(object sender, EventArgs e)
            {
                 //Pauses The Game If It Looses The Focus
                MainGame.engine.Paused = true;
                this.Text = ".Netterpillars - Press ESC To Continue";
            }
             private void GameField_FormClosing(object sender, FormClosingEventArgs e)
            {
                MainGame.engine.GameOver = true;
            }
            private void GameField_KeyDown(object sender, KeyEventArgs e)
            {
                    //' Just Set The Next Direction For The Player.
                    //            '  We Will Not Let The Player Go Backwards From The Current Direction, Because
                    //            '    He Would Die If He Does So, And May Not Understand Why He Died, What Would Not Be A Good Game Practice...
                switch(e.KeyCode)
                {
                    case Keys.Right :
     
                            MainGame.engine.Player1.Direction = CompassDirections.East;
                            label1.Left += 5;
     
     
                        break;
     
                    case  Keys.Left :
     
                            MainGame.engine.Player1.Direction = CompassDirections.West;
                            label1.Left -= 5;
     
                        break;
                    case Keys.Escape:
                        MainGame.engine.Paused = !MainGame.engine.Paused;
                        if( MainGame.engine.Paused)
                        {
                            this.Text = ".Netterpillars - Press ESC To Continue";
                        }
                        else
                        {
                            this.Text = ".Netterpillars";
                        }
                        break;
                }
     
     
            }
     
     
     
     
     
        }
    }
    et notre chef MainGame:

    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
     
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
     
    namespace WinGame
    {
        static class MainGame
        {
            public static  GameEngine engine;
            public static void StartGame()
            { 
                Splash WinSplash ;
                PlateauJeu WinPlateau ;
                GameOver   WinGameOver ; 
     
                 // Create The Game Engine Object
                engine = new GameEngine();
                WinSplash = new Splash();
                WinGameOver = new GameOver();
                while (WinSplash.ShowDialog() == DialogResult.OK)
                {
                        WinPlateau = new PlateauJeu();
                        WinPlateau.Show();
                        Application.DoEvents();
                        while (!engine.GameOver)
                        {
                            //le travail de GameEngine se fait ici
                            //par ses methodes
     
                            Application.DoEvents();
                        }
                        WinGameOver.ShowDialog();
                        WinPlateau.Dispose();       
    	        }
     
                engine = null;
                WinSplash.Dispose();
                WinGameOver.Dispose();
            }    
     
     
        }
    }
    et dans ton class program.cs qui demarre l'application c'est lui qui remplace le fameux
    Application.Run(new Form1());

    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
     
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Windows.Forms;
     
    namespace WinGame
    {
        static class Program
        {
            /// <summary>
            /// Point d'entrée principal de l'application.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                //Application.Run(new Form1());
                MainGame.StartGame();
            }
        }
    }
    Bon code...

  11. #11
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Pour rester sur le sujet des accesseurs, perso si je fais pas une lib (statique ou dynamique) et qu'aucun traîtement n'est fait lors des get/set, alors je passe l'attribut en public, aucune utilité d'ajouter une couche d'appel pour rien à mon sens. Et pourtant je suis fan des accesseurs (mais en général ils ne sont pas liés directement à un attribut). Fin du HS
    Plus je connais de langages, plus j'aime le C.

Discussions similaires

  1. [Débutant] communication entre 2 interfaces
    Par Wsert dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 20/02/2015, 21h33
  2. Réponses: 1
    Dernier message: 27/06/2011, 18h27
  3. communication entre des interfaces
    Par pedro22926 dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 24/04/2010, 16h51
  4. communication entre 2 webapps via les contextes
    Par clement42 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 01/12/2006, 13h33
  5. Réponses: 6
    Dernier message: 28/02/2004, 09h19

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