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.

174 lines
5.2 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;
protected List<Player> playerList = new List<Player>();
protected List<InfiniteEffect> infiniteEffectsConstraintsList = new List<InfiniteEffect>();
public List<Stack<Card>> ListOrderedStacks { get; set; }
protected List<Card> deck = new List<Card>();
protected bool win = true;
public event EventHandler<TopRangeChangedEventArgs> TopRangeChanged;
public event EventHandler<PlayerChangedEventArgs> PlayerChanged;
public List<Card> CurrentHand { get; set; }
public GameManager(int nbPlayer, List<String> players)
{
ListOrderedStacks = new List<Stack<Card>>();
CurrentHand = new List<Card>();
this.nbPlayer = nbPlayer;
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++)
{
if (i < 2)
{
ListOrderedStacks[i].Push(new Card(1));
}
else
{
ListOrderedStacks[i].Push(new Card(100));
}
}
createDeck();
defineNbMaxCard();
distribueCard();
CurrentHand = playerList[currentIndexPlayer].getCardList();
}
protected void createDeck()
{
for (int i = 2; i <= 99; i++)
{
deck.Add(new Card(i));
}
}
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 => {
int r = new Random().Next(0, deck.Count - 1);
player.pioche(deck[r]);
deck.RemoveAt(r);
});
}
}
public void joue(int valueCard, int orderedStackSelected)
{
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("La pile choisie n'existe pas!");
}
return;
}
}
}
protected void testPossibility(Card card, Stack<Card> orderedStack, bool bottomUp)
{
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)
{
Card oldCard = orderedStack.Peek();
playerList[currentIndexPlayer].joue(card);
orderedStack.Push(card);
OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack)));
}
else
{
throw new Exception("La carte ne rentre pas dans la pile sectionné!");
}
}
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 void endTurn();
abstract protected void pioche();
abstract protected bool isEndGame();
abstract protected void tryToFindSoluce(List<Card> playableCard);
abstract protected bool testEndGame(List<Card> playableCard);
abstract protected bool effectLose();
public int getCurentIndexPlayer()
{
return currentIndexPlayer;
}
}
}