using System; using System.Collections.Generic; using TheGameExtreme.model.card; using TheGameExtreme.model.deck; using TheGameExtreme.model.@event; using TheGameExtreme.model.rule.endRule; using TheGameExtreme.model.rule.playRules; namespace TheGameExtreme.model.manager { public abstract class GameManager { public readonly int nbPlayer; protected int nbMaxCard; protected int currentIndexPlayer; protected List playerList = new List(); public List> ListOrderedStacks { get; set; } protected Deck deck; protected bool win = true; public String EndMessage { get; set; } public event EventHandler TopRangeChanged; public event EventHandler PlayerChanged; public List CurrentHand { get; set; } protected int nbCardAtBeginOfTurn; protected List CurrentCardPlayed = new List(); protected string langue; protected GameMode gameMode; protected GameManager(int nbPlayer, List players) { ListOrderedStacks = new List>(); CurrentHand = new List(); this.nbPlayer = nbPlayer; players.ForEach(player => playerList.Add(new Player(player))); ListOrderedStacks.Add(new Stack()); ListOrderedStacks.Add(new Stack()); ListOrderedStacks.Add(new Stack()); ListOrderedStacks.Add(new Stack()); for (int i = 0; i < 4; i++) { if (i < 2) { ListOrderedStacks[i].Push(new ClassicCard(1)); } else { ListOrderedStacks[i].Push(new ClassicCard(100)); } } gameMode = new GameMode(); gameMode.addPlayRule(new Ascendant()); gameMode.addPlayRule(new Descendant()); gameMode.addPlayRule(new PasDeDix()); gameMode.addEndTurnRule(new EndGame(ListOrderedStacks)); gameMode.addEndTurnRule(new VoidDeck()); gameMode.addEndTurnRule(new VoidHand()); createDeck(); defineNbMaxCard(); distribueCard(); CurrentHand = playerList[currentIndexPlayer].getCardList(); nbCardAtBeginOfTurn = CurrentHand.Count; } protected void createDeck() { switch (true) { case false: deck = new ClassicDeck(); break; default: deck = new ExtremeDeck(); break; } } protected void defineNbMaxCard() { switch (nbPlayer) { case 1: nbMaxCard = 8; break; case 2: nbMaxCard = 7; break; default: nbMaxCard = 6; break; } } protected void distribueCard() { for (int i = 0; i < nbMaxCard; i++) { playerList.ForEach(player => { int r = new Random().Next(0, deck.size() - 1); player.pioche(deck.getCard(r)); deck.removeAt(r); }); } } public void joue(int valueCard, int orderedStackSelected) { if (EndMessage != null) { //throw new Exception("Le jeu est fini! Veuillez lancer une nouvelle partie!"); throw new Exception(AppRessource.StrEndOfGame); } foreach(Card card in CurrentHand) { if (valueCard == card.Value) { if (orderedStackSelected >= 0 && orderedStackSelected < 4) { if (orderedStackSelected < 2) { testPossibility(card, ListOrderedStacks[orderedStackSelected], true); } else { testPossibility(card, ListOrderedStacks[orderedStackSelected], false); } } else { throw new Exception(AppRessource.StrCantGetStack); } return; } } } protected void testPossibility(Card card, Stack orderedStack, bool bottomUp) { if (gameMode.checkPlayRule(card, orderedStack, bottomUp)) { Card oldCard = orderedStack.Peek(); playerList[currentIndexPlayer].joue(card); CurrentCardPlayed.Add(card); orderedStack.Push(card); OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack))); if (CurrentHand.Count == 0) { endTurn(); // Presque bon, oublie juste d'afficher les nouvelles cartes } } else { throw new Exception(AppRessource.StrWrongStack); } //if ((bottomUp && card.Value > orderedStack.Peek().Value) || (!bottomUp && card.Value < orderedStack.Peek().Value) || card.Value == orderedStack.Peek().Value + 10 || card.Value == orderedStack.Peek().Value - 10) //{ // Card oldCard = orderedStack.Peek(); // playerList[currentIndexPlayer].joue(card); // CurrentCardPlayed.Add(card); // orderedStack.Push(card); // OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack))); //} //else //{ // throw new Exception(AppRessource.StrWrongStack); //} } protected internal void OnTopRangeChanged(TopRangeChangedEventArgs args) { TopRangeChanged?.Invoke(this, args); } protected internal void OnPlayerChanged(PlayerChangedEventArgs args) { PlayerChanged?.Invoke(this, args); } public bool isCanPlay() { if (CurrentHand.Count > 0) { return true; } else { return false; } } abstract public bool endTurn(); abstract protected void pioche(); abstract protected bool isEndGame(); abstract protected void tryToFindSoluce(List playableCard); abstract protected bool testEndGame(List playableCard); abstract protected bool effectLose(); public int getCurentIndexPlayer() { return currentIndexPlayer; } } }