using System; using System.Collections.Generic; using TheGameExtreme.model.card; using TheGameExtreme.model.deck; using TheGameExtreme.model.@event; using TheGameExtreme.model.piles; namespace TheGameExtreme.model.gameActions.classic { public class GameMode { protected List gameActions; public Piles Piles { get; protected set; } public int NbCardAtBeginOfTurn { get; set; } protected Deck deck; protected int nbMaxCard; 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 public GameMode(Piles piles, Deck deck) { gameActions = new List(); Piles = piles; this.deck = deck; } public void load(int nbPlayer, List players) { gameActions.Add(new Piocher(Piles)); gameActions.Add(new JouerUneCarte(Piles)); gameActions.Add(new TerminerSonTour(Piles)); defineNbMaxCard(nbPlayer); distribueCard(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; } } protected void quickSort(List ar, int start, int end) { if (start < end) { decimal pivot = ar[end].Value; int pIndex = start; decimal swap; for (int i = start; i < end; i++) { if (ar[i].Value < pivot) { swap = ar[pIndex].Value; ar[pIndex].Value = ar[i].Value; ar[i].Value = swap; pIndex++; } } ar[end].Value = ar[pIndex].Value; ar[pIndex].Value = pivot; quickSort(ar, start, pIndex - 1); quickSort(ar, pIndex + 1, end); } } 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); }); } public void pioche(List currentHand, Player player) { Message = null; ((Piocher)gameActions[0]).pioche(currentHand, deck, player, nbMaxCard); quickSort(currentHand, 0, currentHand.Count - 1); } public bool playCard(decimal valueCard, List currentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) { Message = null; if (((JouerUneCarte)gameActions[1]).play(valueCard, currentHand, orderedStackSelected, player, CurrentCardPlayed)) { return true; } else { Message = ((JouerUneCarte)gameActions[1]).ErrorMessage; return false; } } public bool endTurn(List currentHand, List CurrentCardPlayed, Player player) { Message = null; if (((TerminerSonTour)gameActions[2]).end(currentHand, NbCardAtBeginOfTurn, CurrentCardPlayed)) { pioche(currentHand, player); CurrentCardPlayed.Clear(); OnPlayerChanged(null); if (((TerminerSonTour)gameActions[2]).Test(currentHand)) { return false; } else { OnEndGame(new EventArgs()); return true; } } else { Message = ((TerminerSonTour)gameActions[2]).ErrorMessage; return false; } } public string getScore() { return deck.size().ToString(); } #region Decaler dans un GameAction public bool isEndGame(List currentHand) { if (currentHand.Count != 0) { List playableCard = new List(); tryToFindSoluce(playableCard, currentHand); return testEndGame(playableCard); } return false; } protected void tryToFindSoluce(List playableCard, List currentHand) { currentHand.ForEach(card => { if (card.Value > Piles.getStack(0).Peek().Value || card.Value > Piles.getStack(1).Peek().Value || card.Value < Piles.getStack(2).Peek().Value || card.Value < Piles.getStack(3).Peek().Value) { playableCard.Add(card); } }); } protected bool testEndGame(List playableCard) { if (playableCard.Count < 2) { Message = "Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!"; return true; } return false; } #endregion } }