Amelioration de plusieurs fonctionnalités du model et des tests

master
cldupland 6 years ago
parent a6c44d2785
commit a47e2b65fd

@ -6,16 +6,14 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Xamarin.Forms" Version="4.2.0.709249" /> <PackageReference Include="Xamarin.Forms" Version="4.3.0.908675" />
<PackageReference Include="Xamarin.Essentials" Version="1.2.0" /> <PackageReference Include="Xamarin.Essentials" Version="1.3.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Folder Include="model\effect\" />
<Folder Include="model\effect\fastEffect\" />
<Folder Include="model\effect\infiniteEffect\" />
<Folder Include="model\event\" /> <Folder Include="model\event\" />
<Folder Include="viewmodel\" /> <Folder Include="viewmodel\" />
<Folder Include="view\" /> <Folder Include="view\" />
<Folder Include="model\card\" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Remove="model\effect\StopColm.cs" /> <Compile Remove="model\effect\StopColm.cs" />

@ -1,9 +1,9 @@
using System; using System;
using System.ComponentModel; using System.ComponentModel;
namespace TheGameExtreme.model namespace TheGameExtreme.model.card
{ {
public class Card : INotifyPropertyChanged public abstract class Card : INotifyPropertyChanged
{ {
public event PropertyChangedEventHandler PropertyChanged; public event PropertyChangedEventHandler PropertyChanged;
@ -21,7 +21,7 @@ namespace TheGameExtreme.model
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v)); PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(v));
} }
public Effect Effect { get; private set; } public static readonly bool activate;
public Card(int value) public Card(int value)

@ -0,0 +1,12 @@
using System;
namespace TheGameExtreme.model.card
{
public class ClassicCard : Card
{
public ClassicCard(int value)
: base(value)
{
}
}
}

@ -0,0 +1,12 @@
using System;
namespace TheGameExtreme.model.card
{
public class EndGameCard : Card
{
public EndGameCard(int value)
:base(value)
{
}
}
}

@ -0,0 +1,12 @@
using System;
namespace TheGameExtreme.model.card
{
public class ThreeCard : Card
{
public ThreeCard(int value)
:base(value)
{
}
}
}

