|
|
@ -1,5 +1,6 @@
|
|
|
|
using System;
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
using TheGameExtreme.model.effect;
|
|
|
|
using TheGameExtreme.model.effect;
|
|
|
|
using TheGameExtreme.model.@event;
|
|
|
|
using TheGameExtreme.model.@event;
|
|
|
|
|
|
|
|
|
|
|
@ -10,34 +11,48 @@ namespace TheGameExtreme.model.manager
|
|
|
|
|
|
|
|
|
|
|
|
public readonly int nbPlayer;
|
|
|
|
public readonly int nbPlayer;
|
|
|
|
protected int nbMaxCard;
|
|
|
|
protected int nbMaxCard;
|
|
|
|
protected int currentIndexPlayer = 0;
|
|
|
|
protected int currentIndexPlayer;
|
|
|
|
protected List<Player> playerList = new List<Player>();
|
|
|
|
protected List<Player> playerList = new List<Player>();
|
|
|
|
protected List<InfiniteEffect> infiniteEffectsConstraintsList = new List<InfiniteEffect>();
|
|
|
|
protected List<InfiniteEffect> infiniteEffectsConstraintsList = new List<InfiniteEffect>();
|
|
|
|
protected List<Stack<Card>> listOrderedStacks = new List<Stack<Card>>();
|
|
|
|
public List<Stack<Card>> ListOrderedStacks { get; set; }
|
|
|
|
protected List<Card> deck = new List<Card>();
|
|
|
|
protected List<Card> deck = new List<Card>();
|
|
|
|
protected bool win = true;
|
|
|
|
protected bool win = true;
|
|
|
|
public event EventHandler<TopRangeChangedEventArgs> TopRangeChanged;
|
|
|
|
public event EventHandler<TopRangeChangedEventArgs> TopRangeChanged;
|
|
|
|
public event EventHandler<CurrentPlayerChangedEventArgs> CurrentPlayerChanged;
|
|
|
|
public event EventHandler<PlayerChangedEventArgs> PlayerChanged;
|
|
|
|
|
|
|
|
//public event EventHandler<CurrentPlayerChangedEventArgs> CurrentPlayerChanged;
|
|
|
|
|
|
|
|
public List<Card> CurrentHand { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
public GameManager(int nbPlayer, List<Player> players)
|
|
|
|
|
|
|
|
|
|
|
|
public GameManager(int nbPlayer, List<String> players)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
ListOrderedStacks = new List<Stack<Card>>();
|
|
|
|
|
|
|
|
CurrentHand = new List<Card>();
|
|
|
|
|
|
|
|
|
|
|
|
this.nbPlayer = nbPlayer;
|
|
|
|
this.nbPlayer = nbPlayer;
|
|
|
|
players.ForEach(player => playerList.Add(player));
|
|
|
|
players.ForEach(player => playerList.Add(new Player(player)));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ListOrderedStacks.Add(new Stack<Card>());
|
|
|
|
|
|
|
|
ListOrderedStacks.Add(new Stack<Card>());
|
|
|
|
|
|
|
|
ListOrderedStacks.Add(new Stack<Card>());
|
|
|
|
|
|
|
|
ListOrderedStacks.Add(new Stack<Card>());
|
|
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
for (int i = 0; i < 4; i++)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
listOrderedStacks.Add(new Stack<Card>());
|
|
|
|
|
|
|
|
if (i < 2)
|
|
|
|
if (i < 2)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
listOrderedStacks[i].Push(new Card(100));
|
|
|
|
ListOrderedStacks[i].Push(new Card(1));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
listOrderedStacks[i].Push(new Card(1));
|
|
|
|
ListOrderedStacks[i].Push(new Card(100));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
createDeck();
|
|
|
|
createDeck();
|
|
|
|
defineNbMaxCard();
|
|
|
|
defineNbMaxCard();
|
|
|
|
distribueCard();
|
|
|
|
distribueCard();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CurrentHand = playerList[currentIndexPlayer].getCardList();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected void createDeck()
|
|
|
|
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)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
CurrentHand.ForEach(card =>
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
if (valueCard == card.Value)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (orderedStackSelected >= 0 && orderedStackSelected < 4)
|
|
|
|
if (orderedStackSelected >= 0 && orderedStackSelected < 4)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (orderedStackSelected < 2)
|
|
|
|
if (orderedStackSelected < 2)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
testPossibility(card, listOrderedStacks[orderedStackSelected], false);
|
|
|
|
testPossibility(card, ListOrderedStacks[orderedStackSelected], false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
testPossibility(card, listOrderedStacks[orderedStackSelected], true);
|
|
|
|
testPossibility(card, ListOrderedStacks[orderedStackSelected], true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected void testPossibility(Card card, Stack<Card> orderedStack, bool bottomUp)
|
|
|
|
protected void testPossibility(Card card, Stack<Card> orderedStack, bool bottomUp)
|
|
|
@ -116,11 +138,11 @@ namespace TheGameExtreme.model.manager
|
|
|
|
Card oldCard = orderedStack.Peek();
|
|
|
|
Card oldCard = orderedStack.Peek();
|
|
|
|
playerList[currentIndexPlayer].joue(card);
|
|
|
|
playerList[currentIndexPlayer].joue(card);
|
|
|
|
orderedStack.Push(card);
|
|
|
|
orderedStack.Push(card);
|
|
|
|
OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, listOrderedStacks.IndexOf(orderedStack)));
|
|
|
|
OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack)));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
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);
|
|
|
|
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();
|
|
|
|
abstract public void endTurn();
|
|
|
@ -140,7 +179,7 @@ namespace TheGameExtreme.model.manager
|
|
|
|
|
|
|
|
|
|
|
|
abstract protected bool isEndGame();
|
|
|
|
abstract protected bool isEndGame();
|
|
|
|
|
|
|
|
|
|
|
|
abstract protected List<Card> tryToFindSoluce(List<Card> playableCard, Player currentPlayer);
|
|
|
|
abstract protected void tryToFindSoluce(List<Card> playableCard);
|
|
|
|
|
|
|
|
|
|
|
|
abstract protected bool testEndGame(List<Card> playableCard);
|
|
|
|
abstract protected bool testEndGame(List<Card> playableCard);
|
|
|
|
|
|
|
|
|
|
|
|