You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
156 lines
4.6 KiB
156 lines
4.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using TheGameExtreme.model.effect;
|
|
using TheGameExtreme.model.@event;
|
|
|
|
namespace TheGameExtreme.model.manager
|
|
{
|
|
public abstract class GameManager
|
|
{
|
|
|
|
public readonly int nbPlayer;
|
|
protected int nbMaxCard;
|
|
protected int currentIndexPlayer = 0;
|
|
protected List<Player> playerList = new List<Player>();
|
|
protected List<InfiniteEffect> infiniteEffectsConstraintsList = new List<InfiniteEffect>();
|
|
protected List<Stack<Card>> listOrderedStacks = new List<Stack<Card>>();
|
|
protected List<Card> deck = new List<Card>();
|
|
protected bool win = true;
|
|
public event EventHandler<TopRangeChangedEventArgs> TopRangeChanged;
|
|
public event EventHandler<CurrentPlayerChangedEventArgs> CurrentPlayerChanged;
|
|
|
|
public GameManager(int nbPlayer, List<Player> players)
|
|
{
|
|
this.nbPlayer = nbPlayer;
|
|
players.ForEach(player => playerList.Add(player));
|
|
for (int i = 0; i < 4; i++)
|
|
{
|
|
listOrderedStacks.Add(new Stack<Card>());
|
|
if (i < 2)
|
|
{
|
|
listOrderedStacks[i].Push(new Card(100));
|
|
}
|
|
else
|
|
{
|
|
listOrderedStacks[i].Push(new Card(1));
|
|
}
|
|
}
|
|
createDeck();
|
|
defineNbMaxCard();
|
|
distribueCard();
|
|
}
|
|
|
|
protected void createDeck()
|
|
{
|
|
for (int i = 2; i <= 99; i++)
|
|
{
|
|
deck.Add(new Card(i));
|
|
}
|
|
melangeDeck();
|
|
}
|
|
|
|
protected void melangeDeck()
|
|
{
|
|
Random random = new Random();
|
|
int place1;
|
|
int place2;
|
|
Card tmp;
|
|
|
|
for (int i = 0; i < 1000; i++)
|
|
{
|
|
place1 = random.Next(0, 98);
|
|
place2 = random.Next(0, 98);
|
|
|
|
tmp = deck[place1];
|
|
deck[place1] = deck[place2];
|
|
deck[place2] = tmp;
|
|
}
|
|
}
|
|
|
|
protected void defineNbMaxCard()
|
|
{
|
|
switch (nbPlayer)
|
|
{
|
|
case 1:
|
|
nbMaxCard = 8;
|
|
break;
|
|
case 2:
|
|
nbMaxCard = 7;
|
|
break;
|
|
default:
|
|
nbMaxCard = 6;
|
|
break;
|
|
}
|
|
}
|
|
|
|
protected void distribueCard()
|
|
{
|
|
for (int i = 0; i < nbMaxCard; i++)
|
|
{
|
|
playerList.ForEach(player => {
|
|
player.pioche(deck[deck.Count - 1]);
|
|
deck.RemoveAt(deck.Count - 1);
|
|
});
|
|
}
|
|
}
|
|
|
|
public void joue(Card card, int orderedStackSelected)
|
|
{
|
|
if (orderedStackSelected >= 0 && orderedStackSelected < 4)
|
|
{
|
|
if (orderedStackSelected < 2)
|
|
{
|
|
testPossibility(card, listOrderedStacks[orderedStackSelected], false);
|
|
}
|
|
else
|
|
{
|
|
testPossibility(card, listOrderedStacks[orderedStackSelected], true);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void testPossibility(Card card, Stack<Card> orderedStack, bool bottomUp)
|
|
{
|
|
if ((bottomUp && card.Value > orderedStack.Peek().Value) || (!bottomUp && card.Value < orderedStack.Peek().Value))
|
|
{
|
|
Card oldCard = orderedStack.Peek();
|
|
playerList[currentIndexPlayer].joue(card);
|
|
orderedStack.Push(card);
|
|
OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, listOrderedStacks.IndexOf(orderedStack)));
|
|
}
|
|
else
|
|
{
|
|
// Throw Exception
|
|
}
|
|
}
|
|
|
|
protected internal void OnTopRangeChanged(TopRangeChangedEventArgs args)
|
|
{
|
|
TopRangeChanged?.Invoke(this, args);
|
|
}
|
|
|
|
protected internal void OnCurrentPlayerChanged(CurrentPlayerChangedEventArgs args)
|
|
{
|
|
CurrentPlayerChanged?.Invoke(this, args);
|
|
}
|
|
|
|
abstract public void endTurn();
|
|
|
|
abstract protected void pioche();
|
|
|
|
abstract protected bool isEndGame();
|
|
|
|
abstract protected List<Card> tryToFindSoluce(List<Card> playableCard, Player currentPlayer);
|
|
|
|
abstract protected bool testEndGame(List<Card> playableCard);
|
|
|
|
abstract protected bool effectLose();
|
|
|
|
public int getCurentIndexPlayer()
|
|
{
|
|
return currentIndexPlayer;
|
|
}
|
|
|
|
}
|
|
}
|