La structure interne ainsi que le design d'AreaProg ont récemment été modifiés.
Suite à cela, le format de certains articles a été perturbé. Le problème est connu et en cours de résolution. Merci de votre compréhension.
private string pattern = "";
private List<string> coupGagnant = new List<string> { "Rp", "Ps", "Sr" };
private List<string> coupDraw = new List<string> { "Rr", "Pp", "Ss" };
private int scoreJoueur = 0;
private int scoreMinasi = 0;
La variable pattern ici va nous permettre de contenir la combinaison des coups joués. Nous avons ensuite deux tableaux qui vont nous permettre de définir les règles du jeu, donc la priorité des coups. Nous faisons donc un tableau contenant les coups gagnant et un nombre contenant les coup nuls. La première liste contiendra les coups gagnant pour l'utilisateur et non pour la machine. Le principe sera donc de regarder les deux derniers coups joués, de voir dans quel tableau ils se trouvent et d'en définir le gagnant, nous verrons cela un peu plus loin. Nous avons ensuite deux variables qui permettront simplement de contenir le score des deux joueurs. Doublez cliquez maintenant sur le bouton Pierre et tapez :
jouer("r");
Pour le bouton Papier, tapez :
jouer("p");
Et pour le bouton Ciseaux :
jouer("s");
La fonction jouer est une fonction personnelle qui va nous permettre de jouer notre coup, d'attendre le coup de l'algorithme, de comparer les deux et d'attribuer les points en conséquence. Voici comment l'implémenter :
private void jouer(string joueur)
{
pattern += joueur;
string minasi = getNextHit();
string dernierCoup = pattern.Substring(pattern.Length - 2);
if (coupDraw.IndexOf(dernierCoup) >= 0)
{
scoreJoueur++;
scoreMinasi++;
}
else if (coupGagnant.IndexOf(dernierCoup) >= 0)
scoreJoueur++;
else
scoreMinasi++;
pattern += minasi;
lblScoreMinasi.Text = scoreMinasi.ToString();
lblScoreJoueur.Text = scoreJoueur.ToString();
}
Le code de cette fonction n'est pas très compliqué. La première ligne permet simplement d'ajouter le coup de l'utilisateur à la liste des coups déjà joués. Nous récupérons ensuite dans la variable minasi le résultat de la fonction getNextHit. Cette fonction permet d'utiliser l'algorithme et renvoie le coup déterminé par ce dernier. Nous récupérons ensuite les deux derniers coups joués dans la variable dernierCoup. Le premier if va vérifier si ce coups se trouvent dans la liste des coups nuls, si c'est le cas, nous incrémentons les deux scores. Par contre, si ces deux coups se trouvent dans la liste des coups gagnant, nous n'incrémentons que le score du joueur. Si les coups ne se trouvent dans aucune des deux listes, nous incrémentons juste le score de l'algorithme. Nous ajoutons ensuite le coup joué par l'algorithme à la suite de la combinaison et enfin nous modifons la valeur des labels contenant les scores.
Avant de passer à l'implémentation de l'algorithme, rendez-vous dans le constructeur de la form et tapez :
pattern += getNextHit();Cela permet à l'algorithme de jouer le premier coup de la partie. Voyons maintenant l'implémentation de la fonction getNextHit. La signature de celle-ci sera simplement :
private string getNextHit()
{
}
Comme vous le voyez, cette fonction va renvoyer un string correspond au coup choisi par l'algorithme. Commencez l'implémentation de cette fonction avec la déclaration de 4 variables :
Random r = new Random(); int pierre = 0; int ciseaux = 0; int papier = 0;Le premier objet va simplement permettre (plus tard) de générer un nombre aléatoire quand l'algorithme hésitera. Les 3 variables suivantes sont celles qui vont permettre de faire les statistiques des coups joués après la séquence couramment analysée. Faites ensuite cette boucle :
for (int i = pattern.Length - 1; i >= 0; --i)
{
}
Cette boucle va permettre de remonter la liste des combinaisons depuis la fin jusqu'au début afin de rechercher les séquences. Dans cette boucle, déclarez ces 3 objets :
string sequenceAChercher = pattern.Substring(i); string chaineAnalysee = pattern.Substring(0, i); List<string> lstOccurence = new List<string>();La variable sequenceAChercher va contenir la sous-chaine de la combinaison depuis la valeur de i à la fin de cette chaine. Etant donné que i démarre avant le dernier caractère de la combinaison et va, au maximum, jusqu'au début de celle-ci, vous aurez facilement compris que cette variable va contenir la séquence de coup à rechercher dans la combinaison. Cette chaine ne devra être recherchée que dans la partie de la combinaison se trouvant avant cette séquence en question, nous plaçons donc cette partie de la combinaison dans la variable chaineAnalysee. Enfin, nous créons une liste qui va permettre de retenir les différents coups joués après la séquence recherchée dans la combinaison. Tapez ensuite :
for (int x = 0; x < pattern.Length - sequenceAChercher.Length; ++x) if (pattern.Substring(x, sequenceAChercher.Length) == sequenceAChercher) lstOccurence.Add(pattern.Substring(x + sequenceAChercher.Length, 2));Cette boucle va nous permettre de parcourir toute la chaine dans laquelle nous devons rechercher les séquences. Si jamais cette séquence est trouvée, nous ajoutons les deux coups suivants dans la liste. Tapez ensuite :
string[] occurence = lstOccurence.ToArray(); if (occurence.Length == 0) break; papier = 0; pierre = 0; ciseaux = 0;Pour plus de facilité, nous convertissons la liste remplie précédemment en un tableau de string nommé occurence. Si ce tableau est vide, cela signifie que la séquence n'a pas été trouvé dans la sous-chaine, nous sortons donc de la boucle for. Si ce n'est pas le cas, nous mettons les statistiques à 0. Tapez ensuite cette boucle :
for (int x = 0; x < occurence.Length; ++x)
{
if (occurence[x][1] == 'p')
papier++;
else if (occurence[x][1] == 'r')
pierre++;
else ciseaux++;
}
Ici, cette boucle est assez simple. Elle va parcourir l'ensemble des coups joués et elle va analyser le deuxième caractère de ces coups car celui-ci correspond à celui joué par l'utilisateur. Selon ce coup, cette boucle va incrémenter la variable correspondant au coup. Dans l'ensemble, la boucle for (celle se basant sur la variable i) est assez simple. Elle va remonter dans la combinaison et rechercher les séquences de coups. Au fur et à mesure, cette boucle va remettre les statistiques à 0 et les mettre à jour selon la séquence analysée. La boucle va bien veiller à se terminer si la séquence n'a pas été trouvée. Effectivement, si la boucle ne se terminait pas prématurément dans ce cas, les statistiques seraient remises à 0. Tapez ensuite ceci :
List<string> possibilite = new List<string> { "P", "R", "S" };
if (pierre == 0 && papier == 0 && ciseaux == 0)
return possibilite[r.Next(0, 2)];
int max = Math.Max(pierre, Math.Max(papier, ciseaux));
if (pierre != max)
possibilite.RemoveAt(possibilite.IndexOf("P"));
if (ciseaux != max)
possibilite.RemoveAt(possibilite.IndexOf("R"));
if (papier != max)
possibilite.RemoveAt(possibilite.IndexOf("S"));
return possibilite[r.Next(0, possibilite.Count - 1)];
Ici, c'est assez simple encore une fois. La liste va simplement contenir la liste des coups que l'algorithme a actuellement la possibilité de jouer. Si les trois variables contiennent 0 (dans le cas du premier coup par exemple), l'algorithme va générer un nombre entre 0 et 2 et renvoyer le coup correspondant à cet index de la liste. Ici, c'est donc le cas où l'algorithme n'a pas pu déterminer un coup valable, généralement c'est lors du premier coup. Ensuite, nous déterminons la valeur la plus grande de celles contenues dans les 3 variables pour connaitre la plus grande possibilité qu'un certain coup soit joué. Les 3 conditions suivantes sont assez similaires. La première regarde si la probabilité contenue dans la variable pierre est différente de la plus grande probabilité récéupérée précédemment. Si elle est bien différente, cela veut dire que ce n'est pas le coup pierre qui a le plus de chance d'être joué par l'utilisateur. Nous supprimons donc la valeur P de la liste des coups envisageables par l'algorithme. Le coup pierre (R) ne peut être battu que par papier (P), c'est donc pour cela que nous enlevons P de la liste. Les deux conditions suivantes font pareils mais avec les deux autres coups.
Ensuite, nous générons un nombre aléatoire qui va nous permettre de sélectionner un coup dans la liste des coups possibles pour l'algorithme. Nous générons un nombre aléatoire car il peut arriver que deux coups aient la même probabilité d'être joué par l'utilisateur, l'algorithme devra alors choisir un coup aléatoirement.
Et voilà, notre petit programme est terminé, testez le, vous verrez, si vous avez le dessus dans les premiers coups, vous vous ferez vite dépasser par l'algorithme ;-) Veuillez vous identifier ou vous inscrire pour donner une note à cet article.
Veuillez vous identifier ou vous inscrire pour réagir à cet article.
yasine motamassik (24/01/2012 - 20:08)
algorithme de conversion un nombre toute en lettre
EXAMPLE :1544 ------> mille cinq cent quarante quatre