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 :

Débutant (jeu d'échec) problème d'affichage et de vérification


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Débutant (jeu d'échec) problème d'affichage et de vérification
    Bonjour,
    Je dois faire un jeu d'échec et je suis quelque peu callé devant 2 problèmes majeurs.
    Premièrement celui de l'affichage, je n'ai jamais compris réellement les tenants et aboutissants des différantes manière d'afficher une image et j'ai utilisé la procédure que vous verrez dans le code. Pour ce qui est de l'explication rapide de mon jeu. J'ai défini une classe pour chaque type de pièce(en la faisant hériter d'une classe pièce), possèdant deux méthodes virtuelles Afficher, Deplacement. La seconde renvoyant un booléen après deux Mousedown pour dire si le déplacement voulu est bel et bien valide. flag gère le mousedown il passe a true si on a cliqué sur une pièce de la couleur qui doit bouger et cflag retenant la dernière couleur ayant effectuer un mouvement. Sahmat n'étant la que pour dire si nous ne sommes pas encore en échec et math.
    Maintenant j'en viens à mes problèmes.
    Lors du déboguage il survient 2 problèmes majeur. Le premier c'est que dès que l'évènement mousedown intervient toutes mes pièces disparaissent. J'utilise la méthode Invalidate pour forcer l'évènement Paint. Ou sont mes erreurs ? Dans l'évènement Paint, ou dans l'appel d'Invalidate. Je précise que chacune de mes pièces possède une pictureBox.
    Le second problème est encore plus désagréable et incompréhensible et c'est pour cela que j'attends avec impatience votre aide ( je vous remercie d'ailleurs de lire mon appel au secours). Lorsque je démarre une nouvelle partie et que je fais un mousedown sur un pion blanc et que je fais un mouvement valide Le programme plante en m'envoyant NullReferenceException à la ligne de code suivante
    Occupmat etant ma matrice de pièce(xx,yy) les coordonnées d'origine et (xxx,yyy) la case de destination.
    if (Occupmat[xx, yy].Deplacement(xx, yy, xxx, yyy,Occupmat) == false)
    Si lors du début de la partie je clique sur un pion noir. La meme NUllReferenceException survient lors de la ligne
    (this.Occupmat[xx,yy].coul != cflag)
    Ou est mon erreur? Merci d'avance à tout ceux qui sont arrivés jusqu'à ce stade de lecture car je dois dire que je suis totalement dans le brouillard
    Bonne journée
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Bonjour,

    Je pense que tu devrais séparer les classes logique du des composants graphiques. Pour moi tes classes Piece, Cavalier, fou, pion ressemble plus à des classes logiques. Je pense d'ailleurs que ces classes doivent pouvoir utilisée sans avoir besoin d'une interface graphique pour supprimer toute dépendance à certains composants.

    Tu peux aussi découper ton application en plusieurs fichiers:
    1 classe -> 1 fichier, c'est plus lisible et plus facile à gérer.

    Aussi pense bien à appeler la méthode Dispose sur les objets de type Graphics. Le GC peut le faire mais c'est toujours mieux de l'appeler directement ça lui enlève du travail.

    Pour ton erreur NullReferenceException, il y a un problème d'instanciation tu essaye d'utiliser un objet qui n'a pas encore été créé (dont la valeur est définie à null)

    Pour les PictureBox, D'après ce que j'ai et sauf erreur de ma part, tous tes objets utilisent le même composant l'origine du problème vient peut être de la ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Le problème c'est que j'ai quelque (voire beaucoup de)lacune basique en c# je vois plus ou moins ce que tu veux dire pour l'affichage mais je ne vois pas comment le traduire concrètement en code... Comment faire séparer les pièces en différent fichier tout en faisant appel au truc dans le fichier principal(Juste avec le meme namespace?)...Ou taper Dispose? quelle est son utilité? Comment procéder à l'affichage de tt les pièces. Je ne voyais pas d'autre solutions que de tt intégrer dans les classes respectives afin qu'une boucle parcourant tt ma matrice affiche tt les pièces. D'ailleurs au lancement de Nouvelle partie dans le menu strip mon affichage se produit mais il n'y a aucun rafraichissement alors qu'il me semblait que la méthode Invalidate forçait l'évènement Paint. Enfin je suis totalement perdu. Pour ce qui est du NullReferenceException je ne suis aps d'un element null vu qu'il existe normalement un element à l'endroit Occupmat[4,6](pion blanc dans ce cas). Je suis encore débutant en POO pourrais tu être un peu plus comme Jamy dans c'est pas sorcier . Parce que j'ai pas très bien compris ce que tu voulais dire
    MErci beaucoup

  4. #4
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Les classes que tu découpe dans plusieurs fichiers sont accessibles directement dans la classe Form1 si elles sont situées dans le même espace de nom et dans le même assemblage que celle ci.

    La méthode Dispose() va libérer les ressources utilisés par l'objet Graphics, ça évite les fuites de mémoire et ça autorise un autre objet Graphics à utiliser les fonctionnalités de dessin du formulaire.

    Si tu as une exception de type NullReferenceException, c'est qu'un objet est null. Cette exception se déclenche il me semble lorsque l'on essaye d'appeler une propriété ou une méthode sur un objet null.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    tu entends quoi par meme assemblage?

    donc je devrais terminer chacune de mes méthodes Affichage par Dispose();?

    le problème avec ma NullreferenceException c'est que normalement l'objet Occupmat[4,6] existe bel et bien et c'est un pion.

  6. #6
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Par définition, un assemblage est un unité logique définit sur un ou plusieurs fichiers. Un assemblage est représenté par une extension .dll ou .exe

    Par exemple ton application est un assemblage, le fichier System.Windows.Forms.dll que tu utilise pour créer ton formulaire est un autre assemblage.

    Citation Envoyé par Punkfloyd1967 Voir le message
    donc je devrais terminer chacune de mes méthodes Affichage par Dispose();?
    Oui.

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    je viens de mettre gr.Dispose(); a toutes mes méthodes et le problème n'est pas résolu...
    A quoi sert exactement pictureBox1.Invalidate(); Appelle - t elle vraiment l'évènement Paint. Lorsque je clique sur Nouvelle Partie l'affichage s'effectue pourtant alors pourquoi disparait il lorsque l'évènement mousedown survient. Pourquoi il semble se produire un réaffichage mais il ne reste pas ? Est ce que ma pictureBox englobe-t-elle comme je l'ai défini les pièces et donc leur pictureBox. Il y a quelque chose qui m'échappe comment s'affichent elles au départ et puis elles disparaissent dès qu'un évènement s'enclenche.

    Pour l'assemblage tu veux dire en gros je crée un fichier rattaché au projet nouveau fichier Class et par exemple pour ma classe pièce
    le code suivant est bon

    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace ECHEC
    {
    public class piece
    {
    public PictureBox pb;
    public bool coul;
    public piece(bool coul_, PictureBox pb_)
    {
    pb = pb_;
    coul = coul_;
    }
    public virtual void Afficher(int x, int y)
    {

    }
    public virtual bool Deplacement(int a, int b, int c, int d, piece[,] Matrix)
    {
    return false;
    }
    }
    }
    Je dois recopier tous les using utilisé dans mon fichier Form1.cs?
    Merci

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Utilise les balises de code pour exposer du code source.

    D'après le code que tu as fourni dans ton premier post, je pense que le problème vient de la:

    CODE 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (int i = 0; i < 8; i++)
    {
       for (int j = 0; j < 8; j++)
      {
          if (this.Occupmat[i, j] != null)
              this.Occupmat[i, j].pb.Invalidate();
      }
    }
    CODE 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Occupmat[4, 0] = new roi(true, pictureBox1);
            Occupmat[3, 0] = new reine(true, pictureBox1);
            Occupmat[0, 0] = new tour(true, pictureBox1);
            Occupmat[1, 0] = new cavalier(true, pictureBox1);
            Occupmat[2, 0] = new fou(true, pictureBox1);

    Le problème c'est que dans le code 2 tu fais passer le même objet de type PictureBox lorsque tu créé tes objets. Dans la définition de la classe on s'aperçoit que tu réalise un lien d'agrégation faible sur toute tes classes créées. En d'autres termes, cela signifie que tous tes objets utilisent la même PictureBox.

    Dans le code 1, tu applique la méthode Invalidate() avec une boucle sur le même objet. Tu as 2 boucles imbriquées d'une taille de 8 donc ça signifie que tu rafraîchit 8x8 = 64 fois ta pictureBox quand tu clique.

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Je viens de trouver une piste pour expliquer mon NullReferenceException. Et dans ce cas la je suis totalement dans la merde...fin bref. Je pense que le problème vient du fait que je transmettes en argument un tableau (qui le sera par référence et non par valeur). Je ne vois pas d'autre explication à ce bug. Et dans quel cas, je voudrais savoir si quelqu'un à une idée de comment accéder a des variable globales dans des méthodes associées a des pièces. Sinon la seule méthode alternative serait de tout taper comme un bourrin dans l'évènement mousedown... style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (Occupmat[xx,yy] is roi)
    Fichiers attachés Fichiers attachés

  10. #10
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Citation Envoyé par Punkfloyd1967 Voir le message
    Je pense que le problème vient du fait que je transmettes en argument un tableau (qui le sera par référence et non par valeur)
    Un tableau est type référence. Lorsque tu passe un objet de type référence en argument d'une fonction,le paramètre référence l'objet.

    Citation Envoyé par Punkfloyd1967 Voir le message
    comment accéder a des variable globales dans des méthodes associées a des pièces
    La désignation de "variables globales" n'existe pas dans le concept objet. En objet ce qui ressemble le plus à une "variable globale" ce sont les champs statiques

  11. #11
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    alors je devrais mettre static au lieu de public lors de la déclaration pour qu'elle soit accessible dans ma méthode déplacement? Ce qui me chiffonne toujours c'est que mes pièces existent bel et bien vu qu'elles sont affichées. Mais lors de la verif if(Occupmat[xx,yy].coul==cflag), il me signale l'exception ... Il y a toujours quelque chose qui m'échappe

  12. #12
    Membre du Club
    Inscrit en
    Mai 2008
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 49
    Points : 52
    Points
    52
    Par défaut
    J'ai lu ton source, tu t'aventure dans du GDI+ pour ton affichage et ca devient très vite compliqué car il faut penser au rafraichissement, double buffering etc...

    Je te propose d'utiliser autant de picturebox que de case (8x8) et de simplement changer les propriétés image.

    Au niveau de la structure du projet, ca à l'air un peu anarchique.
    Pour t'aider j'ai écrit un exemple de debut de jeu d'échec (pas complet mais l'essentiel)
    Jete y un oeil (pièce jointe).

    note : tu peux réutiliser la totalité du code si tu le souhaite
    Fichiers attachés Fichiers attachés

  13. #13
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Moi j'aurais défini la classe piece en tant que classe abstraite.

Discussions similaires

  1. [SQL] débutante: Problème d'affichage de requete
    Par katie dans le forum PHP & Base de données
    Réponses: 25
    Dernier message: 20/09/2006, 22h21
  2. [Débutant] [JTextPane] Problème d'affichage HTML
    Par callisto dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 11/04/2006, 13h40
  3. [débutant]problèmes d'affichage dans un tableau
    Par Hastur dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 16/08/2005, 12h00
  4. Xsl problème d'affichage (code) [débutant]
    Par redsaint dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 01/06/2005, 17h02
  5. [Débutant][JScrollePane] Problème d'affichage
    Par flzox dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 12/12/2004, 16h36

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