Amelioration de plusieurs fonctionnalités du model et des tests

master
cldupland 6 years ago
parent a6c44d2785
commit a47e2b65fd

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

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

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

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

@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using TheGameExtreme.model.effect;
using TheGameExtreme.model.card;
using TheGameExtreme.model.@event;
namespace TheGameExtreme.model.manager
@ -12,13 +12,15 @@ namespace TheGameExtreme.model.manager
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 String EndMessage { get; set; }
public event EventHandler<TopRangeChangedEventArgs> TopRangeChanged;
public event EventHandler<PlayerChangedEventArgs> PlayerChanged;
public List<Card> CurrentHand { get; set; }
protected int nbCardAtBeginOfTurn;
protected List<Card> CurrentCardPlayed = new List<Card>();
public GameManager(int nbPlayer, List<String> players)
@ -38,11 +40,11 @@ namespace TheGameExtreme.model.manager
{
if (i < 2)
{
ListOrderedStacks[i].Push(new Card(1));
ListOrderedStacks[i].Push(new ClassicCard(1));
}
else
{
ListOrderedStacks[i].Push(new Card(100));
ListOrderedStacks[i].Push(new ClassicCard(100));
}
}
@ -51,13 +53,46 @@ namespace TheGameExtreme.model.manager
distribueCard();
CurrentHand = playerList[currentIndexPlayer].getCardList();
nbCardAtBeginOfTurn = CurrentHand.Count;
}
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++)
{
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();
playerList[currentIndexPlayer].joue(card);
CurrentCardPlayed.Add(card);
orderedStack.Push(card);
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();

@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using TheGameExtreme.model.effect;
using TheGameExtreme.model.card;
using TheGameExtreme.model.@event;
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();
@ -27,18 +27,55 @@ namespace TheGameExtreme.model.manager
}
CurrentHand = playerList[currentIndexPlayer].getCardList();
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 (win)
{
Console.WriteLine("Le jeu est terminé!\n Bravo vous avez gagné!");
}
else
displayWinner();
return true;
}
return false;
}
protected void verifyNbCardPlay()
{
foreach (Card cardPlayed in CurrentCardPlayed)
{
if (cardPlayed.GetType() == typeof(ThreeCard))
{
Console.WriteLine("Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!");
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
{
testIsEndGame();
}
}
protected void testIsEndGame()
{
if (isEndGame())
{
displayWinner();
}
else
{
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()
@ -46,6 +83,10 @@ namespace TheGameExtreme.model.manager
int nbPickedCard = nbMaxCard - CurrentHand.Count;
for (int i = 0; i < nbPickedCard; i++)
{
if (deck.Count == 0)
{
return;
}
int random = new Random().Next(0, deck.Count - 1);
playerList[currentIndexPlayer].pioche(deck[random]);
deck.RemoveAt(random);
@ -67,7 +108,7 @@ namespace TheGameExtreme.model.manager
{
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);
}
@ -76,13 +117,14 @@ namespace TheGameExtreme.model.manager
protected override bool testEndGame(List<Card> playableCard)
{
if (playableCard.Count < 3 && playableCard.Count >= 2)
if (playableCard.Count == 2)
{
foreach (Card c in playableCard)
{
if (c.Equals(typeof(ThreeCard)))
{
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;
}
}
@ -90,11 +132,13 @@ namespace TheGameExtreme.model.manager
else if (playableCard.Count < 2)
{
win = false;
EndMessage = "Le jeu est terminé!\n Désolé, vous avez perdu... Essayez encore!";
return true;
}
else if (effectLose())
{
win = false;
EndMessage = "Désolé, vous n'avez pas recouvert la tête de mort... Réessayez ;)";
return true;
}
@ -105,7 +149,7 @@ namespace TheGameExtreme.model.manager
{
foreach (Stack<Card> orderedStack in ListOrderedStacks)
{
if (orderedStack.Peek().GetType() == typeof(EndGame))
if (orderedStack.Peek().GetType() == typeof(EndGameCard))
{
return true;
}

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

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

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using TheGameExtreme.model;
using TheGameExtreme.model.card;
using TheGameExtreme.model.@event;
using TheGameExtreme.model.manager;
@ -56,35 +56,60 @@ namespace TheGameExtreme.viewmodel
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())
{
playOneCard(numStack, valueCard);
return playOneCard(numStack, valueCard);
}
else
{
Alert = "Le joueur n'a plus de carte dans sa main!";
// 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
{
gameManager.joue(valueCard, numStack);
}
if (gameManager.EndMessage != null)
{
Alert = gameManager.EndMessage;
return true;
}
}
catch(Exception e)
{
// Faire un toast
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