Problème procédure sur boutons

Résolu
kev2404 Messages postés 6 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 2 décembre 2010 - 12 nov. 2010 à 11:20
kev2404 Messages postés 6 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 2 décembre 2010 - 16 nov. 2010 à 09:40
Bonjour,

J'ai un problème, j'ai créé un pierre feuille ciseau pour un projet de BTS, le jeu est fonctionnel mais j'aimerais simplifier mon code.

j'ai trois boutons (pierre, feuille, ciseau) et ces trois boutons font la même chose.

Je voudrais créer une procédure permettant d'éviter cette répétition inutile.

Voici le code du bouton "pierre":

private void btnPierre_Click(object sender, EventArgs e)
        {

            Random r = new Random();
            i = r.Next(1, 4);//si 1 : Pierre, si 2 : Feuille, si 3 : Ciseau



            if (j < 30)
            {
                lbl4.Text = "Tour n° " + j;
                if (i 1) // pierre contre pierre> egalité
                {

                    lbl2.Text = "Pierre - Egalité";
                    scoreJ = scoreJ + 1;
                    scoreO = scoreO + 1;

                }
                else if (i 2) // pierre contre feuille> perdu
                {
                    lbl2.Text = "Feuille - Perdu";
                    scoreO = scoreO + 2;

                }
                else // pierre contre ciseau => gagné
                {
                    lbl2.Text = "Ciseau - Gagné";
                    scoreJ = scoreJ + 2;

                }
                lbl3.Text = "Score Joueur: " + scoreJ + " pts" + "\n" + "Score ordinateur: " + scoreO + "pts";
                j = j + 1;

            }
            else
            {
                if (scoreJ < scoreO)
                {
                    gain = "Ordinateur gagne!";
                }
                else
                {
                    gain = "Joueur gagne!";
                }

                lbl4.Text = "Partie terminé: " + gain;
            }


        }


Le code des deux autres boutons sont les mêmes sauf la valeur généré du random qui est utilisé différemment (ce qui faudrait passé en paramètre?)

D'avance merci


La vie n'est pas qu'un PC

3 réponses

Shaolyne Messages postés 155 Date d'inscription jeudi 12 mai 2005 Statut Membre Dernière intervention 8 mars 2011 1
13 nov. 2010 à 17:39
Salut à toi kev,

Tu peux rediriger les actions "click" de chacun des boutons sur le même handler (la même méthode). Pour ce faire, il te suffit de spécifier la même méthode pour les 3 boutons (via le designer, dans la dropdown de l'évènement click ; via le code comme ci:
btnPierre.Click += btn_Click;
btnPapier.Click += btn_Click;
...
)

Dans ton handler, tu vas alors vérifier quel est le bouton initiateur de l'évènement via la variable sender. En fonction du bouton, tu vas alors appeler une méthode UpdateScore(playerAction, AIAction). Finalement, il te reste à mettre tes libellés à jour. Pour ce faire, tu peux créer une méthode UpdateLabels(j, AIAction, result).

Ton code aura alors l'allure suivante :
private void btn_Click(object sender, EventArgs e)
{
   Random AIAction = new Random();
   i = r.Next(1, 4);//si 1 : Pierre, si 2 : Feuille, si 3 : Ciseau

   if (j < 30)
   {
      int playerAction = GetValueFromButton(sender as Button);
      int result = UpdateScore(playerAction, AIAction)
      UpdateLabels(j, AIAction, result);
      j++;  
   }
   else
   {
      gain scoreJ < scoreO? "Ordinateur gagne!" : gain "Joueur gagne!";
      lbl4.Text = "Partie terminé: " + gain;
   }
}

private int GetValueFromButton(Button btn)
{
    int btnValue=0;

    if(btn == btnPierre)
       btnValue = 1;
    else if(btn == btnPapier)
       btnValue = 2;
    else if(btn == btnCiseau)
       btnValue = 3;

    return btnValue;
}

private int UpdateScore(int playerAction, int AIAction)
{
    switch(playerAction)
    {
        case 1: //Appliquer la règle
                //Mettre à jour les scores
                //Mettre à jour la variable result: 0 si égalité, 1 si  
                //player vainqueur et 2 si AI vainqueur
        case 2: //idem
        case 3: //idem
    }

    return result;
}

private void UpdateLabels(int nbTours, int AIAction, int result)
{
   lbl2.Text = GetTextFromAIAction(AIAction) + " - " + GetTextFromResult(result);
   lbl3.Text = "Score Joueur: " + scoreJ + " pts" + "\n" + "Score ordinateur: " + scoreO + "pts";
   lbl4.Text = "Tour n° " + j;
}


Je te laisse écrire le code relative aux 2 dernière méthodes: GetTextFromAIAction(AIAction) et GetTextFromResult(result).
Concernant l'exactitude du code, il se peut qu'il y ait certaines erreurs car je n'ai pas de VS installé sur cette machine. Concernant la sémantique implicite apportée à chaque valeur, il est préférable de travailler avec des enum. De la sorte, le code sera plus clair et plus maintenable.

N'hésites pas à me faire part de toute remarque.

Shao.
3
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
13 nov. 2010 à 22:14
Bonsoir

D'accord avec Shaolyne pour l'utilistation d'un seul gestionnaire de click
Pense à utiliser la propriété TAG pour différencier tes boutons.

Exemple:
public Form1()
{
    InitializeComponent();
    
    button_Pierre.Click += new System.EventHandler(this.button_Click);
    button_Pierre.Tag = 1;
    
    button_Papier.Click += new System.EventHandler(this.button_Click);
    button_Papier.Tag = 2;

    button_Ciseaux.Click += new System.EventHandler(this.button_Click);
    button_Ciseaux.Tag = 3;
}

string[] types = { "Pierre", "Papier", "Ciseaux" };
private void button_Click(object sender, EventArgs e)
{
    int boutonType = (int)((Button)sender).Tag;
    
    Random r = new Random();
    int i = r.Next(1, 4);//si 1 : Pierre, si 2 : Ciseau si 3 : Papier 

    if (boutonType == i) //egalite
    {
        lbl2.Text = types[i-1] + " - Egalité";
        scoreJ++;
        scoreO++;
    }
    else if ((boutonType 1 && i 3) || (boutonType == 2 && i == 1) || (boutonType == 3 && i == 2))// Gagné
    {
        lbl2.Text = types[i-1] + " - Gagné";
        scoreJ += 2;
    }
    else
    {
        lbl2.Text = types[i-1] + " - Perdu";
        scoreO += 2;
    }

    lbl3.Text = "Score Joueur: " + scoreJ + " pts" + "\n" + "Score ordinateur: " + scoreO + "pts";

    if (++j == 30)
    {
        string gain = (scoreJ < scoreO) ? "Ordinateur gagne!" : "Joueur gagne!";
        lbl4.Text = "Partie terminé: " + gain;
    }
    else
        lbl4.Text = "Tour n° " + j;
}


Bon code
Bob

C# is amazing, enjoy it!
3
kev2404 Messages postés 6 Date d'inscription jeudi 10 avril 2008 Statut Membre Dernière intervention 2 décembre 2010
16 nov. 2010 à 09:40
Bonjour,

Merci beaucoup pour vos aides, ça marche nickel, le code en plus est simple.

Encore merci


Kweb


_______________________


La vie n'est pas qu'un PC !!!
0
Rejoignez-nous