From 6bba3c9cb210fa59a704890cd94c7f65510be2a5 Mon Sep 17 00:00:00 2001 From: cldupland Date: Fri, 8 Nov 2019 09:52:53 +0100 Subject: [PATCH] Avancement sur le remodelamodelage du model --- TheGameExtreme/model/gameActions/Piles.cs | 2 +- .../model/gameActions/classic/GameMode.cs | 270 ++++++++++++------ .../gameActions/classic/JouerUneCarte.cs | 16 +- .../model/gameActions/classic/Piocher.cs | 17 +- .../gameActions/classic/TerminerSonTour.cs | 53 +++- TheGameExtreme/model/manager/GameManager.cs | 54 +--- .../model/rule/endTurnRules/CompleteHand.cs | 2 +- TheGameExtreme/view/MainPage.xaml.cs | 16 +- TheGameExtreme/viewmodel/Main.cs | 94 +++--- 9 files changed, 336 insertions(+), 188 deletions(-) diff --git a/TheGameExtreme/model/gameActions/Piles.cs b/TheGameExtreme/model/gameActions/Piles.cs index 30c0a46..911006e 100644 --- a/TheGameExtreme/model/gameActions/Piles.cs +++ b/TheGameExtreme/model/gameActions/Piles.cs @@ -7,7 +7,7 @@ namespace TheGameExtreme.model.gameActions public class Piles { - public List> ListOrderedStacks { get; set; } + private List> ListOrderedStacks { get; set; } public Piles() { diff --git a/TheGameExtreme/model/gameActions/classic/GameMode.cs b/TheGameExtreme/model/gameActions/classic/GameMode.cs index ddbfa25..f9cf4b9 100644 --- a/TheGameExtreme/model/gameActions/classic/GameMode.cs +++ b/TheGameExtreme/model/gameActions/classic/GameMode.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using TheGameExtreme.model.card; +using TheGameExtreme.model.deck; +using TheGameExtreme.model.@event; using TheGameExtreme.model.gameActions; namespace TheGameExtreme.model.gameActions.classic @@ -10,117 +12,213 @@ namespace TheGameExtreme.model.gameActions.classic protected List gameActions; protected Piles piles; + public event EventHandler TopRangeChanged; + protected int nbCardAtBeginOfTurn = 7; + protected Deck deck; + private int nbMaxCard; public GameMode() { gameActions = new List(); + } + + public void load(int nbPlayer, List players) + { + piles = new Piles(); gameActions.Add(new Piocher(piles)); gameActions.Add(new JouerUneCarte(piles)); gameActions.Add(new TerminerSonTour(piles)); + + createDeck(); + defineNbMaxCard(nbPlayer); + distribueCard(players); } - public void load() + protected void createDeck() { - piles = new Piles(); + switch (true) + { + case false: + deck = new ClassicDeck(); + break; + + default: + deck = new ExtremeDeck(); + break; + } } - public void pioche() + protected void defineNbMaxCard(int nbPlayer) { - ((Piocher)gameActions[0]).pioche(); + switch (nbPlayer) + { + case 1: + nbMaxCard = 8; + break; + case 2: + nbMaxCard = 7; + break; + default: + nbMaxCard = 6; + break; + } + } + + protected void distribueCard(List players) + { + for (int i = 0; i < nbMaxCard; i++) + { + players.ForEach(player => + { + int r = new Random().Next(0, deck.size() - 1); + player.pioche(deck.getCard(r)); + deck.removeAt(r); + }); + } + } + + public void pioche(List CurrentHand, Player player) + { + ((Piocher)gameActions[0]).pioche(CurrentHand, deck, player); } public void playCard(int valueCard, List CurrentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) { - ((JouerUneCarte)gameActions[1]).play(valueCard, CurrentHand, orderedStackSelected, player, CurrentCardPlayed); - if (CurrentHand.Count == 0) + if (((JouerUneCarte)gameActions[1]).play(valueCard, CurrentHand, orderedStackSelected, player, CurrentCardPlayed)) { - endTurn(); // Presque bon, oublie juste d'afficher les nouvelles cartes + OnTopRangeChanged(new TopRangeChangedEventArgs(piles.getStack(orderedStackSelected).Peek(), ((JouerUneCarte)gameActions[1]).OldCard, orderedStackSelected)); } } - public void endTurn() + protected internal void OnTopRangeChanged(TopRangeChangedEventArgs args) { - ((TerminerSonTour)gameActions[2]).end(); + TopRangeChanged?.Invoke(this, args); } + public bool endTurn(List CurrentHand, List CurrentCardPlayed, Player player) + { + ((TerminerSonTour)gameActions[2]).end(CurrentHand, nbCardAtBeginOfTurn, CurrentCardPlayed); + pioche(CurrentHand, player); + //currentIndexPlayer += 1; + //if (currentIndexPlayer == playerList.Count) + //{ + // currentIndexPlayer = 0; + //} + //CurrentHand = playerList[currentIndexPlayer].getCardList(); + //OnPlayerChanged(new PlayerChangedEventArgs(CurrentHand, playerList[currentIndexPlayer].Pseudo)); + nbCardAtBeginOfTurn = CurrentHand.Count; + CurrentCardPlayed.Clear(); + //if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs + //{ + // displayWinner(); + // return true; + //} + //else + //{ + // return true; + //} + return false; // Changer + } + + //protected void displayWinner() + //{ + // if (win) + // { + // EndMessage = "Le jeu est terminé!\n Bravo vous avez gagné!"; + // EndMessage = AppRessource.StrWin; + // } + //} + + + + + + + + + + + + + + + // private List playRule = new List(); + // private List beforeEndTurnRule = new List(); + // private List endTurnRule = new List(); + // private List commonRule = new List(); + + // public GameMode() + // { + // } + + // public void addPlayRule(PlayRule rule) + // { + // playRule?.Add(rule); + // } + + // public void addEndTurnRule(EndTurnRule rule) + // { + // endTurnRule?.Add(rule); + // } + + // public void addBeforeEndTurnRule(BeforeEndTurnRule rule) + // { + // beforeEndTurnRule?.Add(rule); + // } + + // public void addCommonRule(Rule rule) + // { + // // Vérifier que se ne soit ni une PlayRule, ni une EndTurnRule ? + // commonRule?.Add(rule); + // } + + // public bool checkPlayRule(Card card, Stack orderedStack, bool bottomUp, List CurrentHand) + // { + // foreach(PlayRule rule in playRule) + // { + // if (rule.Test(card, orderedStack, bottomUp, CurrentHand)) // Gestion des messages pour savoir qu'elle règle n'est pas respecter. + // { + // return true; + // } + // } + // foreach (Rule rule in commonRule) + // { + + // } + // return false; + // } + + // public bool checkBeforeEndTurnRule(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand) + // { + // foreach (BeforeEndTurnRule rule in beforeEndTurnRule) + // { + // if (!rule.Test(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) // Gestion des messages pour savoir qu'elle règle n'est pas respecter. + // { + // return false; + // } + // } + // foreach (Rule rule in commonRule) + // { + + // } + // return true; + // } + + // public bool checkEndTurnRule(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand) + // { + // foreach (EndTurnRule rule in endTurnRule) + // { + // if (!rule.Test(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) // Gestion des messages pour savoir qu'elle règle n'est pas respecter. + // { + // return false; + // } + // } + // foreach (Rule rule in commonRule) + // { - // private List playRule = new List(); - // private List beforeEndTurnRule = new List(); - // private List endTurnRule = new List(); - // private List commonRule = new List(); - - // public GameMode() - // { - // } - - // public void addPlayRule(PlayRule rule) - // { - // playRule?.Add(rule); - // } - - // public void addEndTurnRule(EndTurnRule rule) - // { - // endTurnRule?.Add(rule); - // } - - // public void addBeforeEndTurnRule(BeforeEndTurnRule rule) - // { - // beforeEndTurnRule?.Add(rule); - // } - - // public void addCommonRule(Rule rule) - // { - // // Vérifier que se ne soit ni une PlayRule, ni une EndTurnRule ? - // commonRule?.Add(rule); - // } - - // public bool checkPlayRule(Card card, Stack orderedStack, bool bottomUp, List CurrentHand) - // { - // foreach(PlayRule rule in playRule) - // { - // if (rule.Test(card, orderedStack, bottomUp, CurrentHand)) // Gestion des messages pour savoir qu'elle règle n'est pas respecter. - // { - // return true; - // } - // } - // foreach (Rule rule in commonRule) - // { - - // } - // return false; - // } - - // public bool checkBeforeEndTurnRule(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand) - // { - // foreach (BeforeEndTurnRule rule in beforeEndTurnRule) - // { - // if (!rule.Test(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) // Gestion des messages pour savoir qu'elle règle n'est pas respecter. - // { - // return false; - // } - // } - // foreach (Rule rule in commonRule) - // { - - // } - // return true; - // } - - // public bool checkEndTurnRule(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand) - // { - // foreach (EndTurnRule rule in endTurnRule) - // { - // if (!rule.Test(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) // Gestion des messages pour savoir qu'elle règle n'est pas respecter. - // { - // return false; - // } - // } - // foreach (Rule rule in commonRule) - // { - - // } - // return true; - // } + // } + // return true; + // } } } diff --git a/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs index cec789a..2ef14e2 100644 --- a/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs +++ b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs @@ -7,11 +7,13 @@ namespace TheGameExtreme.model.gameActions.classic public class JouerUneCarte : GameAction { + public Card OldCard { get; set; } + public JouerUneCarte(Piles ListOrderedStacks) : base(ListOrderedStacks) { } - public void play(int valueCard, List CurrentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) + public bool play(int valueCard, List CurrentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) { foreach (Card card in CurrentHand) { @@ -21,30 +23,32 @@ namespace TheGameExtreme.model.gameActions.classic { if (orderedStackSelected < 2) { - rule(card, ListOrderedStacks.getStack(orderedStackSelected), true, player, CurrentCardPlayed); + return rule(card, ListOrderedStacks.getStack(orderedStackSelected), true, player, CurrentCardPlayed); } else { - rule(card, ListOrderedStacks.getStack(orderedStackSelected), false, player, CurrentCardPlayed); + return rule(card, ListOrderedStacks.getStack(orderedStackSelected), false, player, CurrentCardPlayed); } } else { throw new Exception(AppRessource.StrCantGetStack); } - return; } } + return false; } - private void rule(Card card, Stack stack, bool bottomUp, Player player, List CurrentCardPlayed) + private bool rule(Card card, Stack stack, bool bottomUp, Player player, List CurrentCardPlayed) { if ((bottomUp && card.Value > stack.Peek().Value) || (!bottomUp && card.Value < stack.Peek().Value) || card.Value == stack.Peek().Value - 10 || card.Value == stack.Peek().Value + 10) { - Card oldCard = stack.Peek(); + OldCard = stack.Peek(); player.joue(card); CurrentCardPlayed.Add(card); stack.Push(card); + + return true; //OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack))); } else diff --git a/TheGameExtreme/model/gameActions/classic/Piocher.cs b/TheGameExtreme/model/gameActions/classic/Piocher.cs index 3f16e3e..b6e9f3b 100644 --- a/TheGameExtreme/model/gameActions/classic/Piocher.cs +++ b/TheGameExtreme/model/gameActions/classic/Piocher.cs @@ -6,6 +6,9 @@ namespace TheGameExtreme.model.gameActions.classic { public class Piocher : GameAction { + + protected int nbMaxCard = 7; // Changer + public Piocher(Piles ListOrderedStacks) : base(ListOrderedStacks) { } @@ -15,9 +18,19 @@ namespace TheGameExtreme.model.gameActions.classic return true; } - public void pioche() + public void pioche(List CurrentHand, Deck deck, Player player) { - + int nbPickedCard = nbMaxCard - CurrentHand.Count; + for (int i = 0; i < nbPickedCard; i++) + { + if (deck.size() == 0) + { + return; + } + int random = new Random().Next(0, deck.size() - 1); + player.pioche(deck.getCard(random)); + deck.removeAt(random); + } } } } diff --git a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs index 4117899..a0bcb6c 100644 --- a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs +++ b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs @@ -1,4 +1,8 @@ using System; +using System.Collections.Generic; +using TheGameExtreme.model.card; +using TheGameExtreme.model.card.rapidCard; + namespace TheGameExtreme.model.gameActions.classic { public class TerminerSonTour : GameAction @@ -7,9 +11,56 @@ namespace TheGameExtreme.model.gameActions.classic { } - public void end() + public bool end(List CurrentHand, int nbCardAtBeginOfTurn, List CurrentCardPlayed) { + // Si carte qui fait piocher que d'un, vérifier la bonne pioche (penser si elle vient d'être recouverte) + // Sinon + if (nbCardAtBeginOfTurn == CurrentCardPlayed.Count || CurrentHand.Count == 0 || (nbCardAtBeginOfTurn - CurrentHand.Count) >= 2) + { // Ne pas oublié de gérer les ThreeCard + return Test(CurrentHand); + } + return false; + } + + public bool Test(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 > ListOrderedStacks.getStack(0).Peek().Value || card.Value > ListOrderedStacks.getStack(1).Peek().Value || card.Value < ListOrderedStacks.getStack(2).Peek().Value || card.Value < ListOrderedStacks.getStack(3).Peek().Value) + { + playableCard.Add(card); + } + }); + } + + protected bool testEndGame(List playableCard) + { + if (playableCard.Count == 2) + { + foreach (Card c in playableCard) + { + if (Equals(c.getName(), ThreeCard.CARD_THREE)) + { + return false; + } + } + } + else if (playableCard.Count < 2) + { + return false; + } + return true; } } } diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index 8a840a6..c5e1fa3 100644 --- a/TheGameExtreme/model/manager/GameManager.cs +++ b/TheGameExtreme/model/manager/GameManager.cs @@ -17,7 +17,6 @@ namespace TheGameExtreme.model.manager /* GameMaster implémente un mode de jeu (classe fille de gameMode qui connait les actions a effectué en fonction du mode de jeu */ protected GameMode gameMode; - protected Deck deck; public readonly int nbPlayer; protected List players = new List(); public event EventHandler TopRangeChanged; @@ -39,63 +38,28 @@ namespace TheGameExtreme.model.manager playersNames.ForEach(playerName => players.Add(new Player(playerName))); this.gameMode = gameMode; - gameMode.load(); + gameMode.load(nbPlayer, players); - ListOrderedStacks = new Piles(); - - createDeck(); - defineNbMaxCard(); - distribueCard(); + gameMode.TopRangeChanged += OnTopRangeChanged; CurrentHand = players[0].getCardList(); } - protected void createDeck() - { - switch (true) - { - case false: - deck = new ClassicDeck(); - break; - - default: - deck = new ExtremeDeck(); - break; - } - } + - protected void defineNbMaxCard() + public void joue(int valueCard, int orderedStackSelected) { - switch (nbPlayer) - { - case 1: - nbMaxCard = 8; - break; - case 2: - nbMaxCard = 7; - break; - default: - nbMaxCard = 6; - break; - } + gameMode.playCard(valueCard, CurrentHand, orderedStackSelected, players[0], CurrentCardPlayed); // Mettre le joueur actif } - protected void distribueCard() + public bool endTurn() { - for (int i = 0; i < nbMaxCard; i++) - { - players.ForEach(player => - { - int r = new Random().Next(0, deck.size() - 1); - player.pioche(deck.getCard(r)); - deck.removeAt(r); - }); - } + return gameMode.endTurn(CurrentHand, CurrentCardPlayed, players[0]); // Mettre le joueur actif } - public void joue(int valueCard, int orderedStackSelected) + public void OnTopRangeChanged(object source, TopRangeChangedEventArgs args) { - gameMode.playCard(valueCard, CurrentHand, orderedStackSelected, players[0], CurrentCardPlayed); // Mettre le joueur actif + TopRangeChanged?.Invoke(this, args); } diff --git a/TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs b/TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs index 6c73a77..fef0c49 100644 --- a/TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs +++ b/TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs @@ -11,7 +11,7 @@ namespace TheGameExtreme.model.rule.endTurnRules public override bool Test(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand) { - // Si carte qui fait piocher que d'un vérifier la bonne pioche (penser si elle vient d'être recouverte) + // Si carte qui fait piocher que d'un, vérifier la bonne pioche (penser si elle vient d'être recouverte) // Sinon if (nbCardAtBeginOfTurn == CurrentCardPlayed.Count) { diff --git a/TheGameExtreme/view/MainPage.xaml.cs b/TheGameExtreme/view/MainPage.xaml.cs index 0c5e5e0..0468ab0 100644 --- a/TheGameExtreme/view/MainPage.xaml.cs +++ b/TheGameExtreme/view/MainPage.xaml.cs @@ -145,14 +145,14 @@ namespace TheGameExtreme.view private void endTurn(object sender, EventArgs args) { - //if (viewmodel.endTurn()) - //{ - // botPanel.Children.Add(button); - //} - //else - //{ - // inflateHand(); - //} + if (viewmodel.endTurn()) + { + botPanel.Children.Add(button); + } + else + { + inflateHand(); + } } } } diff --git a/TheGameExtreme/viewmodel/Main.cs b/TheGameExtreme/viewmodel/Main.cs index 5bc04e3..34b9085 100644 --- a/TheGameExtreme/viewmodel/Main.cs +++ b/TheGameExtreme/viewmodel/Main.cs @@ -113,44 +113,62 @@ namespace TheGameExtreme.viewmodel //} } - ///** - // * - // * - // * @return booléen de fin de jeu - // */ - //private bool playOneCard(int numStack, int valueCard) - //{ - // try - // { - // gameManager.joue(valueCard, numStack); - // if (gameManager.EndMessage != null) - // { - // Alert = gameManager.EndMessage; - // return true; - // } - // } - // catch(Exception e) - // { - // // Faire un toast - // Alert = e.Message; - // } - // return false; - //} + public bool endTurn() + { + try + { + bool isEnd = gameManager.endTurn(); + Alert = gameManager.EndMessage; + return isEnd; + } + catch (Exception e) + { + Alert = e.Message; + return false; + } + } - //public bool endTurn() - //{ - // try - // { - // bool isEnd = gameManager.endTurn(); - // Alert = gameManager.EndMessage; - // return isEnd; - // } - // catch(Exception e) - // { - // Alert = e.Message; - // return false; - // } - //} - } + + + ///** + // * + // * + // * @return booléen de fin de jeu + // */ + //private bool playOneCard(int numStack, int valueCard) + //{ + // try + // { + // gameManager.joue(valueCard, numStack); + // if (gameManager.EndMessage != null) + // { + // Alert = gameManager.EndMessage; + // return true; + // } + // } + // catch(Exception e) + // { + // // Faire un toast + // Alert = e.Message; + // } + // return false; + //} + + //public bool endTurn() + //{ + // try + // { + // bool isEnd = gameManager.endTurn(); + // Alert = gameManager.EndMessage; + // return isEnd; + // } + // catch(Exception e) + // { + // Alert = e.Message; + // return false; + // } + //} + + } }