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 :

jeu de dames en C# sur visual studio


Sujet :

C#

  1. #21
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    justement, c'est un de mes problèmes aussi, la POO , j ai jamais vraiment bien pigé, et donc je ne vois pas quoi codé dans les différentes classes
    par exemple dans la classe damier, je voulais avoir une méthode qui fasse le déplacement des pions que j'ai commencé à écrire mais avec des événements Click pour chaque bouton (ce qui est pas très optimisé, ca c'est clair :/)

  2. #22
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Il est clair que si tu veux bien faire alors de bonnes notions en POO ne seraient pas du luxe. De plus il est inutile de vouloir commencer à coder alors que l'architecture n'est pas posée correctement, le règlement (comme évoqué plus haut) est la base de travail pour créer tes classes leurs propriétés/méthodes, leurs interactions et bien sure les événements !

    Ca me rappelle un fil de discussion concernant le jeu de bataille navale (mais il y avait une IA) : ICI

    Voilà l'approche que j'en avais faite pour aider le membre d'une autre communauté :

    Ce n'est absolument pas une obligation de modéliser mais pour des projets de plus grande envergure tu comprendras plus tard tout l'intérêt de savoir le faire et de le mettre en place.

    Il n'existe pas de petit ou gros projet nécessitant cette méthodologie. Je dirais même que ce jeu de bataille navale doit faire l'objet de ce genre d'approche contrairement à ce que tu pourrais penser !


    Voici succinctement en quoi consiste UML :

    Déterminer les acteurs :

    --> 2 acteurs sont essentiels : le joueur et le jeu
    Description : le joueur choisi son coup et joue. Le jeu fait jouer les 2 joueurs à tour de rôle et détermine si la partie est finie.


    Déterminer les cas d'utilisation :

    --> 2 cas d'utilisation : Jouer et proposer un coup


    Déterminer les classes (du point de vue conceptuel) :

    Le jeu bataille Navale utilise des pions pour faire s'affronter 2 joueurs. "Bataille Navale" est un jeu qui possède 2 types de règles :
    - les actions pour gérer les joueurs l'un après l'autre
    - les actions pour gérer les positions sur la grille (coup valide ou partie terminée)

    --> 4 classes pour le moment : BatailleNavale, Joueur, Grille, Pion

    NB : il faut au fur et à mesure de l'analyse extraire d'éventuelles classe par le biais de l'héritage par exemple....


    Déterminer les relations entre les classes :

    2 joueurs minimum peuvent participer au jeu (Bataille navale). Le jeu possède une grille commune qui a son tour peut contenir 1 ou plusieurs pions.


    Déterminer les propriétés et méthodes de chaque classe (exemple pour la classe joueur, grille et pion) :

    La classe joueur peut faire l'objet d'abstraction et ainsi on pourrait obtenir deux autres classes héritées nommées : JoueurHumain et JoueurMachine

    La classe Joueur possède la propriété : Couleur et la méthode : Choisir coups
    La classe JoueurMachine possède une propriété supplémentaire afin de déterminer le niveau de difficulté (analyse du nombre de coups à l'avance) : PrévoirCoups

    La classe grille possède 2 constantes pour déterminer la hauteur et la largeur : GrilleHauteur, GrilleLargeur et une collection qui détermine les pions placés dessus

    La classe pion possède 2 propriétés : PionCouleur et PionPosition et 3 méthodes : GetPion(Position et Couleur), GetCouleur, Afficher

    Ce qui nous amène à créer une autre classe nommée Position car une position existe même s'il n'y a pas de pion placés dessus !

    Donc pour la classe Position il existe 2 propriétés : X et Y et 4 méthodes : GetPosition(X et Y), GetX, GetY, estValide(Jeu;Grille)

    la méthode est valide permet de savoir si une position est dans la grille ou non !


    .....
    etc.............

    Tu te rends bien compte que l'analyse est bien plus importante que le codage lui-même (ce dernier étant juste pour le fun )


    A+ et bon projet.
    NB : les puritains diront qu'UML n'est pas forcément adapté dan certains cas, j'en conviens ce n'est qu'une solution parmi tant d'autres.

  3. #23
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Donc dans mon cas avec le jeu de dames, il y aurait : une classe damier avec une méthode déplacement , une classe joueur , une classe partie. Il manque surement quelques méthodes dans les classes.
    Mais à partir de la, je suis de nouveau coincé car je vois +- comment coder en mettant des événements Click un peu partout sur chaque bouton comme j'ai commencé à faire dans le fichier Form1.cs que j'ai posté mais en POO, les boutons ne sont pas accessibles dans les classes et donc je ne vois pas comment coder cela :/

  4. #24
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Bonjour,

    Donc dans mon cas avec le jeu de dames, il y aurait : une classe damier avec une méthode déplacement , une classe joueur , une classe partie. Il manque surement quelques méthodes dans les classes.
    Il te manque surtout les propriétés !!!

    Mais à partir de la, je suis de nouveau coincé car je vois +- comment coder en mettant des événements Click un peu partout sur chaque bouton comme j'ai commencé à faire dans le fichier Form1.cs que j'ai posté mais en POO, les boutons ne sont pas accessibles dans les classes et donc je ne vois pas comment coder cela :/
    En POO, il ne faut pas croire que l’événementiel se gère uniquement que par des boutons et des événements Click. C'est en ce sens que je disais qu'une bonne étude préalable permet de soulever bien des problématiques en vue d'en dégager des solutions.

    Au regards des interrogations qui te taraudent, pourquoi pour le moment ne pas te lancer dans une sorte de mini projet pour bien appréhender les concepts de la POO ?

    Prenons un exemple tout simple du quotidien (bon j'avoue perso je suis un accro du café ^^) : Je veux boire un bon café

    Je t'épargne la phase : je me rends au magasin, ma voiture démarre-t-elle, ai-je assez d'argent dans mes poches ou sur ma carte de crédit, le magasin a-t-il la marque de café que je bois habituellement.....etc.....

    Je possède 5 tasses à café dans mon placards
    J'ai une boite de 100 sucres dans mon placards
    J'ai 50 dosettes dans mon placards
    J'utilise une cafetière Senseo
    Ma cafetière fonctionne bien et est branchée électriquement

    Quel serait ton raisonnement, programmatiquement parlant, pour illustrer le fait que tu vas boire un bon café ???

    C'est toute cette description qui va te permettre de structurer ton projet. Bien entendu il faut un maximum s'imprégner des notions POO. Je dirai que le principal atout est de savoir identifier des entités (assimilés à des classes) qui pourraient avoir des propriétés et méthodes, la partie événementiel vient en second plan puisque c'est ce qui va te permettre de faire le lien entre la fonctionnalité et l'interface (Class <> UI).

    NB : Il faut bien distinguer le design (la partie interface) de la fonctionnalité (les classes)

    Si tu veux nous pouvons débattre de ce sujet, je comprends que ces notions peuvent être assez déroutantes mais ce n'est pas insurmontable.

  5. #25
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,
    Je me permets juste un petite réflexion : Tu mélanges l'interface utilisateur (les boutons, la form etc) et le jeu. Ce sont 2 choses différentes. L'interface utilisateur n'est que le reflet du jeu. Comme exposé dans les messages précédents, le jeu doit être modélisé sous forme de classes. Toute "l'intelligence" du jeu (coups possibles, positions des pions, joueurs, à qui le tour etc...) doit être gérée dans ces classes. A priori, ta représentation graphique doit comporter relativement peu de code, juste le code nécessaire d'une part à représenter graphiquement les états et propriétés contenus par tes classes et d'autre part à gérer l'interaction utilisateur.
    Cela permettra de mettre un seul évènement pour tous les boutons (donc peu importe la taille du damier comme déjà dit).
    Par exemple :
    Tu cliques sur un bouton,
    L'évènement click passe à l'objet Jeu (ou Partie comme tu veux) une information indiquant quel bouton a été cliqué (info que tu peux stocker dans la propriété Tag des boutons qui peut contenir n'importe quoi comme objet et dans l'évènement Click, le paramètre sender représente le bouton sur lequel tu as clické),
    L'objet Jeu sait tout du jeu donc quel est le joueur qui a fait l'action, a-t-il le droit de jouer ce pion, quelles sont les mouvements possibles etc. Donc à partir de l'information envoyée par ton interface, il peut définir des états et des actions ou mouvements possibles. Il peut donc mettre à jour les propriérés/états des ses objets (Damier ou jeu, pions etc)
    Ensuite, il suffit à ton interface d'appeler une méthode de raffraîchissement graphique qui sera une représentation visuel de l'objet Damier (par exemple).
    Bon je n'ai pas fait d'analyse poussée donc ce que j'écris ne doit pas être pris pour argent comptant, c'est juste pour que tu comprennes la différenciation entre l'interface graphique et l'intelligence du jeu.
    Dis-toi en fait que tu dois pouvoir écrire quasiment tout le jeu en faisant abstraction de l'interface graphique.

  6. #26
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par gtrob Voir le message
    Donc dans mon cas avec le jeu de dames, il y aurait : une classe damier avec une méthode déplacement , une classe joueur , une classe partie. [...]
    Attention, ce n'est pas le damier qui se déplace, mais bel et bien le pion. Et cela change beaucoup de choses dans la façon d'aborder le sujet. Pour suivre la citation de wallace1, un travail d'analyse est primordial si tu ne veux pas passer la plupart de ton temps à "faire et défaire".

  7. #27
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2014
    Messages : 15
    Par défaut
    Pour rajouter après mes camarades, ne prends pas tout le sujet d'un coup, en voulant programmer tous les concepts d'un coup (lorsque tu veux parcourir toutes les cases par exemple). Vas-y petit à petit. En essayant pour le moment de faire bouger un de tes jetons d'une case à l'autre. Cela t'aidera à maitriser certains concepts. Ensuite, tu pourras essayer de "manger" un autre jeton. Puis de vérifier si la case est déjà prise. Et ainsi de suite. Si tu test tout d'un coup, tu ne feras que te prendre la tête et d'accumuler les problèmes.
    Concernant ton damier : Le jeu de dames comprends des cases vides, non? Comment peux-tu déplacer tes pions sinon ?

  8. #28
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 13
    Par défaut
    Bonjour, désolé pour cette réponse tardive, merci pour les explications que vous m'avez donné, je vois le principe mais le problème est toujours le code à écrire dans les classes, comment puis je déplacer un pion alors que je ne peux pas utiliser les différents états du bouton dans la classe ni des cases dans lesquelles se trouvent les boutons ? Je ne sais pas si je m exprime bien ? Par exemple pour le déplacement, je ne vois pas comment passer du code que j ai écrit et posté plus haut dans la conversation , avec les événements CLICK de chaque bouton à une classe qui va gérer cela
    Et pour répondre à synergie35, oui le jeu se joue uniquement sur les cases rouges donc les cases brunes sont vides

  9. #29
    Membre Expert
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par gtrob Voir le message
    ...... je vois le principe mais le problème est toujours le code à écrire dans les classes, comment puis je déplacer un pion alors que je ne peux pas utiliser les différents états du bouton dans la classe ni des cases dans lesquelles se trouvent les boutons ? Je ne sais pas si je m exprime bien ? Par exemple pour le déplacement, je ne vois pas comment passer du code que j ai écrit et posté plus haut dans la conversation , avec les événements CLICK de chaque bouton à une classe qui va gérer cela .....
    Tout a été expliqué plus haut, maintenant c'est à toi de faire l'effort de t'immerger dans les notions de bases de la programmation et notamment la POO !
    Dans une classe tu peux très bien créer des événements que tu pourras appeler depuis la partie graphique de ton projet (tout comme VS le fait automatiquement avec les classes que tu utilises et le mot clé Handles : la notion de l abonnement et de son gestionnaire, ta curiosité devrait faire le reste en principe).
    On ne te rendrait pas service en te proposant du code si tu n'as même pas pris la peine d'arpenter et/ou pris le temps d'assimiler les notions de bases.... il n'existe pas de raccourci pour cela.... donc la balle est dans ton camps.

    Au risque de me répéter, il faut arrêter de croire que tout est géré avec des boutons et des click, il faut dépasser cette idée pour y voir plus clair dans la programmation !

    A+

  10. #30
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour

    Primo ,bien que le dernier des derniers sait jouer aux dames ,ce qui peut suggere une impression de trivialite
    ,neanmoins le cerveau du dernier des derniers est une machine super complexe !!!......

    Que se passe-t-il?
    Si on observe ce jeu de pres:

    1/ il y a un arriere-plan trompeur -damier- de cases colorees alternatives couleurs Peru et Marrons.C'est l'mage
    Background inerte...

    2/ des pions poses dessus :

    - 3 ranges de pions Noirs en haut poses sur les cases Marrons ...
    - 3 ranges mais à partir du bas pour les pions Blancs sur les cases Marrons ...

    2/ dans ta "tete" 'et la mienne une grille ou Grid avec des cases superposees à l'image et un serie de regles de deplacement des Pions qui se telescopent...!!!

    3/ Deux Joueurs ou Players fort affaires qui se regardent en chien de faience...



    Dans l'exemple de code ci-après peu elabore(il manque les -if- gerant les deplacement du Pion-Rouè ) et destine à donner une idee seulement de ce a quoi a echappe le Prof ,
    je profite (comme un vulgaire profiteur) ,des bienfaits de l'API .Net:

    1/ la Grid est un tableau 8x8 de Panel (le panel est un CLASS de type Control) ce qui permets d'avoir une grille

    "clickable" !!!

    2/ les pions seront representes par un CLASS Pion de type "custom Control" ce qui permet :

    - d'avoir un "pion clickable",loge dans la case approprie (Panel) de la Grid .

    - deplacable d'une case à à l'autre de la Grid(PanelSource.Controls.Clear ,PanelDest.Controls.Add())...

    -ce control "perso" est dessine en forme de cercle de maniere que seul l'interieur du circle est clickable,le reste du rectangle client est transparent pour "voir" la case hote (Panel) et "cliquer" sur elle...
    On peut ainsi distinguer un "click" sur une case (Panel) de la Grid d'un "click" sur un pion ....
    -2 props fort utiles ont ete rajoutees : IsSelected et Player

    3/ les 2 Players sont de vulgaires instances du CLASS Integer :1 et 2

    4/ Le class Form lui-meme est "recycle" comme :
    - un CLASS Jeu ou Game
    Encore un abus de ma part des bienfaits de l'API .Net et je recycle tout ce que trouve,le recyclage etant de mode ...
    Utilisation du jeu ci-apres se fait comme suit : on clicque sur le pion Noir ou Blanc (attention au "turn") et la case cible ou convoite et le pion est deplace ,s'il y a une prise elle faite d'office...
    Si le deplacement n'est "legal", le damier reste de marbre ....ou de pierre granit...!!!
    Tu peux rajouter un label au form à gauche mis à jour et colore suivant la valeur de la variable "turn" (apres la ligne de code p1turn= !p1turn et avant le method CheckWin) et affichant "Player1" ou "Player2" ...
    Et meme un beep pour les mal-entendants !!!


    Mais comme dit par Wallace ,cela montre clairement que tout cela peut etre transpose en POO.


    code behind .cs du class Pion ou Custom Control (il faut creer un custom control nomme Pion et copier-coller le code du class ci-après :
    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
     
     
        public partial class Pion : Control
        {
            private bool king;
     
            public bool  IsKing
            {
                get { return king; }
                set { king = value; }
            }
            private bool selected;
     
            public bool IsSelected
            {
                get { return selected; }
                set { selected = value; }
            }
     
     
            private int player ;
     
            public int Player
            {
                get { return player ; }
                set { player  = value; }
            }
     
     
     
     
     
     
     
     
     
            public Pion()
            {
                InitializeComponent();
            }
     
            protected override void OnPaint(PaintEventArgs pe)
            {
                base.OnPaint(pe);
                Graphics gr = pe.Graphics;
                GraphicsPath path = new GraphicsPath();
                Rectangle rect= this.DisplayRectangle;
     
                // Comprime pour dessiner  border
                rect.Inflate(-1, -1);
                gr.DrawEllipse(new Pen(Brushes.Black, 3), rect);
     
                // Comprime 2eme fois pour  remlir pion
                rect.Inflate(-1, -1);
     
                //remplit  le cercle
                gr.FillEllipse(new SolidBrush(this.BackColor), rect);
     
     
                 // "dilate" ou Inflate vers taille d'origine
                rect.Inflate(2, 2);
     
                // Add ellipse to graphics path
                path.AddEllipse(rect);
     
               // Sette le  "region" ou zone clickable
                this.Region = new Region(path);
     
                // si Roi , desine un 'k' ou 'r' c'est selon 
                if( king && this.BackColor != Color.Black ) // roi des Blancs est un Roi Noir !!!
                {
                    gr.DrawString("K", this.Font, Brushes.Black, 
                        new PointF(
                            (float)(this.Width / 2 - this.FontHeight / 2),
                            (float)(this.Height / 2 - this.FontHeight / 2)));
                }
                else if (king && this.BackColor == Color.Black) // roi des Noirs est un Roi Blanc
                {
                    gr.DrawString("K", this.Font, Brushes.White, 
                        new PointF(
                            (float)(this.Width / 2 - this.FontHeight / 2), 
                            (float)(this.Height / 2 - this.FontHeight / 2)));
                }
     
                if( IsSelected )
                {
                    Panel pnl  = ( Panel)this.Parent;
                    pnl.BorderStyle = BorderStyle.Fixed3D;
                }
                else
                { 
                    Panel pnl  = ( Panel)this.Parent;
                    pnl.BorderStyle = BorderStyle.FixedSingle;
                }
     
            }
        }
    code behind .cs du form:

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    368
    369
    370
    371
    372
    373
    374
    375
    376
    377
    378
    379
    380
    381
    382
    383
    384
    385
    386
    387
    388
    389
    390
    391
    392
    393
    394
    395
    396
    397
    398
    399
    400
     
    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 WinCheckers
    {
        public partial class Form1 : Form
        {
            private int sizePion = 64;
            private int columns = 8;
            private int rows = 8 ;
            private Panel[,]  Board = new Panel[8, 8]  ; //board ou grid
            private bool p1turn = true; // flag du tour
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
                NewGame();
     
     
                this.Size = new Size(columns  * sizePion  , rows *sizePion);
                this.StartPosition = FormStartPosition.CenterScreen;
                this.Text = "Jeux de Dames";
     
            }
     
            private void NewGame()
            {
                this.Controls.Clear();
     
                Load_Board();
                Load_Checkers();
     
                p1turn = true;
            }
     
     
            // dessin grille de panels
            private void Load_Board()
            {
     
                for (int x = 0; x < Board.GetUpperBound(0)+1; x++) //ligne
                {
                    for (int y = 0; y < Board.GetUpperBound(1)+1; y++) // colonne
                    {
                        //panel container du pion
                        Panel pnl = new Panel();
                        //coloriage alternatif des panels de la grille suivant pair-impair
                        if (x % 2 == 0) 
                        {
                            pnl.BackColor =y % 2==0? Color.SaddleBrown:Color.Peru;
                        }
                        else
                        { 
                            pnl.BackColor =y % 2==0? Color.Peru:Color.SaddleBrown;
                        }
                        pnl.BorderStyle = BorderStyle.FixedSingle;
                        pnl.Location = new Point(x * sizePion , y * sizePion );
                        pnl.Size = new Size(sizePion, sizePion);
     
     
                        // ajout au form
                        Board[x, y] = pnl;
                        this.Controls.Add(pnl); 
     
                        //  click event handler
                        pnl.Click += new EventHandler(pnl_Click);
                    }
                }
            }
            // charge kes pions 
            private void Load_Checkers()
            {
     
                int startRow = 0;
                int endRow =-1 + rows / 2;
                for (int y = startRow; y < endRow ; y++) //loop des 3 rangees du haut
                {
     
     
                    for (int x  = 0 ;x< columns  ; x ++)
                    {
                        //ajoute un nveau pion et sette ses props
                        Pion check = new Pion();
                        check.BackColor = Color.Black;
                        check.IsKing = false;
                        check.IsSelected = false;
                        check.Location = new Point(2, 2);
                        check.Player = 2;
                        check.Size = new Size(50, 50);
     
                        // test parite de la ligne-colonne
                        if(x % 2==0 && y % 2==0)
                        {
                              Board[x, y].Controls.Add(check);
                              check.Click += new EventHandler(check_Click);  //handler du click
                        }
                        else if (x % 2 !=0 && y % 2 !=0)
                        {
                            Board[x, y].Controls.Add(check);
                            check.Click += new EventHandler(check_Click);  
                        }
     
                    }
     
                }
                startRow =1+ rows / 2;
                endRow = rows;
                for (int y = startRow; y < endRow; y++) //loop des 3 rangees du bas
                {
     
     
                    for (int x = 0; x < columns; x++)
                    {
                        Pion check = new Pion();
                        check.BackColor = Color.White ;
                        check.IsKing = false;
                        check.IsSelected = false;
                        check.Location = new Point(2, 2);
                        check.Player = 1;
                        check.Size = new Size(50, 50);
     
     
                        if (x % 2 == 0 && y % 2 == 0)
                        {
                            Board[x, y].Controls.Add(check);
                            check.Click += new EventHandler(check_Click);
                        }
                        else if (x % 2 != 0 && y % 2 != 0)
                        {
                            Board[x, y].Controls.Add(check);
                            check.Click += new EventHandler(check_Click);
                        }
     
     
     
                    }
     
                }
            }
            private Pion selected_checker; 
            void pnl_Click(object sender, EventArgs e)
            { 
                Panel  pnl_clicked = sender as  Panel;
                 if( selected_checker != null && CheckMove(selected_checker, pnl_clicked) )
                     MoveChecker(selected_checker, pnl_clicked);
     
            }
     
     
     
     
            void check_Click(object sender, EventArgs e)
            {
                 Pion checker_clicked  =sender as  Pion;
     
                if( selected_checker != null) // il existe deja une Selection 
                {
     
                    if( checker_clicked == selected_checker)
                    {
                        // checker clique deja  selectionne => Annuler Selection
                        selected_checker.IsSelected = false;
                        selected_checker = null;
                    }
                    else
                    {
                        //'checker clique non selectionne  => le selectionner
                        selected_checker = checker_clicked;
                        checker_clicked.IsSelected = true;
                    }
                }
                else // Aucune Selection en cours 
                {
                    //selection du checker clique 
                    selected_checker = checker_clicked;
                    checker_clicked.IsSelected = true;
                }
            }
            private bool CheckMove(Pion moving_checker, Panel pnl_to_move_to)
            {
                // si Panel "destination"  clique possede un pion , ignorer ce clic
                // Sinon  verifier aussi s'il ya un pion selectionne 
                if (pnl_to_move_to.Controls.Count == 0 && moving_checker != null)
                {
     
                    // recuperer les coords des 2 panes : panel "destination vide" & 
                    // panel "parent" du pion selectionne
                    int x_sel = 0;
                    int y_sel = 0;
                    int x_cur = 0;
                    int y_cur = 0;
                    for (int col = 0; col < Board.GetUpperBound(0) + 1; col++)
                    {
                        for (int row = 0; row < Board.GetUpperBound(1) + 1; row++)
                        {
     
                            if (Board[col, row] == pnl_to_move_to)
                            {
                                x_sel = col;
                                y_sel = row;
                            }
     
                            if (Board[col, row] == moving_checker.Parent as Panel)
                            {
                                x_cur = col;
                                y_cur = row;
                            }
                        }
                    }
     
                    // verifier si mvt est "legal" ou autorise 
                    if (moving_checker.Player == 1 && p1turn) // tour player 1 (les blancs)
                    {
                        if (x_sel - x_cur == -1 && y_sel - y_cur == -1)
                        {
                            // verifie si case gauche-haut (NE) 
                            return true;
                        }
                        else if (x_sel - x_cur == -2 && y_sel - y_cur == -2)
                        {
                            Panel pnl = Board[x_sel + 1, y_sel + 1] as Panel;
                            if (pnl.Controls.Count > -1 && ((Pion)pnl.Controls[0]).Player == 2)
                            {
                                // verifie si 2 cases  gauche-haut (NE) et vis-à-vis player 2(Noir)
                                pnl.Controls.Clear(); // prise
                                return true;
                            }
                            else
                            {
                                return false;
                            }
                        }
                        else if (x_sel - x_cur == 1 && y_sel - y_cur == -1)
                        {
                            // verifie si case droite-haut (NW)
                            return true;
                        }
                        else if (x_sel - x_cur == 2 && y_sel - y_cur == -2)
                        {
                            Panel pnl = Board[x_sel - 1, y_sel + 1] as Panel;
                            if (pnl.Controls.Count > -1 && ((Pion)pnl.Controls[0]).Player == 2)
                            {
                                // verifie si 2 cases  droite-haut (Nw) et vis-à-vis player 2(Noir)
                                pnl.Controls.Clear();
                                return true;
                            }
                            else
                            {
                                return false;
                            }
     
                        }
     
                    }
                    else if (moving_checker.Player == 2 && !p1turn)// tour player 2 (les noirs)
                    {
                        if (x_sel - x_cur == -1 && y_sel - y_cur == 1)
                        {
                            // verifie si case gauche-bas (SW) 
                            return true;
                        }
                        else if (x_sel - x_cur == -2 && y_sel - y_cur == 2)
                        {
                            Panel pnl = Board[x_sel + 1, y_sel - 1] as Panel;
                            if (pnl.Controls.Count > -1 && ((Pion)pnl.Controls[0]).Player == 1)
                            {
                                // verifie si 2 cases  gauche-bas (SW) et vis-à-vis player 1(Blanc)
                                pnl.Controls.Clear();
                                return true;
                            }
                            else
                            {
                                return false;
                            }
     
                        }
                        else if (x_sel - x_cur == 1 && y_sel - y_cur == 1)
                        {
                            // verifie si case droite-bas (SE)
                            return true;
                        }
                        else if (x_sel - x_cur == 2 && y_sel - y_cur == 2)
                        {
                            Panel pnl = Board[x_sel - 1, y_sel - 1] as Panel;
                            if (pnl.Controls.Count > -1 && ((Pion)pnl.Controls[0]).Player == 1)
                            {
                                // verifie si 2 cases  droite-bas (SE) et vis-à-vis player 1(Blanc)
                                pnl.Controls.Clear();
                                return true;
                            }
                            else
                            {
                                return false;
                            }
     
     
                        }
                    }
                }
                    return false;
            }
            private void MoveChecker(Pion moving_checker, Panel pnl_to_move_to)
            {
                // deselectionne le pion à deplacer
                moving_checker.IsSelected = false;
     
                // le supprime de l'ancien Panel
                Panel moving_from_pnl   = moving_checker.Parent as  Panel;
                moving_from_pnl.Controls.Clear();
     
                // l'ajoute au Panel destination
                pnl_to_move_to.Controls.Add(moving_checker);
     
                //  verifie s'il peut etre "couronne" 
                for (int x = 0 ; x < Board.GetUpperBound(0)+1 ; x++)
                {
                    for( int y  = 0 ;y< Board.GetUpperBound(1)+1; y++)
                    { 
                        if( Board[x, y] == pnl_to_move_to )
                        {
                            if( moving_checker.Player == 1 && y == 0)
                                moving_checker.IsKing = true;
                            else if (moving_checker.Player == 2 && y == 7) 
                                moving_checker.IsKing = true;
     
                            break;
                        }
                    }
                }
     
                //  change le tour .on inverse le drapeau du tour
                p1turn = ! p1turn;
     
                //  ICI VIENT LE CODE DU LABEL COLORE
                // if (p1turn) 
                //    label.backolor = blanc...
                // else
                //    label.backolor= noir...
     
     
                // sette le pion selectionne à null
                selected_checker = null;
     
                // veifie le decompte des points et s'il y a un "winner"
                CheckWin();
     
     
            }
     
            private void CheckWin()
            {
                 int p1_count  = 0;
                 int p2_count  = 0;
     
                for (int x = 0 ; x< Board.GetUpperBound(0)+1;x++)
                {
                    for (int y = 0 ; y< Board.GetUpperBound(1)+1; y++)
                    {
                        // panel a-t-il un pion ?
                        if ( Board[x, y].Controls.Count > 0 )
                        {
                            // pion appartient à  p1 ou p2
                            Pion  check  = Board[x, y].Controls[0] as  Pion;
                            if ( check.Player == 1)
                                p1_count += 1;
                            else if (check.Player == 2)
                                p2_count += 1;
                        }
     
                    }
                }
     
                // verifie le nbre de pions de p1 et p2
                if ( p1_count == 0) 
                {  
                    MessageBox.Show("Player2 wins!"); //p2 a gagne
     
                    NewGame(); //nouvelle partie
                }
                else if (p2_count == 0 )
                {
                    MessageBox.Show("Player1 wins!"); // p1 a gagne
     
                    NewGame();//nouvelle partie
                }
     
            }
        }
    }
    bon code.............

Discussions similaires

  1. erreur d'installation sur visual studio 6.0
    Par nassimmm dans le forum Installation, Déploiement et Sécurité
    Réponses: 3
    Dernier message: 06/07/2007, 15h26
  2. question sur visual studio 2005
    Par informatik dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 20/12/2006, 14h56
  3. ASP sur visual studio 2005
    Par smtjv dans le forum Visual Studio
    Réponses: 1
    Dernier message: 31/10/2006, 18h30
  4. problème sur visual studio
    Par oliver75 dans le forum Accès aux données
    Réponses: 1
    Dernier message: 10/10/2006, 17h52
  5. Infos sur visual studio express
    Par molo2003 dans le forum MFC
    Réponses: 2
    Dernier message: 10/05/2006, 17h18

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