/// <summary> /// Joue tous les plis d'une partie afin de déterminer le vainqueur /// </summary> /// <param name="joueurs">La liste des joueurs participants. Pour notre GUI il vaut mieux se limiter à 2 joueurs</param> /// <returns>Le Joueur gagnant de la partie</returns> private Joueur JouerPartie(List <Joueur> joueurs) { int i = 1; bool jouer = true; Joueur gagnant = null; while (jouer) { // On limite le nombre de pli à 1000 ce qui donne des parties de 1 minute environ if (i >= 1000) { jouer = false; gagnant = null; } i++; // On laisse au système un peu de temps pour gérer les taches courantes System.Threading.Thread.Sleep(5); // On vérifie si l'un des joueur n'a plus de carte ce qui signifie alors que l'on a un gagnant if ((joueurs[0].Main.Count() == 0)) { jouer = false; gagnant = joueurs[1]; } else if (joueurs[1].Main.Count() == 0) { jouer = false; gagnant = joueurs[0]; } // Si on a pas de gagnant il faut continuer à jouer if (jouer) { Stack <Carte> pliActuelle = new Stack <Carte>(); Stack <Carte> batailleActuelle = new Stack <Carte>(); PliGainedEventArgs args = new PliGainedEventArgs(); int perdantPli; // On joue un pli int gagnantPli = JouerPli(joueurs, ref pliActuelle, ref batailleActuelle); // On prépare les données qui seront envoyer dans l'événement PliGained args.Gagnant = joueurs[gagnantPli]; // On calcule qui est le perdant if (gagnantPli == 0) { perdantPli = 1; } else { perdantPli = 0; } args.Perdant = joueurs[perdantPli]; // On crée des copie des Stack pour pouvoir utiliser Pop() sans vider les Stack utilisés dans la Bataille args.Pli = new Stack <Carte>(pliActuelle); args.Bataille = new Stack <Carte>(batailleActuelle); args.Joueurs = joueurs; // On génère l'événement PliGained OnGained(args); // On donne les cartes en jeux au vainqueur foreach (Carte carte in pliActuelle) { joueurs[gagnantPli].Main.Enqueue(carte); } foreach (Carte carte in batailleActuelle) { joueurs[gagnantPli].Main.Enqueue(carte); } } } return(gagnant); }
/// <summary> /// Créateur standard utilisé uniquement à des fins de test /// </summary> public Bataille() { joueur1 = new Joueur("Toto"); joueur2 = new Joueur("Titi"); }
/// <summary> /// Créé une instance de la classe Bataille afin de pouvoir lancer une partie en appuyyant sur Run /// </summary> /// <param name="nameJ1">Nom du joueur 1</param> /// <param name="nameJ2">Nom du joueur 2</param> public Bataille(string nameJ1, string nameJ2) { joueur1 = new Joueur(nameJ1); joueur2 = new Joueur(nameJ2); }
/// <summary> /// Appelé lors du lancement du thread BackgroundWorker /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void tb_DoWork(object sender, DoWorkEventArgs e) { gagnant = bataille.Run(); // On lance la bataille qui va durer un certain temps dans notre thread en tache de fond }