diff --git a/TheGameExtreme/model/Card.cs b/TheGameExtreme/model/Card.cs index 3411b9a..b3c1b83 100644 --- a/TheGameExtreme/model/Card.cs +++ b/TheGameExtreme/model/Card.cs @@ -1,12 +1,28 @@ using System; +using System.ComponentModel; namespace TheGameExtreme.model { - public class Card + public class Card : INotifyPropertyChanged { - public int Value { get; private set;} - public Effect Effect { get; private set;} + public event PropertyChangedEventHandler PropertyChanged; + private int value; + public int Value + { + get { return value; } + set { + this.value = value; + OnPropertyChange("Value"); + } + } + private void OnPropertyChange(string v) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v)); + } + + public Effect Effect { get; private set; } + public Card(int value) { diff --git a/TheGameExtreme/model/Player.cs b/TheGameExtreme/model/Player.cs index 1640dbb..e66f016 100644 --- a/TheGameExtreme/model/Player.cs +++ b/TheGameExtreme/model/Player.cs @@ -21,13 +21,15 @@ namespace TheGameExtreme.model public void pioche(Card card) { cardList.Add(card); - OnCardDrawable(new HandCardChangedEventArgs(card, null)); + int position = cardList.IndexOf(card); + OnCardDrawable(new HandCardChangedEventArgs(card, position)); } public void joue(Card card) { + int position = cardList.IndexOf(card); cardList.Remove(card); - OnCardDrawable(new HandCardChangedEventArgs(null, card)); + OnCardDrawable(new HandCardChangedEventArgs(null, position)); } //public IReadOnlyList getCardList() diff --git a/TheGameExtreme/model/event/CurrentHandChangedEventArgs.cs b/TheGameExtreme/model/event/CurrentHandChangedEventArgs.cs new file mode 100644 index 0000000..82f4969 --- /dev/null +++ b/TheGameExtreme/model/event/CurrentHandChangedEventArgs.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace TheGameExtreme.model.@event +{ + public class HandCardChangedEventArgs + { + + public Card NewCard { get; set; } + public int Position { get; set; } + + public HandCardChangedEventArgs(Card newCard, int position) + { + NewCard = newCard; + Position = position; + } + } +} diff --git a/TheGameExtreme/model/event/HandCardChangedEventArgs.cs b/TheGameExtreme/model/event/HandCardChangedEventArgs.cs deleted file mode 100644 index 98ce5ee..0000000 --- a/TheGameExtreme/model/event/HandCardChangedEventArgs.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -namespace TheGameExtreme.model.@event -{ - public class HandCardChangedEventArgs - { - - public Card NewHandCard { get; set; } - public Card OldHandCard { get; set; } - - public HandCardChangedEventArgs(Card newHandCard, Card oldHandCard) - { - NewHandCard = newHandCard; - OldHandCard = oldHandCard; - } - } -} diff --git a/TheGameExtreme/model/event/PlayerChangedEventArgs.cs b/TheGameExtreme/model/event/PlayerChangedEventArgs.cs new file mode 100644 index 0000000..161e1a0 --- /dev/null +++ b/TheGameExtreme/model/event/PlayerChangedEventArgs.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace TheGameExtreme.model.@event +{ + public class PlayerChangedEventArgs : EventArgs + { + + public List NewCurrentHand; + + public PlayerChangedEventArgs(List newCurrentHand) + { + NewCurrentHand = newCurrentHand; + } + } +} diff --git a/TheGameExtreme/model/manager/GameManager.cs b/TheGameExtreme/model/manager/GameManager.cs index fc0ad61..912ae16 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.effect; using TheGameExtreme.model.@event; @@ -10,34 +11,48 @@ namespace TheGameExtreme.model.manager public readonly int nbPlayer; protected int nbMaxCard; - protected int currentIndexPlayer = 0; + protected int currentIndexPlayer; protected List playerList = new List(); protected List infiniteEffectsConstraintsList = new List(); - protected List> listOrderedStacks = new List>(); + public List> ListOrderedStacks { get; set; } protected List deck = new List(); protected bool win = true; public event EventHandler TopRangeChanged; - public event EventHandler CurrentPlayerChanged; + public event EventHandler PlayerChanged; + //public event EventHandler CurrentPlayerChanged; + public List CurrentHand { get; set; } - public GameManager(int nbPlayer, List players) + + public GameManager(int nbPlayer, List players) { + ListOrderedStacks = new List>(); + CurrentHand = new List(); + this.nbPlayer = nbPlayer; - players.ForEach(player => playerList.Add(player)); + players.ForEach(player => playerList.Add(new Player(player))); + + ListOrderedStacks.Add(new Stack()); + ListOrderedStacks.Add(new Stack()); + ListOrderedStacks.Add(new Stack()); + ListOrderedStacks.Add(new Stack()); + for (int i = 0; i < 4; i++) { - listOrderedStacks.Add(new Stack()); if (i < 2) { - listOrderedStacks[i].Push(new Card(100)); + ListOrderedStacks[i].Push(new Card(1)); } else { - listOrderedStacks[i].Push(new Card(1)); + ListOrderedStacks[i].Push(new Card(100)); } } + createDeck(); defineNbMaxCard(); distribueCard(); + + CurrentHand = playerList[currentIndexPlayer].getCardList(); } protected void createDeck() @@ -94,19 +109,26 @@ namespace TheGameExtreme.model.manager } } - public void joue(Card card, int orderedStackSelected) + public void joue(int valueCard, int orderedStackSelected) { - if (orderedStackSelected >= 0 && orderedStackSelected < 4) + CurrentHand.ForEach(card => { - if (orderedStackSelected < 2) + if (valueCard == card.Value) { - testPossibility(card, listOrderedStacks[orderedStackSelected], false); + if (orderedStackSelected >= 0 && orderedStackSelected < 4) + { + if (orderedStackSelected < 2) + { + testPossibility(card, ListOrderedStacks[orderedStackSelected], false); + } + else + { + testPossibility(card, ListOrderedStacks[orderedStackSelected], true); + } + } + return; } - else - { - testPossibility(card, listOrderedStacks[orderedStackSelected], true); - } - } + }); } protected void testPossibility(Card card, Stack orderedStack, bool bottomUp) @@ -116,11 +138,11 @@ namespace TheGameExtreme.model.manager Card oldCard = orderedStack.Peek(); playerList[currentIndexPlayer].joue(card); orderedStack.Push(card); - OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, listOrderedStacks.IndexOf(orderedStack))); + OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack))); } else { - // Throw Exception + throw new Exception("La carte ne rentre pas dans la pile sectionné!"); } } @@ -129,9 +151,26 @@ namespace TheGameExtreme.model.manager TopRangeChanged?.Invoke(this, args); } - protected internal void OnCurrentPlayerChanged(CurrentPlayerChangedEventArgs args) + protected internal void OnPlayerChanged(PlayerChangedEventArgs args) { - CurrentPlayerChanged?.Invoke(this, args); + PlayerChanged?.Invoke(this, args); + } + + //protected internal void OnCurrentPlayerChanged(CurrentPlayerChangedEventArgs args) + //{ + // CurrentPlayerChanged?.Invoke(this, args); + //} + + public bool isCanPlay() + { + if (CurrentHand.Count > 0) + { + return true; + } + else + { + return false; + } } abstract public void endTurn(); @@ -140,7 +179,7 @@ namespace TheGameExtreme.model.manager abstract protected bool isEndGame(); - abstract protected List tryToFindSoluce(List playableCard, Player currentPlayer); + abstract protected void tryToFindSoluce(List playableCard); abstract protected bool testEndGame(List playableCard); diff --git a/TheGameExtreme/model/manager/SoloGameManager.cs b/TheGameExtreme/model/manager/SoloGameManager.cs index 9350611..63f931b 100644 --- a/TheGameExtreme/model/manager/SoloGameManager.cs +++ b/TheGameExtreme/model/manager/SoloGameManager.cs @@ -8,7 +8,7 @@ namespace TheGameExtreme.model.manager public class SoloGameManager : GameManager { - public SoloGameManager(int nbPlayer, List players) + public SoloGameManager(int nbPlayer, List players) : base(nbPlayer, players) { @@ -23,7 +23,8 @@ namespace TheGameExtreme.model.manager { currentIndexPlayer = 0; } - OnCurrentPlayerChanged(new CurrentPlayerChangedEventArgs(currentIndexPlayer)); + CurrentHand = playerList[currentIndexPlayer].getCardList(); + OnPlayerChanged(new PlayerChangedEventArgs(CurrentHand)); if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs { @@ -40,7 +41,7 @@ namespace TheGameExtreme.model.manager protected override void pioche() { - int nbPickedCard = nbMaxCard - playerList[currentIndexPlayer].getCardList().Count; + int nbPickedCard = nbMaxCard - CurrentHand.Count; for (int i = 0; i < nbPickedCard; i++) { int random = new Random().Next(0, deck.Count - 1); @@ -51,11 +52,10 @@ namespace TheGameExtreme.model.manager protected override bool isEndGame() { - Player currentPlayer = playerList[currentIndexPlayer]; - if (currentPlayer.getCardList().Count != 0) + if (CurrentHand.Count != 0) { List playableCard = new List(); - tryToFindSoluce(playableCard, currentPlayer); + tryToFindSoluce(playableCard); return testEndGame(playableCard); } return false; @@ -103,18 +103,15 @@ namespace TheGameExtreme.model.manager //}); } - protected override List tryToFindSoluce(List playableCard, Player currentPlayer) + protected override void tryToFindSoluce(List playableCard) { - List cardList = new List(currentPlayer.getCardList()); - cardList.ForEach(card => + 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) + 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); } }); - - return playableCard; } protected override bool testEndGame(List playableCard) @@ -146,7 +143,7 @@ namespace TheGameExtreme.model.manager protected override bool effectLose() { - foreach (Stack orderedStack in listOrderedStacks) + foreach (Stack orderedStack in ListOrderedStacks) { if (orderedStack.Peek().GetType() == typeof(EndGame)) { diff --git a/TheGameExtreme/view/MainPage.xaml b/TheGameExtreme/view/MainPage.xaml index fbb8ebb..e02951b 100644 --- a/TheGameExtreme/view/MainPage.xaml +++ b/TheGameExtreme/view/MainPage.xaml @@ -7,27 +7,71 @@ mc:Ignorable="d" x:Class="TheGameExtreme.MainPage"> - - - + Orientation="Vertical" + Margin="10,20,10,20"> +