using System; using System.Collections.Generic; using OrderStacks.model.card; using OrderStacks.model.deck; using OrderStacks.model.@event; using OrderStacks.model.piles; namespace OrderStacks.model.gameActions.abstractRules { public abstract class GameMode { protected List gameActions; public Piles Piles { get; protected set; } public int NbCardAtBeginOfTurn { get; set; } protected Deck deck; protected int nbMaxCard; protected bool end; public string Message { get; set; } = ""; #region public event EventHandler EndGame; public event EventHandler PlayerChanged; protected internal void OnEndGame(EventArgs args) { EndGame?.Invoke(this, args); } protected internal void OnPlayerChanged(PlayerChangedEventArgs args) { PlayerChanged?.Invoke(this, args); } #endregion /** * Deck de carte * Piles du jeu * * Constructeur */ protected GameMode(Piles piles, Deck deck) { gameActions = new List(); Piles = piles; this.deck = deck; } /** * Nombre de joueur * Pseudo du/des joueur(s) * * Fonction permettant de charger les paramètres de jeu */ public abstract void load(int nbPlayer, List players); protected void defineNbMaxCard(int nbPlayer) { switch (nbPlayer) { case 1: nbMaxCard = 8; NbCardAtBeginOfTurn = 8; break; case 2: nbMaxCard = 7; NbCardAtBeginOfTurn = 7; break; default: nbMaxCard = 6; NbCardAtBeginOfTurn = 6; break; } } /** * Liste de carte * Index de départ * Index de fin * * Fonction de tri */ protected void quickSort(List ar, int start, int end) { if (start < end) { Card pivot = ar[end]; int pIndex = start; Card swap; for (int i = start; i < end; i++) { if (ar[i].Value.CompareTo(pivot.Value) < 0) { swap = ar[pIndex]; ar[pIndex] = ar[i]; ar[i] = swap; pIndex++; } } ar[end] = ar[pIndex]; ar[pIndex] = pivot; quickSort(ar, start, pIndex - 1); quickSort(ar, pIndex + 1, end); } } /** * Liste de joueur * * Fonction permettant de distribuer les cartes en début de partie */ protected void distribueCard(List players) { players.ForEach(player => { for (int i = 0; i < nbMaxCard; i++) { int r = new Random().Next(0, deck.size() - 1); player.pioche(deck.getCard(r)); deck.removeAt(r); } List cards = player.getCardList(); quickSort(cards, 0, cards.Count - 1); }); } /** * Liste de carte du joueur actif * Joueur actif * * Fonction permettant au joueur actif de piocher une carte */ public abstract void pioche(List currentHand, Player player); /** * Joueur actif * Liste de carte du joeuur actif * Liste des cartes jouées durant le tour du joueur actif * Pile séléctionnée * Valeur de la carte en train d'être joué * * Fonction permettant de tenter de jouer une carte * * Booléen de carte joué */ public abstract bool playCard(decimal valueCard, List currentHand, int orderedStackSelected, Player player, List CurrentCardPlayed); /** * Liste de carte du joueur actif * Liste des cartes jouées durant le tour du joueur actif * Joueur actif * * Fonction permettant de lancer la fin du tour et de vérifier la fin du jeu * * Booléen de fin de jeu */ public abstract bool endTurn(List currentHand, List CurrentCardPlayed, Player player); /** * Liste de carte du joueur actif * * Fonction permettant de vérifier si c'est la fin du jeu */ public abstract void TestEndGame(List currentHand); /** * Fonction permettant de retourner le nombre de carte du deck * * Nombre de carte dans le deck */ public int getScore() { return deck.size(); } } }