@ -1,6 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using TheGameExtreme.model.effect; using TheGameExtreme.model.card;
using TheGameExtreme.model.@event; using TheGameExtreme.model.@event;
namespace TheGameExtreme.model namespace TheGameExtreme.model

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model
{
public class Effect
{
public Effect()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class FastEffect : Effect
{
public FastEffect()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class InfiniteEffect : Effect
{
public InfiniteEffect()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class StopCom
{
public StopCom()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class EndGame : FastEffect
{
public EndGame()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class GameTurnStop : FastEffect
{
public GameTurnStop()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class ThreeCard : FastEffect
{
public ThreeCard()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class CommunicationStop : InfiniteEffect
{
public CommunicationStop()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class OneCardDrawable : InfiniteEffect
{
public OneCardDrawable()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class OneStack : InfiniteEffect
{
public OneStack()
{
}
}
}

@ -1,10 +0,0 @@
using System;
namespace TheGameExtreme.model.effect
{
public class RetroStop : InfiniteEffect
{
public RetroStop()
{
}
}
}

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using TheGameExtreme.model.card;
namespace TheGameExtreme.model.@event namespace TheGameExtreme.model.@event
{ {

@ -1,5 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using TheGameExtreme.model.card;
namespace TheGameExtreme.model.@event namespace TheGameExtreme.model.@event
{ {

@ -1,4 +1,6 @@
using System; using System;
using TheGameExtreme.model.card;
namespace TheGameExtreme.model.@event namespace TheGameExtreme.model.@event
{ {
public class TopRangeChangedEventArgs : EventArgs public class TopRangeChangedEventArgs : EventArgs

@ -1,6 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using TheGameExtreme.model.effect; using TheGameExtreme.model.card;
using TheGameExtreme.model.@event; using TheGameExtreme.model.@event;
namespace TheGameExtreme.model.manager namespace TheGameExtreme.model.manager
@ -12,13 +12,15 @@ namespace TheGameExtreme.model.manager
protected int nbMaxCard; protected int nbMaxCard;
protected int currentIndexPlayer; protected int currentIndexPlayer;
protected List<Player> playerList = new List<Player>(); protected List<Player> playerList = new List<Player>();
protected List<InfiniteEffect> infiniteEffectsConstraintsList = new List<InfiniteEffect>();
public List<Stack<Card>> ListOrderedStacks { get; set; } 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 String EndMessage { get; set; }
public event EventHandler<TopRangeChangedEventArgs> TopRangeChanged; public event EventHandler<TopRangeChangedEventArgs> TopRangeChanged;
public event EventHandler<PlayerChangedEventArgs> PlayerChanged; public event EventHandler<PlayerChangedEventArgs> PlayerChanged;
public List<Card> CurrentHand { get; set; } public List<Card> CurrentHand { get; set; }
protected int nbCardAtBeginOfTurn;
protected List<Card> CurrentCardPlayed = new List<Card>();
public GameManager(int nbPlayer, List<String> players) public GameManager(int nbPlayer, List<String> players)
@ -38,11 +40,11 @@ namespace TheGameExtreme.model.manager
{ {
if (i < 2) if (i < 2)
{ {
ListOrderedStacks[i].Push(new Card(1)); ListOrderedStacks[i].Push(new ClassicCard(1));
} }
else else
{ {
ListOrderedStacks[i].Push(new Card(100)); ListOrderedStacks[i].Push(new ClassicCard(100));
} }
} }
@ -51,13 +53,46 @@ namespace TheGameExtreme.model.manager
distribueCard(); distribueCard();
CurrentHand = playerList[currentIndexPlayer].getCardList(); CurrentHand = playerList[currentIndexPlayer].getCardList();
nbCardAtBeginOfTurn = CurrentHand.Count;
} }
protected void createDeck() protected void createDeck()
{ {
Random random = new Random();
List<int> endGame = new List<int>();
while (endGame.Count < 4)
{
int r = random.Next(2, 99);
if (!endGame.Contains(r))
{
endGame.Add(r);
}
}
List<int> threeCard = new List<int>();
while (threeCard.Count < 4)
{
int r = random.Next(2, 99);
if (!endGame.Contains(r) && !threeCard.Contains(r))
{
threeCard.Add(r);
}
}
Card card;
for (int i = 2; i <= 99; i++) for (int i = 2; i <= 99; i++)
{ {
deck.Add(new Card(i)); if (endGame.Contains(i))
{
card = new EndGameCard(i);
}
else if (threeCard.Contains(i))
{
card = new ThreeCard(i);
}
else
{
card = new ClassicCard(i);
}
deck.Add(card);
} }
} }
@ -121,6 +156,7 @@ namespace TheGameExtreme.model.manager
{ {
Card oldCard = orderedStack.Peek(); Card oldCard = orderedStack.Peek();
playerList[currentIndexPlayer].joue(card); playerList[currentIndexPlayer].joue(card);
CurrentCardPlayed.Add(card);
orderedStack.Push(card); orderedStack.Push(card);
OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack))); OnTopRangeChanged(new TopRangeChangedEventArgs(card, oldCard, ListOrderedStacks.IndexOf(orderedStack)));
} }
@ -152,7 +188,7 @@ namespace TheGameExtreme.model.manager
} }
} }
abstract public void endTurn(); abstract public bool endTurn();
abstract protected void pioche(); abstract protected void pioche();

@ -1,6 +1,6 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using TheGameExtreme.model.effect; using TheGameExtreme.model.card;
using TheGameExtreme.model.@event; using TheGameExtreme.model.@event;
namespace TheGameExtreme.model.manager namespace TheGameExtreme.model.manager
@ -14,9 +14,9 @@ namespace TheGameExtreme.model.manager
} }
public override void endTurn() public override bool endTurn()
{ {
// Vérifie que l'utilisateur a bien joué deux cartes verifyNbCardPlay();
pioche(); pioche();
@ -27,18 +27,55 @@ namespace TheGameExtreme.model.manager
} }
CurrentHand = playerList[currentIndexPlayer].getCardList(); CurrentHand = playerList[currentIndexPlayer].getCardList();
OnPlayerChanged(new PlayerChangedEventArgs(CurrentHand)); OnPlayerChanged(new PlayerChangedEventArgs(CurrentHand));
nbCardAtBeginOfTurn = CurrentHand.Count;
CurrentCardPlayed.Clear();
if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs if (isEndGame()) // Ajouter le score en calculant les cartes restantes dans la pile et dans les mains des joueurs
{ {
if (win) displayWinner();
return true;
}
return false;
}
protected void verifyNbCardPlay()
{
foreach (Card cardPlayed in CurrentCardPlayed)
{
if (cardPlayed.GetType() == typeof(ThreeCard))
{
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
{ {
Console.WriteLine("Le jeu est terminé!\n Bravo vous avez gagné!"); testIsEndGame();
}
}
protected void testIsEndGame()
{
if (isEndGame())
{
displayWinner();
} }
else else
{ {
Console.WriteLine("Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!"); throw new Exception("Vous n'avez pas joué assez de carte!");
} }
} }
protected void displayWinner()
{
if (win)
{
EndMessage = "Le jeu est terminé!\n Bravo vous avez gagné!";
}
} }
protected override void pioche() protected override void pioche()
@ -46,6 +83,10 @@ namespace TheGameExtreme.model.manager
int nbPickedCard = nbMaxCard - CurrentHand.Count; int nbPickedCard = nbMaxCard - CurrentHand.Count;
for (int i = 0; i < nbPickedCard; i++) for (int i = 0; i < nbPickedCard; i++)
{ {
if (deck.Count == 0)
{
return;
}
int random = new Random().Next(0, deck.Count - 1); int random = new Random().Next(0, deck.Count - 1);
playerList[currentIndexPlayer].pioche(deck[random]); playerList[currentIndexPlayer].pioche(deck[random]);
deck.RemoveAt(random); deck.RemoveAt(random);
@ -67,7 +108,7 @@ namespace TheGameExtreme.model.manager
{ {
CurrentHand.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); playableCard.Add(card);
} }
@ -76,13 +117,14 @@ namespace TheGameExtreme.model.manager
protected override bool testEndGame(List<Card> playableCard) protected override bool testEndGame(List<Card> playableCard)
{ {
if (playableCard.Count < 3 && playableCard.Count >= 2) if (playableCard.Count == 2)
{ {
foreach (Card c in playableCard) foreach (Card c in playableCard)
{ {
if (c.Equals(typeof(ThreeCard))) if (c.Equals(typeof(ThreeCard)))
{ {
win = false; 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; return true;
} }
} }
@ -90,11 +132,13 @@ namespace TheGameExtreme.model.manager
else if (playableCard.Count < 2) else if (playableCard.Count < 2)
{ {
win = false; win = false;
EndMessage = "Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!";
return true; return true;
} }
else if (effectLose()) else if (effectLose())
{ {
win = false; win = false;
EndMessage = "Désolé, vous n'avez pas recouvert la tête de mort... Réessayez ;)";
return true; return true;
} }
@ -105,7 +149,7 @@ namespace TheGameExtreme.model.manager
{ {
foreach (Stack<Card> orderedStack in ListOrderedStacks) foreach (Stack<Card> orderedStack in ListOrderedStacks)
{ {
if (orderedStack.Peek().GetType() == typeof(EndGame)) if (orderedStack.Peek().GetType() == typeof(EndGameCard))
{ {
return true; return true;
} }

@ -19,7 +19,7 @@
<Label HorizontalTextAlignment="Center" x:Name="pile0" /> <Label HorizontalTextAlignment="Center" x:Name="pile0" />
<StackLayout <StackLayout
Orientation="Horizontal"> Orientation="Horizontal">
<CheckBox x:Name="checkbox0" /> <CheckBox x:Name="checkbox0" CheckedChanged="radioButton" />
<Label VerticalTextAlignment="Center" Text="Pile Ascendante" /> <Label VerticalTextAlignment="Center" Text="Pile Ascendante" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
@ -28,7 +28,7 @@
<Label HorizontalTextAlignment="Center" x:Name="pile1" /> <Label HorizontalTextAlignment="Center" x:Name="pile1" />
<StackLayout <StackLayout
Orientation="Horizontal"> Orientation="Horizontal">
<CheckBox x:Name="checkbox1" /> <CheckBox x:Name="checkbox1" CheckedChanged="radioButton" />
<Label VerticalTextAlignment="Center" Text="Pile Ascendante" /> <Label VerticalTextAlignment="Center" Text="Pile Ascendante" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
@ -37,7 +37,7 @@
<Label HorizontalTextAlignment="Center" x:Name="pile2" /> <Label HorizontalTextAlignment="Center" x:Name="pile2" />
<StackLayout <StackLayout
Orientation="Horizontal"> Orientation="Horizontal">
<CheckBox x:Name="checkbox2" /> <CheckBox x:Name="checkbox2" CheckedChanged="radioButton" />
<Label VerticalTextAlignment="Center" Text="Pile Descendante" /> <Label VerticalTextAlignment="Center" Text="Pile Descendante" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
@ -46,7 +46,7 @@
<Label HorizontalTextAlignment="Center" x:Name="pile3" /> <Label HorizontalTextAlignment="Center" x:Name="pile3" />
<StackLayout <StackLayout
Orientation="Horizontal"> Orientation="Horizontal">
<CheckBox x:Name="checkbox3" /> <CheckBox x:Name="checkbox3" CheckedChanged="radioButton" />
<Label VerticalTextAlignment="Center" Text="Pile Descendante" /> <Label VerticalTextAlignment="Center" Text="Pile Descendante" />
</StackLayout> </StackLayout>
</StackLayout> </StackLayout>
@ -69,6 +69,7 @@
</ScrollView> </ScrollView>
</StackLayout> </StackLayout>
<StackLayout <StackLayout
x:Name="botPanel"
Orientation="Vertical" Orientation="Vertical"
Margin="20"> Margin="20">
<Button Text="End Turn" Clicked="endTurn"/> <Button Text="End Turn" Clicked="endTurn"/>

@ -18,13 +18,23 @@ namespace TheGameExtreme
[DesignTimeVisible(false)] [DesignTimeVisible(false)]
public partial class MainPage : ContentPage public partial class MainPage : ContentPage
{ {
private bool isFirst = true;
private Main viewmodel; private Main viewmodel;
private List<CheckBox> stacks = new List<CheckBox>();
Button button = new Button();
public MainPage() public MainPage()
{ {
InitializeComponent(); InitializeComponent();
stacks.Add(checkbox0);
stacks.Add(checkbox1);
stacks.Add(checkbox2);
stacks.Add(checkbox3);
button.Text = "Retry";
button.Clicked += retry;
viewmodel = new Main(); viewmodel = new Main();
viewmodel.BindingChanged += OnBindingChanged; viewmodel.BindingChanged += OnBindingChanged;
@ -91,35 +101,67 @@ namespace TheGameExtreme
{ {
viewmodel.Alert = ""; viewmodel.Alert = "";
int numStack; int numStack = 0;
if (checkbox0.IsChecked) bool hasFind = false;
stacks.ForEach(checkbox =>
{ {
numStack = 0; if (checkbox.IsChecked)
}
else if (checkbox1.IsChecked)
{ {
numStack = 1; hasFind = true;
} if (viewmodel.played(numStack, Convert.ToInt32((sender as Button).Text)))
else if (checkbox2.IsChecked)
{ {
numStack = 2; botPanel.Children.Add(button);
} }
else if (checkbox3.IsChecked)
{
numStack = 3;
} }
else numStack += 1;
});
if (!hasFind)
{ {
viewmodel.Alert = "Aucune pile selectionné! Veuillez séléctionner une pile."; viewmodel.Alert = "Aucune pile selectionné! Veuillez séléctionner une pile.";
return; return;
} }
viewmodel.played(numStack, Convert.ToInt32((sender as Button).Text)); }
private void radioButton(object sender, EventArgs args)
{
if (isFirst)
{
isFirst = false;
stacks.ForEach(checkbox =>
{
if (!checkbox.Equals(sender))
{
checkbox.IsChecked = false;
}
});
isFirst = true;
}
}
private void retry(object sender, EventArgs args)
{
viewmodel = new Main();
viewmodel.BindingChanged += OnBindingChanged;
Alert.SetBinding(Label.TextProperty, new Binding("Alert", source: viewmodel));
inflateHand();
} }
private void endTurn(object sender, EventArgs args) private void endTurn(object sender, EventArgs args)
{ {
viewmodel.endTurn(); if (viewmodel.endTurn())
{
botPanel.Children.Add(button);
}
else
{
inflateHand(); inflateHand();
} }
} }
} }
}

@ -2,7 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel; using System.ComponentModel;
using TheGameExtreme.model; using TheGameExtreme.model.card;
using TheGameExtreme.model.@event; using TheGameExtreme.model.@event;
using TheGameExtreme.model.manager; using TheGameExtreme.model.manager;
@ -56,35 +56,60 @@ namespace TheGameExtreme.viewmodel
BindingChanged?.Invoke(this, args); BindingChanged?.Invoke(this, args);
} }
public void played(int numStack, int valueCard) /**
*
*
* @return booléen de fin de jeu
*/
public bool played(int numStack, int valueCard)
{ {
if (gameManager.isCanPlay()) if (gameManager.isCanPlay())
{ {
playOneCard(numStack, valueCard); return playOneCard(numStack, valueCard);
} }
else else
{ {
Alert = "Le joueur n'a plus de carte dans sa main!"; Alert = "Le joueur n'a plus de carte dans sa main!";
// Faire un toast // Faire un toast
return false;
} }
} }
private void playOneCard(int numStack, int valueCard) /**
*
*
* @return booléen de fin de jeu
*/
private bool playOneCard(int numStack, int valueCard)
{ {
try try
{ {
gameManager.joue(valueCard, numStack); gameManager.joue(valueCard, numStack);
if (gameManager.EndMessage != null)
{
Alert = gameManager.EndMessage;
return true;
}
} }
catch(Exception e) catch(Exception e)
{ {
// Faire un toast // Faire un toast
Alert = e.Message; Alert = e.Message;
} }
return false;
} }
public void endTurn() public bool endTurn()
{ {
gameManager.endTurn(); try
{
return gameManager.endTurn();
}
catch(Exception e)
{
Alert = e.Message;
return false;
}
} }
} }

Loading…
Cancel
Save