Problème procédure sur boutons [Résolu]

kev2404 6 Messages postés jeudi 10 avril 2008Date d'inscription 2 décembre 2010 Dernière intervention - 12 nov. 2010 à 11:20 - Dernière réponse : kev2404 6 Messages postés jeudi 10 avril 2008Date d'inscription 2 décembre 2010 Dernière intervention
- 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
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
Shaolyne 155 Messages postés jeudi 12 mai 2005Date d'inscription 8 mars 2011 Dernière intervention - 13 nov. 2010 à 17:39
3
Merci
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.

Merci Shaolyne 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de Shaolyne
Meilleure réponse
cs_Robert33 835 Messages postés samedi 15 novembre 2008Date d'inscription 14 janvier 2017 Dernière intervention - 13 nov. 2010 à 22:14
3
Merci
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!

Merci cs_Robert33 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 83 internautes ce mois-ci

Commenter la réponse de cs_Robert33
kev2404 6 Messages postés jeudi 10 avril 2008Date d'inscription 2 décembre 2010 Dernière intervention - 16 nov. 2010 à 09:40
0
Merci
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 !!!
Commenter la réponse de kev2404

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.