From 8092190f3c00657fd8cfdd72d95dde260110c62f Mon Sep 17 00:00:00 2001 From: cldupland Date: Thu, 7 Nov 2019 16:07:33 +0100 Subject: [PATCH 1/7] Debut de la reconstruction du model --- TheGameExtreme/TheGameExtreme.csproj | 3 + TheGameExtreme/model/GameMode.cs | 92 -------------- .../model/gameActions/GameAction.cs | 10 ++ .../model/gameActions/classic/GameMode.cs | 115 ++++++++++++++++++ .../gameActions/classic/JouerUneCarte.cs | 15 +++ .../model/gameActions/classic/Piocher.cs | 20 +++ .../gameActions/classic/TerminerSonTour.cs | 15 +++ .../extreme/ExtremeJouerUneCarte.cs | 10 ++ .../model/gameActions/extreme/ExtremeMode.cs | 14 +++ .../gameActions/extreme/ExtremePiocher.cs | 10 ++ .../extreme/ExtremeTerminerSonTour.cs | 10 ++ TheGameExtreme/model/manager/GameManager.cs | 72 +++++------ .../model/manager/SoloGameManager.cs | 66 +++++----- 13 files changed, 291 insertions(+), 161 deletions(-) delete mode 100644 TheGameExtreme/model/GameMode.cs create mode 100644 TheGameExtreme/model/gameActions/GameAction.cs create mode 100644 TheGameExtreme/model/gameActions/classic/GameMode.cs create mode 100644 TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs create mode 100644 TheGameExtreme/model/gameActions/classic/Piocher.cs create mode 100644 TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs create mode 100644 TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs create mode 100644 TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs create mode 100644 TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs create mode 100644 TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs diff --git a/TheGameExtreme/TheGameExtreme.csproj b/TheGameExtreme/TheGameExtreme.csproj index 794e9f5..ee43505 100644 --- a/TheGameExtreme/TheGameExtreme.csproj +++ b/TheGameExtreme/TheGameExtreme.csproj @@ -19,6 +19,9 @@ + + + diff --git a/TheGameExtreme/model/GameMode.cs b/TheGameExtreme/model/GameMode.cs deleted file mode 100644 index 0aeb0ae..0000000 --- a/TheGameExtreme/model/GameMode.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; -using TheGameExtreme.model.rule; -using TheGameExtreme.model.rule.beforeEndTurnRules; -using TheGameExtreme.model.rule.endTurnRules; -using TheGameExtreme.model.rule.playRules; - -namespace TheGameExtreme.model -{ - public class GameMode - { - - 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; - } - } -} diff --git a/TheGameExtreme/model/gameActions/GameAction.cs b/TheGameExtreme/model/gameActions/GameAction.cs new file mode 100644 index 0000000..b2e9acc --- /dev/null +++ b/TheGameExtreme/model/gameActions/GameAction.cs @@ -0,0 +1,10 @@ +using System; +namespace TheGameExtreme.model.gameActions +{ + public class GameAction + { + public abstract GameAction() + { + } + } +} diff --git a/TheGameExtreme/model/gameActions/classic/GameMode.cs b/TheGameExtreme/model/gameActions/classic/GameMode.cs new file mode 100644 index 0000000..0c8aec8 --- /dev/null +++ b/TheGameExtreme/model/gameActions/classic/GameMode.cs @@ -0,0 +1,115 @@ +using System; +using System.Collections.Generic; +using TheGameExtreme.model.gameActions; + +namespace TheGameExtreme.model.gameActions.classic +{ + public class GameMode + { + + protected List gameActions; + + public GameMode() + { + gameActions = new List(); + + gameActions.Add(new Piocher()); + gameActions.Add(new JouerUneCarte()); + gameActions.Add(new TerminerSonTour()); + } + + public void pioche() + { + ((Piocher)gameActions[0]).pioche(); + } + + public void playCard() + { + ((JouerUneCarte)gameActions[0]).play(); + } + + public void endTurn() + { + ((TerminerSonTour)gameActions[0]).end(); + } + + + // 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; + // } + //} +} diff --git a/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs new file mode 100644 index 0000000..5d44832 --- /dev/null +++ b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs @@ -0,0 +1,15 @@ +using System; +namespace TheGameExtreme.model.gameActions.classic +{ + public class JouerUneCarte : GameAction + { + public JouerUneCarte() + { + } + + public void play() + { + + } + } +} diff --git a/TheGameExtreme/model/gameActions/classic/Piocher.cs b/TheGameExtreme/model/gameActions/classic/Piocher.cs new file mode 100644 index 0000000..ef602ac --- /dev/null +++ b/TheGameExtreme/model/gameActions/classic/Piocher.cs @@ -0,0 +1,20 @@ +using System; +namespace TheGameExtreme.model.gameActions.classic +{ + public class Piocher : GameAction + { + public Piocher() + { + } + + protected bool checkRule() + { + return true; + } + + public void pioche() + { + + } + } +} diff --git a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs new file mode 100644 index 0000000..e4d67e6 --- /dev/null +++ b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs @@ -0,0 +1,15 @@ +using System; +namespace TheGameExtreme.model.gameActions.classic +{ + public class TerminerSonTour : GameAction + { + public TerminerSonTour() + { + } + + public void end() + { + + } + } +} diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs b/TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs new file mode 100644 index 0000000..bd0081f --- /dev/null +++ b/TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs @@ -0,0 +1,10 @@ +using System; +namespace TheGameExtreme.model.gameActions.extreme +{ + public class ExtremeJouerUneCarte : JouerUneCarte + { + public ExtremeJouerUneCarte() + { + } + } +} diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs b/TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs new file mode 100644 index 0000000..65dc39b --- /dev/null +++ b/TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs @@ -0,0 +1,14 @@ +using System; + +namespace TheGameExtreme.model.gameActions.extreme +{ + public class ExtremeMode : GameMode + { + public ExtremeMode() + { + gameActions.Add(new ExtremePiocher()); + gameActions.Add(new ExtremeJouerUneCarte()); + gameActions.Add(new ExtremeTerminerSonTour()); + } + } +} diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs b/TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs new file mode 100644 index 0000000..6f74b9b --- /dev/null +++ b/TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs @@ -0,0 +1,10 @@ +using System; +namespace TheGameExtreme.model.gameActions.extreme +{ + public class ExtremePiocher : Piocher + { + public ExtremePiocher() + { + } + } +} diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs b/TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs new file mode 100644 index 0000000..39092d7 --- /dev/null +++ b/TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs @@ -0,0 +1,10 @@ +using System; +namespace TheGameExtreme.model.gameActions.extreme +{ + public class ExtremeTerminerSonTour : TerminerSonTour + { + public ExtremeTerminerSonTour() + { + } + } +} diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index d50d2ba..efd9fa2 100644 --- a/TheGameExtreme/model/manager/GameManager.cs +++ b/TheGameExtreme/model/manager/GameManager.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using TheGameExtreme.model.card; using TheGameExtreme.model.deck; using TheGameExtreme.model.@event; +using TheGameExtreme.model.gameActions; +using TheGameExtreme.model.gameActions.classic; using TheGameExtreme.model.rule.beforeEndTurnRules; using TheGameExtreme.model.rule.endTurnRules; using TheGameExtreme.model.rule.playRules; @@ -12,6 +14,35 @@ namespace TheGameExtreme.model.manager public abstract class GameManager { + /* 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 GameManager(GameMode gameMode) + { + this.gameMode = gameMode; + } + + + + + + + + + + + + + + + + + + + + public readonly int nbPlayer; protected int nbMaxCard; protected int currentIndexPlayer; @@ -27,8 +58,6 @@ namespace TheGameExtreme.model.manager protected List CurrentCardPlayed = new List(); protected string langue; - protected GameMode gameMode; - protected GameManager(int nbPlayer, List players) { @@ -71,19 +100,6 @@ namespace TheGameExtreme.model.manager } } - protected void initRule() - { - gameMode = new GameMode(); - gameMode.addPlayRule(new Ascendant()); - gameMode.addPlayRule(new Descendant()); - gameMode.addPlayRule(new PasDeDix()); - //gameMode.addPlayRule(new VoidHand()); - gameMode.addBeforeEndTurnRule(new NbCardPlay()); - gameMode.addEndTurnRule(new EndGame(ListOrderedStacks)); - //gameMode.addEndTurnRule(new VoidDeck()); - //gameMode.addEndTurnRule(new CompleteHand()); - } - protected void createDeck() { switch (true) @@ -159,31 +175,17 @@ namespace TheGameExtreme.model.manager protected void testPossibility(Card card, Stack orderedStack, bool bottomUp) { - if (gameMode.checkPlayRule(card, orderedStack, bottomUp, CurrentHand)) - { - 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) + //if (gameMode.checkPlayRule(card, orderedStack, bottomUp, CurrentHand)) //{ // 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 //{ @@ -215,8 +217,6 @@ namespace TheGameExtreme.model.manager abstract public bool endTurn(); - abstract protected void pioche(); - abstract protected bool isEndGame(); abstract protected void tryToFindSoluce(List playableCard); diff --git a/TheGameExtreme/model/manager/SoloGameManager.cs b/TheGameExtreme/model/manager/SoloGameManager.cs index 38d7b2b..9c25c99 100644 --- a/TheGameExtreme/model/manager/SoloGameManager.cs +++ b/TheGameExtreme/model/manager/SoloGameManager.cs @@ -18,38 +18,38 @@ namespace TheGameExtreme.model.manager public override bool endTurn() { - if (gameMode.checkBeforeEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) - { - //verifyNbCardPlay(); - pioche(); - 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 (gameMode.checkEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) - { - //if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs - //{ - // displayWinner(); - // return true; - //} - - return false; - } - else - { - return true; - } - } - else - { - return false; - } + //if (gameMode.checkBeforeEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) + //{ + // //verifyNbCardPlay(); + // pioche(); + // 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 (gameMode.checkEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) + // { + // //if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs + // //{ + // // displayWinner(); + // // return true; + // //} + + // return false; + // } + // else + // { + // return true; + // } + //} + //else + //{ + // return false; + //} } @@ -95,7 +95,7 @@ namespace TheGameExtreme.model.manager } } - protected override void pioche() + protected void pioche() { int nbPickedCard = nbMaxCard - CurrentHand.Count; for (int i = 0; i < nbPickedCard; i++) From dba3b1aef423cfa329ba0b3d930e84ac9f7350d5 Mon Sep 17 00:00:00 2001 From: cldupland Date: Thu, 7 Nov 2019 17:33:59 +0100 Subject: [PATCH 2/7] En cours de transformation du model --- .../model/gameActions/GameAction.cs | 10 +- TheGameExtreme/model/gameActions/Piles.cs | 39 ++ .../model/gameActions/classic/GameMode.cs | 25 +- .../gameActions/classic/JouerUneCarte.cs | 50 ++- .../model/gameActions/classic/Piocher.cs | 5 +- .../gameActions/classic/TerminerSonTour.cs | 2 +- .../extreme/ExtremeJouerUneCarte.cs | 4 +- .../model/gameActions/extreme/ExtremeMode.cs | 7 +- .../gameActions/extreme/ExtremePiocher.cs | 4 +- .../extreme/ExtremeTerminerSonTour.cs | 4 +- TheGameExtreme/model/manager/GameManager.cs | 333 ++++++++++-------- .../model/manager/MultiplayerGameManager.cs | 3 +- .../model/manager/SoloGameManager.cs | 321 ++++++++--------- .../manager/multiplayer/LocalGameManager.cs | 51 +-- .../manager/multiplayer/RemoteGameManager.cs | 51 +-- TheGameExtreme/view/MainPage.xaml.cs | 16 +- TheGameExtreme/viewmodel/Main.cs | 99 ++++-- 17 files changed, 609 insertions(+), 415 deletions(-) create mode 100644 TheGameExtreme/model/gameActions/Piles.cs diff --git a/TheGameExtreme/model/gameActions/GameAction.cs b/TheGameExtreme/model/gameActions/GameAction.cs index b2e9acc..62f408b 100644 --- a/TheGameExtreme/model/gameActions/GameAction.cs +++ b/TheGameExtreme/model/gameActions/GameAction.cs @@ -1,10 +1,16 @@ using System; +using System.Collections.Generic; +using TheGameExtreme.model.card; + namespace TheGameExtreme.model.gameActions { - public class GameAction + public abstract class GameAction { - public abstract GameAction() + protected Piles ListOrderedStacks { get; set; } + + protected GameAction(Piles listOrderedStacks) { + ListOrderedStacks = listOrderedStacks; } } } diff --git a/TheGameExtreme/model/gameActions/Piles.cs b/TheGameExtreme/model/gameActions/Piles.cs new file mode 100644 index 0000000..30c0a46 --- /dev/null +++ b/TheGameExtreme/model/gameActions/Piles.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using TheGameExtreme.model.card; + +namespace TheGameExtreme.model.gameActions +{ + public class Piles + { + + public List> ListOrderedStacks { get; set; } + + public Piles() + { + ListOrderedStacks = new List>(); + + 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)); + } + } + } + + public Stack getStack(int i) + { + return ListOrderedStacks[i]; + } + } +} diff --git a/TheGameExtreme/model/gameActions/classic/GameMode.cs b/TheGameExtreme/model/gameActions/classic/GameMode.cs index 0c8aec8..ddbfa25 100644 --- a/TheGameExtreme/model/gameActions/classic/GameMode.cs +++ b/TheGameExtreme/model/gameActions/classic/GameMode.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using TheGameExtreme.model.card; using TheGameExtreme.model.gameActions; namespace TheGameExtreme.model.gameActions.classic @@ -8,14 +9,20 @@ namespace TheGameExtreme.model.gameActions.classic { protected List gameActions; + protected Piles piles; public GameMode() { gameActions = new List(); - gameActions.Add(new Piocher()); - gameActions.Add(new JouerUneCarte()); - gameActions.Add(new TerminerSonTour()); + gameActions.Add(new Piocher(piles)); + gameActions.Add(new JouerUneCarte(piles)); + gameActions.Add(new TerminerSonTour(piles)); + } + + public void load() + { + piles = new Piles(); } public void pioche() @@ -23,14 +30,18 @@ namespace TheGameExtreme.model.gameActions.classic ((Piocher)gameActions[0]).pioche(); } - public void playCard() + public void playCard(int valueCard, List CurrentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) { - ((JouerUneCarte)gameActions[0]).play(); + ((JouerUneCarte)gameActions[1]).play(valueCard, CurrentHand, orderedStackSelected, player, CurrentCardPlayed); + if (CurrentHand.Count == 0) + { + endTurn(); // Presque bon, oublie juste d'afficher les nouvelles cartes + } } public void endTurn() { - ((TerminerSonTour)gameActions[0]).end(); + ((TerminerSonTour)gameActions[2]).end(); } @@ -111,5 +122,5 @@ namespace TheGameExtreme.model.gameActions.classic // } // return true; // } - //} + } } diff --git a/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs index 5d44832..cec789a 100644 --- a/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs +++ b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs @@ -1,15 +1,61 @@ using System; +using System.Collections.Generic; +using TheGameExtreme.model.card; + namespace TheGameExtreme.model.gameActions.classic { public class JouerUneCarte : GameAction { - public JouerUneCarte() + + public JouerUneCarte(Piles ListOrderedStacks) : base(ListOrderedStacks) { } - public void play() + public void play(int valueCard, List CurrentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) { + foreach (Card card in CurrentHand) + { + if (valueCard == card.Value) + { + if (orderedStackSelected >= 0 && orderedStackSelected < 4) + { + if (orderedStackSelected < 2) + { + rule(card, ListOrderedStacks.getStack(orderedStackSelected), true, player, CurrentCardPlayed); + } + else + { + rule(card, ListOrderedStacks.getStack(orderedStackSelected), false, player, CurrentCardPlayed); + } + } + else + { + throw new Exception(AppRessource.StrCantGetStack); + } + return; + } + } + } + private void 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(); + player.joue(card); + CurrentCardPlayed.Add(card); + stack.Push(card); + //OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack))); + } + else + { + throw new Exception(AppRessource.StrWrongStack); + } + //if (EndMessage != null) + //{ + // //throw new Exception("Le jeu est fini! Veuillez lancer une nouvelle partie!"); + // throw new Exception(AppRessource.StrEndOfGame); + //} } } } diff --git a/TheGameExtreme/model/gameActions/classic/Piocher.cs b/TheGameExtreme/model/gameActions/classic/Piocher.cs index ef602ac..3f16e3e 100644 --- a/TheGameExtreme/model/gameActions/classic/Piocher.cs +++ b/TheGameExtreme/model/gameActions/classic/Piocher.cs @@ -1,9 +1,12 @@ using System; +using System.Collections.Generic; +using TheGameExtreme.model.card; + namespace TheGameExtreme.model.gameActions.classic { public class Piocher : GameAction { - public Piocher() + public Piocher(Piles ListOrderedStacks) : base(ListOrderedStacks) { } diff --git a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs index e4d67e6..4117899 100644 --- a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs +++ b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs @@ -3,7 +3,7 @@ namespace TheGameExtreme.model.gameActions.classic { public class TerminerSonTour : GameAction { - public TerminerSonTour() + public TerminerSonTour(Piles ListOrderedStacks) : base(ListOrderedStacks) { } diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs b/TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs index bd0081f..9877c84 100644 --- a/TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs +++ b/TheGameExtreme/model/gameActions/extreme/ExtremeJouerUneCarte.cs @@ -1,9 +1,11 @@ using System; +using TheGameExtreme.model.gameActions.classic; + namespace TheGameExtreme.model.gameActions.extreme { public class ExtremeJouerUneCarte : JouerUneCarte { - public ExtremeJouerUneCarte() + public ExtremeJouerUneCarte(Piles ListOrderedStacks) : base(ListOrderedStacks) { } } diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs b/TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs index 65dc39b..f38dcd2 100644 --- a/TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs +++ b/TheGameExtreme/model/gameActions/extreme/ExtremeMode.cs @@ -1,4 +1,5 @@ using System; +using TheGameExtreme.model.gameActions.classic; namespace TheGameExtreme.model.gameActions.extreme { @@ -6,9 +7,9 @@ namespace TheGameExtreme.model.gameActions.extreme { public ExtremeMode() { - gameActions.Add(new ExtremePiocher()); - gameActions.Add(new ExtremeJouerUneCarte()); - gameActions.Add(new ExtremeTerminerSonTour()); + gameActions.Add(new ExtremePiocher(piles)); + gameActions.Add(new ExtremeJouerUneCarte(piles)); + gameActions.Add(new ExtremeTerminerSonTour(piles)); } } } diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs b/TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs index 6f74b9b..e0ff5df 100644 --- a/TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs +++ b/TheGameExtreme/model/gameActions/extreme/ExtremePiocher.cs @@ -1,9 +1,11 @@ using System; +using TheGameExtreme.model.gameActions.classic; + namespace TheGameExtreme.model.gameActions.extreme { public class ExtremePiocher : Piocher { - public ExtremePiocher() + public ExtremePiocher(Piles ListOrderedStacks) : base(ListOrderedStacks) { } } diff --git a/TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs b/TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs index 39092d7..501e352 100644 --- a/TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs +++ b/TheGameExtreme/model/gameActions/extreme/ExtremeTerminerSonTour.cs @@ -1,9 +1,11 @@ using System; +using TheGameExtreme.model.gameActions.classic; + namespace TheGameExtreme.model.gameActions.extreme { public class ExtremeTerminerSonTour : TerminerSonTour { - public ExtremeTerminerSonTour() + public ExtremeTerminerSonTour(Piles ListOrderedStacks) : base(ListOrderedStacks) { } } diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index efd9fa2..8a840a6 100644 --- a/TheGameExtreme/model/manager/GameManager.cs +++ b/TheGameExtreme/model/manager/GameManager.cs @@ -17,87 +17,37 @@ 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 GameManager(GameMode gameMode) - { - this.gameMode = gameMode; - } - - - - - - - - - - - - - - - - - - - - - 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 readonly int nbPlayer; + protected List players = new List(); public event EventHandler TopRangeChanged; public event EventHandler PlayerChanged; - public List CurrentHand { get; set; } - protected int nbCardAtBeginOfTurn; + public Piles ListOrderedStacks { get; set; } + //protected int nbCardAtBeginOfTurn; + protected int nbMaxCard; protected List CurrentCardPlayed = new List(); - protected string langue; + public String EndMessage { get; set; } - protected GameManager(int nbPlayer, List players) - { - ListOrderedStacks = new List>(); - CurrentHand = new List(); - this.nbPlayer = nbPlayer; - players.ForEach(player => playerList.Add(new Player(player))); + public List CurrentHand { get; set; } + + protected GameManager(List playersNames, GameMode gameMode) + { + nbPlayer = players.Count; + playersNames.ForEach(playerName => players.Add(new Player(playerName))); - initStacks(); + this.gameMode = gameMode; + gameMode.load(); - initRule(); + ListOrderedStacks = new Piles(); createDeck(); defineNbMaxCard(); distribueCard(); - CurrentHand = playerList[currentIndexPlayer].getCardList(); - nbCardAtBeginOfTurn = CurrentHand.Count; - } - - protected void initStacks() - { - 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)); - } - } + CurrentHand = players[0].getCardList(); } protected void createDeck() @@ -134,7 +84,8 @@ namespace TheGameExtreme.model.manager { for (int i = 0; i < nbMaxCard; i++) { - playerList.ForEach(player => { + players.ForEach(player => + { int r = new Random().Next(0, deck.size() - 1); player.pioche(deck.getCard(r)); deck.removeAt(r); @@ -144,91 +95,191 @@ namespace TheGameExtreme.model.manager 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; - } - } + gameMode.playCard(valueCard, CurrentHand, orderedStackSelected, players[0], CurrentCardPlayed); // Mettre le joueur actif } - protected void testPossibility(Card card, Stack orderedStack, bool bottomUp) - { - //if (gameMode.checkPlayRule(card, orderedStack, bottomUp, CurrentHand)) - //{ - // 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); - //} - } - 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 bool isEndGame(); - abstract protected void tryToFindSoluce(List playableCard); - abstract protected bool testEndGame(List playableCard); - abstract protected bool effectLose(); - public int getCurentIndexPlayer() - { - return currentIndexPlayer; - } + + + + + + + + + + + //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 List CurrentHand { get; set; } + //protected int nbCardAtBeginOfTurn; + //protected List CurrentCardPlayed = new List(); + //protected string langue; + //public event EventHandler TopRangeChanged; + //public event EventHandler PlayerChanged; + + + //protected GameManager(int nbPlayer, List players) + //{ + // ListOrderedStacks = new List>(); + // CurrentHand = new List(); + + // this.nbPlayer = nbPlayer; + // players.ForEach(player => playerList.Add(new Player(player))); + + + // initStacks(); + + // initRule(); + + // createDeck(); + // defineNbMaxCard(); + // distribueCard(); + + // CurrentHand = playerList[currentIndexPlayer].getCardList(); + // nbCardAtBeginOfTurn = CurrentHand.Count; + //} + + //protected void initStacks() + //{ + // ListOrderedStacks = new List>(); + + // 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)); + // } + // } + //} + + //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++) + // { + // players.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) + //{ + // gameMode.playCard(valueCard, CurrentHand, orderedStackSelected, players[0], CurrentCardPlayed); // Mettre le joueur actif + //} + + //protected void testPossibility(Card card, Stack orderedStack, bool bottomUp) + //{ + // //if (gameMode.checkPlayRule(card, orderedStack, bottomUp, CurrentHand)) + // //{ + // // 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); + // //} + //} + + //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 bool isEndGame(); + + //abstract protected void tryToFindSoluce(List playableCard); + + //abstract protected bool testEndGame(List playableCard); + + //abstract protected bool effectLose(); + + //public int getCurentIndexPlayer() + //{ + // return currentIndexPlayer; + //} } } diff --git a/TheGameExtreme/model/manager/MultiplayerGameManager.cs b/TheGameExtreme/model/manager/MultiplayerGameManager.cs index 858d083..46dbe13 100644 --- a/TheGameExtreme/model/manager/MultiplayerGameManager.cs +++ b/TheGameExtreme/model/manager/MultiplayerGameManager.cs @@ -1,11 +1,12 @@ using System; using System.Collections.Generic; +using TheGameExtreme.model.gameActions.classic; namespace TheGameExtreme.model.manager { public abstract class MultiplayerGameManager : GameManager { - protected MultiplayerGameManager(int nbPlayer, List players) : base(nbPlayer, players) + protected MultiplayerGameManager(List players, GameMode gameMode) : base(players, gameMode) { } } diff --git a/TheGameExtreme/model/manager/SoloGameManager.cs b/TheGameExtreme/model/manager/SoloGameManager.cs index 9c25c99..04d1c9b 100644 --- a/TheGameExtreme/model/manager/SoloGameManager.cs +++ b/TheGameExtreme/model/manager/SoloGameManager.cs @@ -3,175 +3,176 @@ using System.Collections.Generic; using TheGameExtreme.model.card; using TheGameExtreme.model.card.rapidCard; using TheGameExtreme.model.@event; +using TheGameExtreme.model.gameActions.classic; namespace TheGameExtreme.model.manager { public class SoloGameManager : GameManager { - public SoloGameManager(int nbPlayer, List players) - : base(nbPlayer, players) + public SoloGameManager(List players, GameMode gameMode) + : base(players, gameMode) { } - public override bool endTurn() - { - - //if (gameMode.checkBeforeEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) - //{ - // //verifyNbCardPlay(); - // pioche(); - // 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 (gameMode.checkEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) - // { - // //if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs - // //{ - // // displayWinner(); - // // return true; - // //} - - // return false; - // } - // else - // { - // return true; - // } - //} - //else - //{ - // return false; - //} - - - } - - protected void verifyNbCardPlay() - { - foreach (Card cardPlayed in CurrentCardPlayed) - { - if (Equals(cardPlayed.GetType(), ThreeCard.CARD_THREE)) - { - if ((nbCardAtBeginOfTurn - CurrentHand.Count) < 3) // Penser à vérifier s'il a joué une ThreeCard pour regarder s'il a bien joué 3 cartes - { - testIsEndGame(); - } - return; - } - } - if ((nbCardAtBeginOfTurn - CurrentHand.Count) < 2) // Penser à vérifier s'il a joué une ThreeCard pour regarder s'il a bien joué 3 cartes - { - testIsEndGame(); - } - } - - protected void testIsEndGame() - { - if (isEndGame()) - { - displayWinner(); - } - else - { - //throw new Exception("Vous n'avez pas joué assez de carte!"); - throw new Exception(AppRessources_br.StrCardPlayedLessThanTwo); - } - } - - protected void displayWinner() - { - if (win) - { - EndMessage = "Le jeu est terminé!\n Bravo vous avez gagné!"; - EndMessage = AppRessource.StrWin; - } - } - - protected void pioche() - { - 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); - playerList[currentIndexPlayer].pioche(deck.getCard(random)); - deck.removeAt(random); - } - } - - protected override bool isEndGame() - { - if (CurrentHand.Count != 0) - { - List playableCard = new List(); - tryToFindSoluce(playableCard); - return testEndGame(playableCard); - } - return false; - } - - protected override void tryToFindSoluce(List playableCard) - { - CurrentHand.ForEach(card => - { - if (card.Value > ListOrderedStacks[0].Peek().Value || card.Value > ListOrderedStacks[1].Peek().Value || card.Value < ListOrderedStacks[2].Peek().Value || card.Value < ListOrderedStacks[3].Peek().Value) - { - playableCard.Add(card); - } - }); - } - - protected override bool testEndGame(List playableCard) - { - if (playableCard.Count == 2) - { - foreach (Card c in playableCard) - { - if (Equals(c.getName(), ThreeCard.CARD_THREE)) - { - win = false; - EndMessage = "Le jeu est terminé!\n Désolé, vous avez perdu... Vous deviez jouer trois cartes à cause de l'effet \"Trois cartes joué\" hors votre jeu ne permet pas d'en jouer autant! Essayez encore!"; - return true; - } - } - } - else if (playableCard.Count < 2) - { - win = false; - EndMessage = "Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!"; - return true; - } - else if (effectLose()) - { - win = false; - EndMessage = "Désolé, vous n'avez pas recouvert la tête de mort... Réessayez ;)"; - return true; - } - - return false; - } - - protected override bool effectLose() - { - foreach (Stack orderedStack in ListOrderedStacks) - { - if (Equals(orderedStack.Peek().getName(), EndGameCard.CARD_ENDGAME)) - { - return true; - } - } - return false; - } + //public override bool endTurn() + //{ + + // //if (gameMode.checkBeforeEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) + // //{ + // // //verifyNbCardPlay(); + // // pioche(); + // // 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 (gameMode.checkEndTurnRule(CurrentCardPlayed, nbCardAtBeginOfTurn, CurrentHand)) + // // { + // // //if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs + // // //{ + // // // displayWinner(); + // // // return true; + // // //} + + // // return false; + // // } + // // else + // // { + // // return true; + // // } + // //} + // //else + // //{ + // // return false; + // //} + + + //} + + //protected void verifyNbCardPlay() + //{ + // foreach (Card cardPlayed in CurrentCardPlayed) + // { + // if (Equals(cardPlayed.GetType(), ThreeCard.CARD_THREE)) + // { + // if ((nbCardAtBeginOfTurn - CurrentHand.Count) < 3) // Penser à vérifier s'il a joué une ThreeCard pour regarder s'il a bien joué 3 cartes + // { + // testIsEndGame(); + // } + // return; + // } + // } + // if ((nbCardAtBeginOfTurn - CurrentHand.Count) < 2) // Penser à vérifier s'il a joué une ThreeCard pour regarder s'il a bien joué 3 cartes + // { + // testIsEndGame(); + // } + //} + + //protected void testIsEndGame() + //{ + // if (isEndGame()) + // { + // displayWinner(); + // } + // else + // { + // //throw new Exception("Vous n'avez pas joué assez de carte!"); + // throw new Exception(AppRessources_br.StrCardPlayedLessThanTwo); + // } + //} + + //protected void displayWinner() + //{ + // if (win) + // { + // EndMessage = "Le jeu est terminé!\n Bravo vous avez gagné!"; + // EndMessage = AppRessource.StrWin; + // } + //} + + //protected void pioche() + //{ + // 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); + // playerList[currentIndexPlayer].pioche(deck.getCard(random)); + // deck.removeAt(random); + // } + //} + + //protected override bool isEndGame() + //{ + // if (CurrentHand.Count != 0) + // { + // List playableCard = new List(); + // tryToFindSoluce(playableCard); + // return testEndGame(playableCard); + // } + // return false; + //} + + //protected override void tryToFindSoluce(List playableCard) + //{ + // CurrentHand.ForEach(card => + // { + // if (card.Value > ListOrderedStacks[0].Peek().Value || card.Value > ListOrderedStacks[1].Peek().Value || card.Value < ListOrderedStacks[2].Peek().Value || card.Value < ListOrderedStacks[3].Peek().Value) + // { + // playableCard.Add(card); + // } + // }); + //} + + //protected override bool testEndGame(List playableCard) + //{ + // if (playableCard.Count == 2) + // { + // foreach (Card c in playableCard) + // { + // if (Equals(c.getName(), ThreeCard.CARD_THREE)) + // { + // win = false; + // EndMessage = "Le jeu est terminé!\n Désolé, vous avez perdu... Vous deviez jouer trois cartes à cause de l'effet \"Trois cartes joué\" hors votre jeu ne permet pas d'en jouer autant! Essayez encore!"; + // return true; + // } + // } + // } + // else if (playableCard.Count < 2) + // { + // win = false; + // EndMessage = "Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!"; + // return true; + // } + // else if (effectLose()) + // { + // win = false; + // EndMessage = "Désolé, vous n'avez pas recouvert la tête de mort... Réessayez ;)"; + // return true; + // } + + // return false; + //} + + //protected override bool effectLose() + //{ + // foreach (Stack orderedStack in ListOrderedStacks) + // { + // if (Equals(orderedStack.Peek().getName(), EndGameCard.CARD_ENDGAME)) + // { + // return true; + // } + // } + // return false; + //} } } diff --git a/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs b/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs index 46bcd00..648b211 100644 --- a/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs +++ b/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs @@ -1,43 +1,44 @@ using System; using System.Collections.Generic; using TheGameExtreme.model.card; +using TheGameExtreme.model.gameActions.classic; namespace TheGameExtreme.model.manager { public class LocalGameManager : MultiplayerGameManager { - public LocalGameManager(int nbPlayer, List players) : base(nbPlayer, players) + public LocalGameManager(List players, GameMode gameMode) : base(players, gameMode) { } - public override bool endTurn() - { - throw new NotImplementedException(); - } + //public override bool endTurn() + //{ + // throw new NotImplementedException(); + //} - protected override bool effectLose() - { - throw new NotImplementedException(); - } + //protected override bool effectLose() + //{ + // throw new NotImplementedException(); + //} - protected override bool isEndGame() - { - throw new NotImplementedException(); - } + //protected override bool isEndGame() + //{ + // throw new NotImplementedException(); + //} - protected override void pioche() - { - throw new NotImplementedException(); - } + //protected override void pioche() + //{ + // throw new NotImplementedException(); + //} - protected override bool testEndGame(List playableCard) - { - throw new NotImplementedException(); - } + //protected override bool testEndGame(List playableCard) + //{ + // throw new NotImplementedException(); + //} - protected override void tryToFindSoluce(List playableCard) - { - throw new NotImplementedException(); - } + //protected override void tryToFindSoluce(List playableCard) + //{ + // throw new NotImplementedException(); + //} } } diff --git a/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs b/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs index ec70b7e..d950c83 100644 --- a/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs +++ b/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs @@ -1,43 +1,44 @@ using System; using System.Collections.Generic; using TheGameExtreme.model.card; +using TheGameExtreme.model.gameActions.classic; namespace TheGameExtreme.model.manager.multiplayer { public class RemoteGameManager : MultiplayerGameManager { - public RemoteGameManager(int nbPlayer, List players) : base(nbPlayer, players) + public RemoteGameManager(List players, GameMode gameMode) : base(players, gameMode) { } - public override bool endTurn() - { - throw new NotImplementedException(); - } + //public override bool endTurn() + //{ + // throw new NotImplementedException(); + //} - protected override bool effectLose() - { - throw new NotImplementedException(); - } + //protected override bool effectLose() + //{ + // throw new NotImplementedException(); + //} - protected override bool isEndGame() - { - throw new NotImplementedException(); - } + //protected override bool isEndGame() + //{ + // throw new NotImplementedException(); + //} - protected override void pioche() - { - throw new NotImplementedException(); - } + //protected override void pioche() + //{ + // throw new NotImplementedException(); + //} - protected override bool testEndGame(List playableCard) - { - throw new NotImplementedException(); - } + //protected override bool testEndGame(List playableCard) + //{ + // throw new NotImplementedException(); + //} - protected override void tryToFindSoluce(List playableCard) - { - throw new NotImplementedException(); - } + //protected override void tryToFindSoluce(List playableCard) + //{ + // throw new NotImplementedException(); + //} } } diff --git a/TheGameExtreme/view/MainPage.xaml.cs b/TheGameExtreme/view/MainPage.xaml.cs index 0468ab0..0c5e5e0 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 feaf382..5bc04e3 100644 --- a/TheGameExtreme/viewmodel/Main.cs +++ b/TheGameExtreme/viewmodel/Main.cs @@ -4,6 +4,7 @@ using System.Collections.ObjectModel; using System.ComponentModel; using TheGameExtreme.model.card; using TheGameExtreme.model.@event; +using TheGameExtreme.model.gameActions.classic; using TheGameExtreme.model.manager; namespace TheGameExtreme.viewmodel @@ -45,7 +46,7 @@ namespace TheGameExtreme.viewmodel public Main() { - gameManager = new SoloGameManager(2, new List { "Clément", "Baptiste" }) ; // Donner le nom des joueurs + gameManager = new SoloGameManager(new List { "Clément", "Baptiste" }, new GameMode()) ; // Donner le nom des joueurs gameManager.TopRangeChanged += OnTopRangeChanged; @@ -67,31 +68,19 @@ namespace TheGameExtreme.viewmodel BindingChanged?.Invoke(this, args); } + + + + + + + /** * * * @return booléen de fin de jeu */ public bool played(int numStack, int valueCard) - { - if (gameManager.isCanPlay()) - { - return playOneCard(numStack, valueCard); - } - else - { - Alert = "Le joueur n'a plus de carte dans sa main!"; - // Faire un toast - return false; - } - } - - /** - * - * - * @return booléen de fin de jeu - */ - private bool playOneCard(int numStack, int valueCard) { try { @@ -102,28 +91,66 @@ namespace TheGameExtreme.viewmodel return true; } } - catch(Exception e) + 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; - } + + + + //if (gameManager.isCanPlay()) + //{ + // return playOneCard(numStack, valueCard); + //} + //else + //{ + // Alert = "Le joueur n'a plus de carte dans sa main!"; + // // Faire un toast + // 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; + // } + //} + + } } From 6bba3c9cb210fa59a704890cd94c7f65510be2a5 Mon Sep 17 00:00:00 2001 From: cldupland Date: Fri, 8 Nov 2019 09:52:53 +0100 Subject: [PATCH 3/7] 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; + // } + //} + + } } From 35e15d12a0a2c88558a89a0e27796b7eb3a07b90 Mon Sep 17 00:00:00 2001 From: cldupland Date: Fri, 8 Nov 2019 11:52:10 +0100 Subject: [PATCH 4/7] Avancement sur le nouveau model --- .../model/gameActions/classic/GameMode.cs | 16 ++++---- TheGameExtreme/model/manager/GameManager.cs | 41 ++++++++++++++----- TheGameExtreme/viewmodel/Main.cs | 2 +- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/TheGameExtreme/model/gameActions/classic/GameMode.cs b/TheGameExtreme/model/gameActions/classic/GameMode.cs index f9cf4b9..2845da0 100644 --- a/TheGameExtreme/model/gameActions/classic/GameMode.cs +++ b/TheGameExtreme/model/gameActions/classic/GameMode.cs @@ -78,14 +78,14 @@ namespace TheGameExtreme.model.gameActions.classic } } - public void pioche(List CurrentHand, Player player) + public void pioche(List currentHand, Player player) { - ((Piocher)gameActions[0]).pioche(CurrentHand, deck, player); + ((Piocher)gameActions[0]).pioche(currentHand, deck, player); } - public void playCard(int valueCard, List CurrentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) + public void playCard(int valueCard, List currentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) { - if (((JouerUneCarte)gameActions[1]).play(valueCard, CurrentHand, orderedStackSelected, player, CurrentCardPlayed)) + if (((JouerUneCarte)gameActions[1]).play(valueCard, currentHand, orderedStackSelected, player, CurrentCardPlayed)) { OnTopRangeChanged(new TopRangeChangedEventArgs(piles.getStack(orderedStackSelected).Peek(), ((JouerUneCarte)gameActions[1]).OldCard, orderedStackSelected)); } @@ -96,10 +96,10 @@ namespace TheGameExtreme.model.gameActions.classic TopRangeChanged?.Invoke(this, args); } - public bool endTurn(List CurrentHand, List CurrentCardPlayed, Player player) + public bool endTurn(List currentHand, List CurrentCardPlayed, Player player) { - ((TerminerSonTour)gameActions[2]).end(CurrentHand, nbCardAtBeginOfTurn, CurrentCardPlayed); - pioche(CurrentHand, player); + ((TerminerSonTour)gameActions[2]).end(currentHand, nbCardAtBeginOfTurn, CurrentCardPlayed); + pioche(currentHand, player); //currentIndexPlayer += 1; //if (currentIndexPlayer == playerList.Count) //{ @@ -107,7 +107,7 @@ namespace TheGameExtreme.model.gameActions.classic //} //CurrentHand = playerList[currentIndexPlayer].getCardList(); //OnPlayerChanged(new PlayerChangedEventArgs(CurrentHand, playerList[currentIndexPlayer].Pseudo)); - nbCardAtBeginOfTurn = CurrentHand.Count; + nbCardAtBeginOfTurn = currentHand.Count; CurrentCardPlayed.Clear(); //if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs //{ diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index c5e1fa3..28c3b66 100644 --- a/TheGameExtreme/model/manager/GameManager.cs +++ b/TheGameExtreme/model/manager/GameManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using TheGameExtreme.model.card; using TheGameExtreme.model.deck; using TheGameExtreme.model.@event; @@ -11,7 +12,7 @@ using TheGameExtreme.model.rule.playRules; namespace TheGameExtreme.model.manager { - public abstract class GameManager + public abstract class GameManager: INotifyPropertyChanged { /* GameMaster implémente un mode de jeu (classe fille de gameMode qui connait les actions a effectué en fonction du mode de jeu */ @@ -19,8 +20,6 @@ namespace TheGameExtreme.model.manager protected GameMode gameMode; public readonly int nbPlayer; protected List players = new List(); - public event EventHandler TopRangeChanged; - public event EventHandler PlayerChanged; public Piles ListOrderedStacks { get; set; } //protected int nbCardAtBeginOfTurn; protected int nbMaxCard; @@ -28,8 +27,33 @@ namespace TheGameExtreme.model.manager public String EndMessage { get; set; } + protected List currentHand; + public List CurrentHand + { + get { return currentHand; } + set + { + currentHand = value; + OnPropertyChanged("CurrentHand"); + } + } + + #region event + + public event EventHandler TopRangeChanged; + //public event EventHandler PlayerChanged; + public event PropertyChangedEventHandler PropertyChanged; + public virtual void OnPropertyChanged(string info) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info)); + } + public void OnTopRangeChanged(object source, TopRangeChangedEventArgs args) + { + TopRangeChanged?.Invoke(this, args); + } + + #endregion - public List CurrentHand { get; set; } protected GameManager(List playersNames, GameMode gameMode) @@ -49,17 +73,12 @@ namespace TheGameExtreme.model.manager public void joue(int valueCard, int orderedStackSelected) { - gameMode.playCard(valueCard, CurrentHand, orderedStackSelected, players[0], CurrentCardPlayed); // Mettre le joueur actif + gameMode.playCard(valueCard, currentHand, orderedStackSelected, players[0], CurrentCardPlayed); // Mettre le joueur actif } public bool endTurn() { - return gameMode.endTurn(CurrentHand, CurrentCardPlayed, players[0]); // Mettre le joueur actif - } - - public void OnTopRangeChanged(object source, TopRangeChangedEventArgs args) - { - TopRangeChanged?.Invoke(this, args); + return gameMode.endTurn(currentHand, CurrentCardPlayed, players[0]); // Mettre le joueur actif } diff --git a/TheGameExtreme/viewmodel/Main.cs b/TheGameExtreme/viewmodel/Main.cs index 34b9085..5212f9b 100644 --- a/TheGameExtreme/viewmodel/Main.cs +++ b/TheGameExtreme/viewmodel/Main.cs @@ -50,7 +50,7 @@ namespace TheGameExtreme.viewmodel gameManager.TopRangeChanged += OnTopRangeChanged; - gameManager.PlayerChanged += OnPlayerChanged; + //gameManager.PlayerChanged += OnPlayerChanged; CurrentHand = gameManager.CurrentHand; From 2eaa2125a7a0e6b8d8919c163b50d6d58dd9b1ff Mon Sep 17 00:00:00 2001 From: cldupland Date: Tue, 12 Nov 2019 11:52:06 +0100 Subject: [PATCH 5/7] =?UTF-8?q?Ajout=20de=20l'=C3=A9bauche=20du=20rapport?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Documentations/Rapport.docx | Bin 0 -> 24470 bytes TheGameExtreme/model/deck/Deck.cs | 5 -- .../model/gameActions/classic/GameMode.cs | 49 +++++++++++------- .../gameActions/classic/TerminerSonTour.cs | 2 +- TheGameExtreme/model/manager/GameManager.cs | 20 ++++++- TheGameExtreme/viewmodel/Main.cs | 2 +- 6 files changed, 51 insertions(+), 27 deletions(-) create mode 100644 Documentations/Rapport.docx diff --git a/Documentations/Rapport.docx b/Documentations/Rapport.docx new file mode 100644 index 0000000000000000000000000000000000000000..d84b4e3ec947be6b042385a0015ed179cfab8016 GIT binary patch literal 24470 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 KOP1+>|Mfo~@8WI% literal 0 HcmV?d00001 diff --git a/TheGameExtreme/model/deck/Deck.cs b/TheGameExtreme/model/deck/Deck.cs index 2028ce2..60a2369 100644 --- a/TheGameExtreme/model/deck/Deck.cs +++ b/TheGameExtreme/model/deck/Deck.cs @@ -9,11 +9,6 @@ namespace TheGameExtreme.model protected List deck = new List(); - public Deck() - { - - } - public int size() { return deck.Count; diff --git a/TheGameExtreme/model/gameActions/classic/GameMode.cs b/TheGameExtreme/model/gameActions/classic/GameMode.cs index 2845da0..17159ea 100644 --- a/TheGameExtreme/model/gameActions/classic/GameMode.cs +++ b/TheGameExtreme/model/gameActions/classic/GameMode.cs @@ -12,11 +12,27 @@ 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; + + #region + + public event EventHandler TopRangeChanged; + public event EventHandler PlayerChanged; + protected internal void OnTopRangeChanged(TopRangeChangedEventArgs args) + { + TopRangeChanged?.Invoke(this, args); + } + protected internal void OnPlayerChanged(PlayerChangedEventArgs args) + { + PlayerChanged?.Invoke(this, args); + } + + #endregion + + public GameMode() { gameActions = new List(); @@ -91,24 +107,22 @@ namespace TheGameExtreme.model.gameActions.classic } } - protected internal void OnTopRangeChanged(TopRangeChangedEventArgs args) - { - 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 (((TerminerSonTour)gameActions[2]).end(currentHand, nbCardAtBeginOfTurn, CurrentCardPlayed)) + { + pioche(currentHand, player); + nbCardAtBeginOfTurn = currentHand.Count; + CurrentCardPlayed.Clear(); + + OnPlayerChanged(new PlayerChangedEventArgs(currentHand, player.Pseudo)); + return false; + } + else + { + return true; + } + //if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs //{ // displayWinner(); @@ -118,7 +132,6 @@ namespace TheGameExtreme.model.gameActions.classic //{ // return true; //} - return false; // Changer } //protected void displayWinner() diff --git a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs index a0bcb6c..36d7140 100644 --- a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs +++ b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs @@ -15,7 +15,7 @@ namespace TheGameExtreme.model.gameActions.classic { // 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) + if (nbCardAtBeginOfTurn == CurrentCardPlayed.Count || CurrentHand.Count == 0 || CurrentCardPlayed.Count >= 2) { // Ne pas oublié de gérer les ThreeCard return Test(CurrentHand); } diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index 28c3b66..4798676 100644 --- a/TheGameExtreme/model/manager/GameManager.cs +++ b/TheGameExtreme/model/manager/GameManager.cs @@ -25,6 +25,7 @@ namespace TheGameExtreme.model.manager protected int nbMaxCard; protected List CurrentCardPlayed = new List(); public String EndMessage { get; set; } + protected int currentIndexPlayer; protected List currentHand; @@ -41,7 +42,7 @@ namespace TheGameExtreme.model.manager #region event public event EventHandler TopRangeChanged; - //public event EventHandler PlayerChanged; + public event EventHandler PlayerChanged; public event PropertyChangedEventHandler PropertyChanged; public virtual void OnPropertyChanged(string info) { @@ -51,11 +52,26 @@ namespace TheGameExtreme.model.manager { TopRangeChanged?.Invoke(this, args); } + protected internal void OnPlayerChanged(PlayerChangedEventArgs args) + { + currentIndexPlayer += 1; + if (currentIndexPlayer == players.Count) + { + currentIndexPlayer = 0; + } + CurrentHand = players[currentIndexPlayer].getCardList(); + PlayerChanged?.Invoke(this, args); + } #endregion + //protected bool win = true; + //public String EndMessage { get; set; } + + + protected GameManager(List playersNames, GameMode gameMode) { nbPlayer = players.Count; @@ -78,7 +94,7 @@ namespace TheGameExtreme.model.manager public bool endTurn() { - return gameMode.endTurn(currentHand, CurrentCardPlayed, players[0]); // Mettre le joueur actif + return gameMode.endTurn(currentHand, CurrentCardPlayed, players[0]); } diff --git a/TheGameExtreme/viewmodel/Main.cs b/TheGameExtreme/viewmodel/Main.cs index 5212f9b..34b9085 100644 --- a/TheGameExtreme/viewmodel/Main.cs +++ b/TheGameExtreme/viewmodel/Main.cs @@ -50,7 +50,7 @@ namespace TheGameExtreme.viewmodel gameManager.TopRangeChanged += OnTopRangeChanged; - //gameManager.PlayerChanged += OnPlayerChanged; + gameManager.PlayerChanged += OnPlayerChanged; CurrentHand = gameManager.CurrentHand; From 93dde67e783b8680e89c1905744814efc1c1cd05 Mon Sep 17 00:00:00 2001 From: cldupland Date: Tue, 12 Nov 2019 17:26:45 +0100 Subject: [PATCH 6/7] Avancement sur les messages d'erreur de fin de tour et la fin de tour --- .../model/gameActions/GameAction.cs | 1 + .../model/gameActions/classic/GameMode.cs | 144 +++++------------- .../gameActions/classic/JouerUneCarte.cs | 13 +- .../gameActions/classic/TerminerSonTour.cs | 9 +- TheGameExtreme/model/manager/GameManager.cs | 32 +++- .../model/manager/SoloGameManager.cs | 3 - TheGameExtreme/viewmodel/Main.cs | 46 +++--- 7 files changed, 101 insertions(+), 147 deletions(-) diff --git a/TheGameExtreme/model/gameActions/GameAction.cs b/TheGameExtreme/model/gameActions/GameAction.cs index 62f408b..26af12d 100644 --- a/TheGameExtreme/model/gameActions/GameAction.cs +++ b/TheGameExtreme/model/gameActions/GameAction.cs @@ -7,6 +7,7 @@ namespace TheGameExtreme.model.gameActions public abstract class GameAction { protected Piles ListOrderedStacks { get; set; } + public String ErrorMessage { get; set; } protected GameAction(Piles listOrderedStacks) { diff --git a/TheGameExtreme/model/gameActions/classic/GameMode.cs b/TheGameExtreme/model/gameActions/classic/GameMode.cs index 17159ea..0c10966 100644 --- a/TheGameExtreme/model/gameActions/classic/GameMode.cs +++ b/TheGameExtreme/model/gameActions/classic/GameMode.cs @@ -15,6 +15,7 @@ namespace TheGameExtreme.model.gameActions.classic protected int nbCardAtBeginOfTurn = 7; protected Deck deck; private int nbMaxCard; + public String Message { get; set; } #region @@ -96,19 +97,26 @@ namespace TheGameExtreme.model.gameActions.classic public void pioche(List currentHand, Player player) { + Message = null; ((Piocher)gameActions[0]).pioche(currentHand, deck, player); } public void playCard(int valueCard, List currentHand, int orderedStackSelected, Player player, List CurrentCardPlayed) { + Message = null; if (((JouerUneCarte)gameActions[1]).play(valueCard, currentHand, orderedStackSelected, player, CurrentCardPlayed)) { OnTopRangeChanged(new TopRangeChangedEventArgs(piles.getStack(orderedStackSelected).Peek(), ((JouerUneCarte)gameActions[1]).OldCard, orderedStackSelected)); } + else + { + Message = ((JouerUneCarte)gameActions[1]).ErrorMessage; + } } public bool endTurn(List currentHand, List CurrentCardPlayed, Player player) { + Message = null; if (((TerminerSonTour)gameActions[2]).end(currentHand, nbCardAtBeginOfTurn, CurrentCardPlayed)) { pioche(currentHand, player); @@ -120,118 +128,46 @@ namespace TheGameExtreme.model.gameActions.classic } else { + Message = ((TerminerSonTour)gameActions[2]).ErrorMessage; return true; } - - //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; - //} } - //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); - // } + #region Decaler dans un GameAction - // 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 isEndGame(List currentHand) + { + if (currentHand.Count != 0) + { + List playableCard = new List(); + tryToFindSoluce(playableCard, currentHand); + return testEndGame(playableCard); + } + 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) - // { + 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); + } + }); + } - // } - // return true; - // } + protected bool testEndGame(List playableCard) + { + if (playableCard.Count < 2) + { + Message = "Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!"; + 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 false; + } - // } - // return true; - // } + #endregion } } diff --git a/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs index 2ef14e2..ba07eec 100644 --- a/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs +++ b/TheGameExtreme/model/gameActions/classic/JouerUneCarte.cs @@ -9,6 +9,7 @@ namespace TheGameExtreme.model.gameActions.classic public Card OldCard { get; set; } + public JouerUneCarte(Piles ListOrderedStacks) : base(ListOrderedStacks) { } @@ -23,16 +24,18 @@ namespace TheGameExtreme.model.gameActions.classic { if (orderedStackSelected < 2) { + ErrorMessage = null; return rule(card, ListOrderedStacks.getStack(orderedStackSelected), true, player, CurrentCardPlayed); } else { + ErrorMessage = null; return rule(card, ListOrderedStacks.getStack(orderedStackSelected), false, player, CurrentCardPlayed); } } else { - throw new Exception(AppRessource.StrCantGetStack); + ErrorMessage = AppRessource.StrCantGetStack; } } } @@ -53,13 +56,9 @@ namespace TheGameExtreme.model.gameActions.classic } else { - throw new Exception(AppRessource.StrWrongStack); + ErrorMessage = AppRessource.StrWrongStack; + return false; } - //if (EndMessage != null) - //{ - // //throw new Exception("Le jeu est fini! Veuillez lancer une nouvelle partie!"); - // throw new Exception(AppRessource.StrEndOfGame); - //} } } } diff --git a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs index 36d7140..2ad4c4c 100644 --- a/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs +++ b/TheGameExtreme/model/gameActions/classic/TerminerSonTour.cs @@ -7,6 +7,8 @@ namespace TheGameExtreme.model.gameActions.classic { public class TerminerSonTour : GameAction { + + public TerminerSonTour(Piles ListOrderedStacks) : base(ListOrderedStacks) { } @@ -19,7 +21,12 @@ namespace TheGameExtreme.model.gameActions.classic { // Ne pas oublié de gérer les ThreeCard return Test(CurrentHand); } - return false; + else + { + ErrorMessage = AppRessource.StrCardPlayedLessThanTwo; + return false; + } + } public bool Test(List CurrentHand) diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index 4798676..71ab396 100644 --- a/TheGameExtreme/model/manager/GameManager.cs +++ b/TheGameExtreme/model/manager/GameManager.cs @@ -2,13 +2,9 @@ using System.Collections.Generic; using System.ComponentModel; using TheGameExtreme.model.card; -using TheGameExtreme.model.deck; using TheGameExtreme.model.@event; using TheGameExtreme.model.gameActions; using TheGameExtreme.model.gameActions.classic; -using TheGameExtreme.model.rule.beforeEndTurnRules; -using TheGameExtreme.model.rule.endTurnRules; -using TheGameExtreme.model.rule.playRules; namespace TheGameExtreme.model.manager { @@ -74,7 +70,7 @@ namespace TheGameExtreme.model.manager protected GameManager(List playersNames, GameMode gameMode) { - nbPlayer = players.Count; + nbPlayer = playersNames.Count; playersNames.ForEach(playerName => players.Add(new Player(playerName))); this.gameMode = gameMode; @@ -89,12 +85,34 @@ namespace TheGameExtreme.model.manager public void joue(int valueCard, int orderedStackSelected) { - gameMode.playCard(valueCard, currentHand, orderedStackSelected, players[0], CurrentCardPlayed); // Mettre le joueur actif + gameMode.playCard(valueCard, currentHand, orderedStackSelected, players[currentIndexPlayer], CurrentCardPlayed); // Mettre le joueur actif + EndMessage = gameMode.Message; } public bool endTurn() { - return gameMode.endTurn(currentHand, CurrentCardPlayed, players[0]); + if(gameMode.endTurn(currentHand, CurrentCardPlayed, players[currentIndexPlayer])) + { + EndMessage = gameMode.Message; + if (isEndGame()) + { + EndMessage = gameMode.Message; + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + + private bool isEndGame() + { + return gameMode.isEndGame(currentHand); } diff --git a/TheGameExtreme/model/manager/SoloGameManager.cs b/TheGameExtreme/model/manager/SoloGameManager.cs index 04d1c9b..87f2bd6 100644 --- a/TheGameExtreme/model/manager/SoloGameManager.cs +++ b/TheGameExtreme/model/manager/SoloGameManager.cs @@ -1,8 +1,5 @@ using System; using System.Collections.Generic; -using TheGameExtreme.model.card; -using TheGameExtreme.model.card.rapidCard; -using TheGameExtreme.model.@event; using TheGameExtreme.model.gameActions.classic; namespace TheGameExtreme.model.manager diff --git a/TheGameExtreme/viewmodel/Main.cs b/TheGameExtreme/viewmodel/Main.cs index 34b9085..0793d25 100644 --- a/TheGameExtreme/viewmodel/Main.cs +++ b/TheGameExtreme/viewmodel/Main.cs @@ -82,21 +82,25 @@ namespace TheGameExtreme.viewmodel */ public bool played(int numStack, int valueCard) { - try - { + //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; + + Alert = gameManager.EndMessage; + + //if (gameManager.EndMessage != null) + //{ + // Alert = gameManager.EndMessage; + // return true; + //} + return false; + //} + //catch (Exception e) + //{ + // // Faire un toast + // Alert = e.Message; + //} + //return false; @@ -115,17 +119,9 @@ namespace TheGameExtreme.viewmodel public bool endTurn() { - try - { - bool isEnd = gameManager.endTurn(); - Alert = gameManager.EndMessage; - return isEnd; - } - catch (Exception e) - { - Alert = e.Message; - return false; - } + bool isEnd = gameManager.endTurn(); + Alert = gameManager.EndMessage; + return isEnd; } From 2d1df465e8404ce5cd79e47d128ca98761d4d09b Mon Sep 17 00:00:00 2001 From: cldupland Date: Wed, 13 Nov 2019 11:43:47 +0100 Subject: [PATCH 7/7] Fin de la version brouillon du model --- TheGameExtreme/Preparateur.cs | 34 ++++++++++ TheGameExtreme/TheGameExtreme.csproj | 4 -- TheGameExtreme/model/Card/Card.cs | 14 ++--- .../model/gameActions/classic/GameMode.cs | 2 +- TheGameExtreme/model/manager/GameManager.cs | 45 ++++++-------- .../model/manager/MultiplayerGameManager.cs | 2 +- .../model/manager/SoloGameManager.cs | 4 +- .../manager/multiplayer/LocalGameManager.cs | 2 +- .../manager/multiplayer/RemoteGameManager.cs | 2 +- TheGameExtreme/model/rule/InfinitEffect.cs | 10 --- TheGameExtreme/model/rule/RapidEffect.cs | 38 ------------ TheGameExtreme/model/rule/Rule.cs | 15 ----- .../beforeEndTurnRules/BeforeEndTurnRule.cs | 13 ---- .../rule/beforeEndTurnRules/NbCardPlay.cs | 24 ------- .../model/rule/endTurnRules/CompleteHand.cs | 24 ------- .../model/rule/endTurnRules/EndGame.cs | 62 ------------------- .../model/rule/endTurnRules/EndTurnRule.cs | 13 ---- .../model/rule/endTurnRules/VoidDeck.cs | 17 ----- .../model/rule/playRules/Ascendant.cs | 22 ------- .../model/rule/playRules/Descendant.cs | 21 ------- .../model/rule/playRules/PasDeDix.cs | 22 ------- .../model/rule/playRules/PlayRule.cs | 11 ---- .../model/rule/playRules/VoidHand.cs | 22 ------- TheGameExtreme/view/MainPage.xaml.cs | 8 +++ TheGameExtreme/viewmodel/CardVM.cs | 33 ++++++++++ TheGameExtreme/viewmodel/Main.cs | 16 ++++- TheGameExtreme/viewmodel/PlayerVM.cs | 49 +++++++++++++++ 27 files changed, 168 insertions(+), 361 deletions(-) create mode 100644 TheGameExtreme/Preparateur.cs delete mode 100644 TheGameExtreme/model/rule/InfinitEffect.cs delete mode 100644 TheGameExtreme/model/rule/RapidEffect.cs delete mode 100644 TheGameExtreme/model/rule/Rule.cs delete mode 100644 TheGameExtreme/model/rule/beforeEndTurnRules/BeforeEndTurnRule.cs delete mode 100644 TheGameExtreme/model/rule/beforeEndTurnRules/NbCardPlay.cs delete mode 100644 TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs delete mode 100644 TheGameExtreme/model/rule/endTurnRules/EndGame.cs delete mode 100644 TheGameExtreme/model/rule/endTurnRules/EndTurnRule.cs delete mode 100644 TheGameExtreme/model/rule/endTurnRules/VoidDeck.cs delete mode 100644 TheGameExtreme/model/rule/playRules/Ascendant.cs delete mode 100644 TheGameExtreme/model/rule/playRules/Descendant.cs delete mode 100644 TheGameExtreme/model/rule/playRules/PasDeDix.cs delete mode 100644 TheGameExtreme/model/rule/playRules/PlayRule.cs delete mode 100644 TheGameExtreme/model/rule/playRules/VoidHand.cs create mode 100644 TheGameExtreme/viewmodel/CardVM.cs create mode 100644 TheGameExtreme/viewmodel/PlayerVM.cs diff --git a/TheGameExtreme/Preparateur.cs b/TheGameExtreme/Preparateur.cs new file mode 100644 index 0000000..283831f --- /dev/null +++ b/TheGameExtreme/Preparateur.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using TheGameExtreme.model; +using TheGameExtreme.model.gameActions.classic; + +namespace TheGameExtreme +{ + public class Parametreur + { + + public GameMode GameMode { get; set; } + public List players = new List(); + public int NbPlayer { get; set; } + + public Parametreur(GameMode gameMode) + { + GameMode = gameMode; + } + + public void Prepare() + { + NbPlayer = players.Count; + GameMode.load(NbPlayer, players); + } + + public void AddPlayer(Player player) + { + if (player != null) + { + players.Add(player); + } + } + } +} diff --git a/TheGameExtreme/TheGameExtreme.csproj b/TheGameExtreme/TheGameExtreme.csproj index ee43505..ecbb657 100644 --- a/TheGameExtreme/TheGameExtreme.csproj +++ b/TheGameExtreme/TheGameExtreme.csproj @@ -14,11 +14,7 @@ - - - - diff --git a/TheGameExtreme/model/Card/Card.cs b/TheGameExtreme/model/Card/Card.cs index d5931d0..cd06e34 100644 --- a/TheGameExtreme/model/Card/Card.cs +++ b/TheGameExtreme/model/Card/Card.cs @@ -3,23 +3,23 @@ using System.ComponentModel; namespace TheGameExtreme.model.card { - public abstract class Card : INotifyPropertyChanged + public abstract class Card // : INotifyPropertyChanged { - public event PropertyChangedEventHandler PropertyChanged; + //public event PropertyChangedEventHandler PropertyChanged; private int value; public int Value { get { return value; } set { this.value = value; - OnPropertyChange("Value"); + //OnPropertyChange("Value"); } } - private void OnPropertyChange(string v) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v)); - } + //private void OnPropertyChange(string v) + //{ + // PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v)); + //} public Card(int value) diff --git a/TheGameExtreme/model/gameActions/classic/GameMode.cs b/TheGameExtreme/model/gameActions/classic/GameMode.cs index 0c10966..03596a9 100644 --- a/TheGameExtreme/model/gameActions/classic/GameMode.cs +++ b/TheGameExtreme/model/gameActions/classic/GameMode.cs @@ -123,7 +123,7 @@ namespace TheGameExtreme.model.gameActions.classic nbCardAtBeginOfTurn = currentHand.Count; CurrentCardPlayed.Clear(); - OnPlayerChanged(new PlayerChangedEventArgs(currentHand, player.Pseudo)); + OnPlayerChanged(null); return false; } else diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index 71ab396..bff823f 100644 --- a/TheGameExtreme/model/manager/GameManager.cs +++ b/TheGameExtreme/model/manager/GameManager.cs @@ -13,12 +13,8 @@ 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; - public readonly int nbPlayer; - protected List players = new List(); + protected Parametreur preparateur; public Piles ListOrderedStacks { get; set; } - //protected int nbCardAtBeginOfTurn; - protected int nbMaxCard; protected List CurrentCardPlayed = new List(); public String EndMessage { get; set; } protected int currentIndexPlayer; @@ -48,55 +44,50 @@ namespace TheGameExtreme.model.manager { TopRangeChanged?.Invoke(this, args); } - protected internal void OnPlayerChanged(PlayerChangedEventArgs args) + protected internal void OnPlayerChanged(object source, PlayerChangedEventArgs args) { currentIndexPlayer += 1; - if (currentIndexPlayer == players.Count) + if (currentIndexPlayer == preparateur.players.Count) { currentIndexPlayer = 0; } - CurrentHand = players[currentIndexPlayer].getCardList(); - PlayerChanged?.Invoke(this, args); + CurrentHand = preparateur.players[currentIndexPlayer].getCardList(); + PlayerChanged?.Invoke(this, new PlayerChangedEventArgs(CurrentHand, preparateur.players[currentIndexPlayer].Pseudo)); } #endregion - //protected bool win = true; - //public String EndMessage { get; set; } - - - - protected GameManager(List playersNames, GameMode gameMode) + protected GameManager(Parametreur parametreur) { - nbPlayer = playersNames.Count; - playersNames.ForEach(playerName => players.Add(new Player(playerName))); + this.preparateur = parametreur; + + parametreur.Prepare(); - this.gameMode = gameMode; - gameMode.load(nbPlayer, players); + parametreur.GameMode.TopRangeChanged += OnTopRangeChanged; - gameMode.TopRangeChanged += OnTopRangeChanged; + parametreur.GameMode.PlayerChanged += OnPlayerChanged; - CurrentHand = players[0].getCardList(); + CurrentHand = parametreur.players[0].getCardList(); } public void joue(int valueCard, int orderedStackSelected) { - gameMode.playCard(valueCard, currentHand, orderedStackSelected, players[currentIndexPlayer], CurrentCardPlayed); // Mettre le joueur actif - EndMessage = gameMode.Message; + preparateur.GameMode.playCard(valueCard, currentHand, orderedStackSelected, preparateur.players[currentIndexPlayer], CurrentCardPlayed); // Mettre le joueur actif + EndMessage = preparateur.GameMode.Message; } public bool endTurn() { - if(gameMode.endTurn(currentHand, CurrentCardPlayed, players[currentIndexPlayer])) + if(preparateur.GameMode.endTurn(currentHand, CurrentCardPlayed, preparateur.players[currentIndexPlayer])) { - EndMessage = gameMode.Message; + EndMessage = preparateur.GameMode.Message; if (isEndGame()) { - EndMessage = gameMode.Message; + EndMessage = preparateur.GameMode.Message; return true; } else @@ -112,7 +103,7 @@ namespace TheGameExtreme.model.manager private bool isEndGame() { - return gameMode.isEndGame(currentHand); + return preparateur.GameMode.isEndGame(currentHand); } diff --git a/TheGameExtreme/model/manager/MultiplayerGameManager.cs b/TheGameExtreme/model/manager/MultiplayerGameManager.cs index 46dbe13..90bd81c 100644 --- a/TheGameExtreme/model/manager/MultiplayerGameManager.cs +++ b/TheGameExtreme/model/manager/MultiplayerGameManager.cs @@ -6,7 +6,7 @@ namespace TheGameExtreme.model.manager { public abstract class MultiplayerGameManager : GameManager { - protected MultiplayerGameManager(List players, GameMode gameMode) : base(players, gameMode) + protected MultiplayerGameManager(Parametreur parametreur) : base(parametreur) { } } diff --git a/TheGameExtreme/model/manager/SoloGameManager.cs b/TheGameExtreme/model/manager/SoloGameManager.cs index 87f2bd6..d3e7204 100644 --- a/TheGameExtreme/model/manager/SoloGameManager.cs +++ b/TheGameExtreme/model/manager/SoloGameManager.cs @@ -7,8 +7,8 @@ namespace TheGameExtreme.model.manager public class SoloGameManager : GameManager { - public SoloGameManager(List players, GameMode gameMode) - : base(players, gameMode) + public SoloGameManager(Parametreur parametreur) + : base(parametreur) { } diff --git a/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs b/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs index 648b211..ac880d6 100644 --- a/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs +++ b/TheGameExtreme/model/manager/multiplayer/LocalGameManager.cs @@ -7,7 +7,7 @@ namespace TheGameExtreme.model.manager { public class LocalGameManager : MultiplayerGameManager { - public LocalGameManager(List players, GameMode gameMode) : base(players, gameMode) + public LocalGameManager(Parametreur parametreur) : base(parametreur) { } diff --git a/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs b/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs index d950c83..dd30116 100644 --- a/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs +++ b/TheGameExtreme/model/manager/multiplayer/RemoteGameManager.cs @@ -7,7 +7,7 @@ namespace TheGameExtreme.model.manager.multiplayer { public class RemoteGameManager : MultiplayerGameManager { - public RemoteGameManager(List players, GameMode gameMode) : base(players, gameMode) + public RemoteGameManager(Parametreur parametreur) : base(parametreur) { } diff --git a/TheGameExtreme/model/rule/InfinitEffect.cs b/TheGameExtreme/model/rule/InfinitEffect.cs deleted file mode 100644 index c7a4896..0000000 --- a/TheGameExtreme/model/rule/InfinitEffect.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; -namespace TheGameExtreme.model.rule -{ - public class InfinitEffect : Rule - { - public InfinitEffect() - { - } - } -} diff --git a/TheGameExtreme/model/rule/RapidEffect.cs b/TheGameExtreme/model/rule/RapidEffect.cs deleted file mode 100644 index ddf2d0e..0000000 --- a/TheGameExtreme/model/rule/RapidEffect.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -namespace TheGameExtreme.model.rule -{ - public class RapidEffect : Rule - { - public RapidEffect() - { - } - - // Checker les cartes du haut de pile et celle joué. - - //protected bool effectLose() - //{ - // foreach (Stack orderedStack in ListOrderedStacks) - // { - // if (Equals(orderedStack.Peek().getName(), EndGameCard.CARD_ENDGAME)) - // { - // return true; - // } - // } - // return false; - //} - - - //foreach (Card cardPlayed in CurrentCardPlayed) - //{ - // if (Equals(cardPlayed.GetType(), ThreeCard.CARD_THREE)) - // { - // if ((nbCardAtBeginOfTurn - CurrentHand.Count) < 3) - // { - // return true; - // } - // } - //} - - - } -} diff --git a/TheGameExtreme/model/rule/Rule.cs b/TheGameExtreme/model/rule/Rule.cs deleted file mode 100644 index 09f55ad..0000000 --- a/TheGameExtreme/model/rule/Rule.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule -{ - public abstract class Rule - { - - public bool Test() - { - throw new NotImplementedException(); - } - - } -} diff --git a/TheGameExtreme/model/rule/beforeEndTurnRules/BeforeEndTurnRule.cs b/TheGameExtreme/model/rule/beforeEndTurnRules/BeforeEndTurnRule.cs deleted file mode 100644 index fc4f267..0000000 --- a/TheGameExtreme/model/rule/beforeEndTurnRules/BeforeEndTurnRule.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.beforeEndTurnRules -{ - public abstract class BeforeEndTurnRule : Rule - { - - public abstract bool Test(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand); - - } -} diff --git a/TheGameExtreme/model/rule/beforeEndTurnRules/NbCardPlay.cs b/TheGameExtreme/model/rule/beforeEndTurnRules/NbCardPlay.cs deleted file mode 100644 index bc8faa4..0000000 --- a/TheGameExtreme/model/rule/beforeEndTurnRules/NbCardPlay.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.beforeEndTurnRules -{ - public class NbCardPlay : BeforeEndTurnRule - { - - override public bool Test(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand) - { - if (CurrentHand.Count == 0) - { - return true; - } - if ((nbCardAtBeginOfTurn - CurrentHand.Count) < 2) - { - return false; - } - return true; - } - - } -} diff --git a/TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs b/TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs deleted file mode 100644 index fef0c49..0000000 --- a/TheGameExtreme/model/rule/endTurnRules/CompleteHand.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.endTurnRules -{ - public class CompleteHand : EndTurnRule - { - - public static readonly String REGLE_COMPLETEHAND = "Complete Hand"; - - 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) - // Sinon - if (nbCardAtBeginOfTurn == CurrentCardPlayed.Count) - { - return true; - } - return false; - } - - } -} diff --git a/TheGameExtreme/model/rule/endTurnRules/EndGame.cs b/TheGameExtreme/model/rule/endTurnRules/EndGame.cs deleted file mode 100644 index 88e20f4..0000000 --- a/TheGameExtreme/model/rule/endTurnRules/EndGame.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; -using TheGameExtreme.model.card.rapidCard; - -namespace TheGameExtreme.model.rule.endTurnRules -{ - public class EndGame : EndTurnRule - { - - public static readonly String REGLE_ENDGAME = "End Game"; - - public List> ListOrderedStacks { get; set; } - - public EndGame(List> ListOrderedStacks) - { - this.ListOrderedStacks = ListOrderedStacks; - } - - public override bool Test(List CurrentCardPlayed, int nbCardAtBeginOfTurn, 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[0].Peek().Value || card.Value > ListOrderedStacks[1].Peek().Value || card.Value < ListOrderedStacks[2].Peek().Value || card.Value < ListOrderedStacks[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/rule/endTurnRules/EndTurnRule.cs b/TheGameExtreme/model/rule/endTurnRules/EndTurnRule.cs deleted file mode 100644 index d9670f7..0000000 --- a/TheGameExtreme/model/rule/endTurnRules/EndTurnRule.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.endTurnRules -{ - public abstract class EndTurnRule : Rule - { - - public abstract bool Test(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand); - - } -} diff --git a/TheGameExtreme/model/rule/endTurnRules/VoidDeck.cs b/TheGameExtreme/model/rule/endTurnRules/VoidDeck.cs deleted file mode 100644 index 397af2d..0000000 --- a/TheGameExtreme/model/rule/endTurnRules/VoidDeck.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.endTurnRules -{ - public class VoidDeck : EndTurnRule - { - - public static readonly String REGLE_VOIDDECK = "Void Deck"; - - public override bool Test(List CurrentCardPlayed, int nbCardAtBeginOfTurn, List CurrentHand) - { - throw new NotImplementedException(); - } - } -} diff --git a/TheGameExtreme/model/rule/playRules/Ascendant.cs b/TheGameExtreme/model/rule/playRules/Ascendant.cs deleted file mode 100644 index 6069687..0000000 --- a/TheGameExtreme/model/rule/playRules/Ascendant.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.playRules -{ - public class Ascendant : PlayRule - { - - public static readonly String REGLE_ASCENDANT = "Ascendant"; - - override public bool Test(Card playedCard, Stack stack, bool bottomUp, List CurrentHand) - { - if (bottomUp && playedCard.Value > stack.Peek().Value) - { - return true; - } - return false; - } - - } -} diff --git a/TheGameExtreme/model/rule/playRules/Descendant.cs b/TheGameExtreme/model/rule/playRules/Descendant.cs deleted file mode 100644 index 4ebcfbc..0000000 --- a/TheGameExtreme/model/rule/playRules/Descendant.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.playRules -{ - public class Descendant : PlayRule - { - - public static readonly String REGLE_DESCENDANT = "Descendant"; - - override public bool Test(Card playedCard, Stack stack, bool bottomUp, List CurrentHand) - { - if (!bottomUp && playedCard.Value < stack.Peek().Value) - { - return true; - } - return false; - } - } -} \ No newline at end of file diff --git a/TheGameExtreme/model/rule/playRules/PasDeDix.cs b/TheGameExtreme/model/rule/playRules/PasDeDix.cs deleted file mode 100644 index 699a6fa..0000000 --- a/TheGameExtreme/model/rule/playRules/PasDeDix.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.playRules -{ - public class PasDeDix : PlayRule - { - - public static readonly String REGLE_PASDEDIX = "PasDeDix"; - - override public bool Test(Card playedCard, Stack stack, bool bottomUp, List CurrentHand) - { - if ((stack.Peek().Value + 10) == playedCard.Value || (stack.Peek().Value - 10) == playedCard.Value) - { - return true; - } - return false; - } - - } -} diff --git a/TheGameExtreme/model/rule/playRules/PlayRule.cs b/TheGameExtreme/model/rule/playRules/PlayRule.cs deleted file mode 100644 index 29289f2..0000000 --- a/TheGameExtreme/model/rule/playRules/PlayRule.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.playRules -{ - public abstract class PlayRule : Rule - { - public abstract bool Test(Card playedCard, Stack stack, bool bottomUp, List CurrentHand); - } -} diff --git a/TheGameExtreme/model/rule/playRules/VoidHand.cs b/TheGameExtreme/model/rule/playRules/VoidHand.cs deleted file mode 100644 index 88a1cc2..0000000 --- a/TheGameExtreme/model/rule/playRules/VoidHand.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using TheGameExtreme.model.card; - -namespace TheGameExtreme.model.rule.playRules -{ - public class VoidHand : PlayRule - { - - public static readonly String REGLE_VOIDHAND = "Void Hand"; - - override public bool Test(Card playedCard, Stack stack, bool bottomUp, List CurrentHand) - { - if (CurrentHand.Count == 0) - { - return false; - } - return true; - } - - } -} diff --git a/TheGameExtreme/view/MainPage.xaml.cs b/TheGameExtreme/view/MainPage.xaml.cs index 0468ab0..54cee72 100644 --- a/TheGameExtreme/view/MainPage.xaml.cs +++ b/TheGameExtreme/view/MainPage.xaml.cs @@ -33,12 +33,19 @@ namespace TheGameExtreme.view viewmodel.BindingChanged += OnBindingChanged; + //viewmodel.PlayerChanged += OnPlayerChanged; + Alert.SetBinding(Label.TextProperty, new Binding("Alert", source: viewmodel)); pseudo.SetBinding(Label.TextProperty, new Binding("Pseudo", source: viewmodel)); inflateHand(); } + //private void OnPlayerChanged(object sender, PlayerChangedEventArgs args) + //{ + // inflateHand(); + //} + private void inflateHand() { Hand.Children.Clear(); @@ -145,6 +152,7 @@ namespace TheGameExtreme.view private void endTurn(object sender, EventArgs args) { + viewmodel.Alert = ""; if (viewmodel.endTurn()) { botPanel.Children.Add(button); diff --git a/TheGameExtreme/viewmodel/CardVM.cs b/TheGameExtreme/viewmodel/CardVM.cs new file mode 100644 index 0000000..9416d8b --- /dev/null +++ b/TheGameExtreme/viewmodel/CardVM.cs @@ -0,0 +1,33 @@ +using System; +using System.ComponentModel; +using TheGameExtreme.model.card; + +namespace TheGameExtreme.viewmodel +{ + public class CardVM : INotifyPropertyChanged + { + + public event PropertyChangedEventHandler PropertyChanged; + public Card View { get; set; } + private int value; + public int Value { + get { return value; } + set + { + this.value = value; + OnPropertyChanged("Value"); + } + } + protected virtual void OnPropertyChanged(string info) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info)); + } + + public CardVM(Card view) + { + View = view; + + Value = view.Value; + } + } +} diff --git a/TheGameExtreme/viewmodel/Main.cs b/TheGameExtreme/viewmodel/Main.cs index 0793d25..10a7c02 100644 --- a/TheGameExtreme/viewmodel/Main.cs +++ b/TheGameExtreme/viewmodel/Main.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; +using TheGameExtreme.model; using TheGameExtreme.model.card; using TheGameExtreme.model.@event; using TheGameExtreme.model.gameActions.classic; @@ -12,8 +13,10 @@ namespace TheGameExtreme.viewmodel public class Main : INotifyPropertyChanged { + //public event EventHandler PlayerChanged; public event EventHandler BindingChanged; public event PropertyChangedEventHandler PropertyChanged; + private List players = new List(); private string alert = ""; public String Alert { @@ -46,14 +49,20 @@ namespace TheGameExtreme.viewmodel public Main() { - gameManager = new SoloGameManager(new List { "Clément", "Baptiste" }, new GameMode()) ; // Donner le nom des joueurs + List playersNames = new List { "Clément", "Baptiste" }; + playersNames.ForEach(name => players.Add(new PlayerVM(new Player(name)))); + Parametreur parametreur = new Parametreur(new GameMode()); + players.ForEach(player => parametreur.AddPlayer(player.View)); + gameManager = new SoloGameManager(parametreur) ; // Donner le nom des joueurs - gameManager.TopRangeChanged += OnTopRangeChanged; + gameManager.TopRangeChanged += OnBindingChanged; gameManager.PlayerChanged += OnPlayerChanged; CurrentHand = gameManager.CurrentHand; + Pseudo = players[0].Pseudo; + //ListOrderedStacks = new ObservableCollection>(gameManager.ListOrderedStacks); } @@ -61,9 +70,10 @@ namespace TheGameExtreme.viewmodel { CurrentHand = args.NewCurrentHand; Pseudo = args.Pseudo; + //PlayerChanged?.Invoke(this, args); } - public void OnTopRangeChanged(object source, TopRangeChangedEventArgs args) + public void OnBindingChanged(object source, TopRangeChangedEventArgs args) { BindingChanged?.Invoke(this, args); } diff --git a/TheGameExtreme/viewmodel/PlayerVM.cs b/TheGameExtreme/viewmodel/PlayerVM.cs new file mode 100644 index 0000000..09f494b --- /dev/null +++ b/TheGameExtreme/viewmodel/PlayerVM.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using TheGameExtreme.model; +using TheGameExtreme.model.card; +using TheGameExtreme.model.@event; + +namespace TheGameExtreme.viewmodel +{ + public class PlayerVM + { + + public Player View { get; set; } + public string Pseudo { get; set; } + private List cardList = new List(); + //public event EventHandler HandCardChanged; + + public PlayerVM(Player view) + { + View = view; + + Pseudo = view.Pseudo; + view.getCardList().ForEach(card => cardList.Add(new CardVM(card))); + + View.HandCardChanged += OnHandCardChanged; + } + + private void OnHandCardChanged(object sender, HandCardChangedEventArgs args) + { + if (args.NewCard == null) + { + cardList.RemoveAt(args.Position); + } + else + { + cardList.Insert(args.Position, new CardVM(args.NewCard)); + } + } + + public void pioche(CardVM card) + { + View.pioche(card.View); + } + + public List getCardList() + { + return cardList; + } + } +}