Continuer page
continuous-integration/drone/push Build is failing Details

master
Céleste BARBOSA 1 year ago
parent 603c7eb8a3
commit 30bad619ad

@ -1,4 +1,6 @@
namespace CoreLibrary.Events
using CoreLibrary.Joueurs;
namespace CoreLibrary.Events
{
/// <summary>
/// Classe contenant les arguments passées en paramètre lors de l'événement ConstruireJoueurEventArgs.
@ -8,15 +10,15 @@
/// <summary>
/// Le nom du joueur à ajouter.
/// </summary>
public string? Nom { get; private set; }
public Joueur Joueur { get; private set; }
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="ConstruireJoueurEventArgs"/> avec les informations spécifiées.
/// </summary>
/// <param name="code">Le nom du joueur à ajouter.</param>
public ConstruireJoueurEventArgs(string? nom)
/// <param name="joueur">Le joueur à ajouter.</param>
public ConstruireJoueurEventArgs(Joueur joueur)
{
Nom = nom;
Joueur = joueur;
}
}
}

@ -6,11 +6,11 @@ namespace CoreLibrary.Joueurs
{
public event EventHandler<ConstruireJoueurEventArgs>? ConstruireJoueur;
private void QuandConstruireJoueur(string? nom) => ConstruireJoueur?.Invoke(this, new ConstruireJoueurEventArgs(nom));
private void QuandConstruireJoueur(Joueur joueur) => ConstruireJoueur?.Invoke(this, new ConstruireJoueurEventArgs(joueur));
public void Nom(string? nom)
public void Joueur(Joueur joueur)
{
QuandConstruireJoueur(nom);
QuandConstruireJoueur(joueur);
}
}
}

@ -99,7 +99,7 @@ namespace CoreLibrary
/// <param name="regles">Les règles de la partie.</param>
public Partie(IRegles regles)
{
this.regles = regles;
Regles = regles;
}
/// <summary>
@ -110,7 +110,7 @@ namespace CoreLibrary
JoueurBuilder joueurBuilder = new JoueurBuilder();
joueurBuilder.ConstruireJoueur += Joueur;
QuandDemanderNom(regles.NbJoueurs + 1, joueurBuilder);
QuandDemanderNom(Regles.NbJoueurs + 1, joueurBuilder);
}
/// <summary>
@ -118,15 +118,17 @@ namespace CoreLibrary
/// </summary>
private void Joueur(Object? sender, ConstruireJoueurEventArgs e)
{
Joueur joueur = regles.AjouterJoueur(e.Nom ?? $"Joueur {regles.NbJoueurs + 1}");
Joueur joueur = e.Joueur;
Regles.AjouterJoueur(joueur);
QuandAjouterJoueur(joueur);
joueur.JouerCode += Tour;
if (regles.NbJoueurs != regles.NbJoueursMaximum)
if (Regles.NbJoueurs != Regles.NbJoueursMaximum)
{
JoueurBuilder joueurBuilder = new JoueurBuilder();
joueurBuilder.ConstruireJoueur += Joueur;
QuandDemanderNom(regles.NbJoueurs + 1, joueurBuilder);
QuandDemanderNom(Regles.NbJoueurs + 1, joueurBuilder);
}
else
{
@ -139,11 +141,11 @@ namespace CoreLibrary
/// </summary>
private void Commencer()
{
regles.CommencerLaPartie();
Regles.CommencerLaPartie();
QuandDebutPartie();
(Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant();
QuandNouveauTour(joueurCourant, plateauCourant.Tour, regles.GenererCode(), plateauCourant.Grille(), plateauCourant.Indicateurs());
(Joueur joueurCourant, Plateau plateauCourant) = Regles.JoueurCourant();
QuandNouveauTour(joueurCourant, plateauCourant.Tour, Regles.GenererCode(), plateauCourant.Grille(), plateauCourant.Indicateurs());
}
/// <summary>
@ -151,21 +153,21 @@ namespace CoreLibrary
/// </summary>
private void Tour(Object? sender, JouerCodeEventArgs e)
{
(Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant();
(Joueur joueurCourant, Plateau plateauCourant) = Regles.JoueurCourant();
plateauCourant.AjouterCode(e.Code);
QuandAjouterCode(e.Code);
if(regles.EstTerminee())
if(Regles.EstTerminee())
{
Terminee();
}
else
{
regles.PasserLaMain();
Regles.PasserLaMain();
QuandPasserMain();
(joueurCourant, plateauCourant) = regles.JoueurCourant();
QuandNouveauTour(joueurCourant, plateauCourant.Tour, regles.GenererCode(), plateauCourant.Grille(), plateauCourant.Indicateurs());
(joueurCourant, plateauCourant) = Regles.JoueurCourant();
QuandNouveauTour(joueurCourant, plateauCourant.Tour, Regles.GenererCode(), plateauCourant.Grille(), plateauCourant.Indicateurs());
}
}
@ -174,7 +176,7 @@ namespace CoreLibrary
/// </summary>
private void Terminee()
{
QuandPartieTerminee(regles.Gagnants(), regles.Perdants());
QuandPartieTerminee(Regles.Gagnants(), Regles.Perdants());
}
}
}

@ -34,11 +34,10 @@ namespace CoreLibrary.Regles
int NbJoueursMaximum { get; }
/// <summary>
/// Ajoute un joueur à partir de son nom.
/// Ajoute un joueur à la partie.
/// </summary>
/// <param name="nom">Nom du joueur à ajouter.</param>
/// <returns>Le joueur ajouté.</returns>
Joueur AjouterJoueur(string nom);
/// <param name="joueur">Joueur à ajouter.</param>
void AjouterJoueur(Joueur joueur);
/// <summary>
/// Récupère le joueur courant.

@ -51,16 +51,13 @@ namespace CoreLibrary.Regles
}
/// <summary>
/// Ajoute un joueur avec le nom spécifié.
/// Ajoute un joueur à la partie.
/// </summary>
/// <param name="nom">Le nom du joueur à ajouter.</param>
/// <returns>Le joueur ajouté.</returns>
public Joueur AjouterJoueur(string nom)
/// <param name="joueur">Le joueur à ajouter.</param>
public void AjouterJoueur(Joueur joueur)
{
Joueur joueur = new Joueur(nom);
joueurs[nbJoueurs] = joueur;
plateaux[nbJoueurs++] = new Plateau(TailleCodeMaximum, TourMaximum);
return joueur;
}
/// <summary>

@ -1,4 +1,6 @@
namespace MauiSpark
using MauiSpark.Pages;
namespace MauiSpark
{
public partial class App : Application
{
@ -6,7 +8,7 @@
{
InitializeComponent();
MainPage = new AppShell();
MainPage = new NavigationPage(new Accueil());
}
}
}

@ -1,45 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="MauiSpark.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiSpark"
xmlns:pages="clr-namespace:MauiSpark.Pages"
Shell.NavBarIsVisible="False"
Shell.FlyoutBehavior="Flyout"
Title="Mastermind">
<ShellContent
Title="Accueil"
ContentTemplate="{DataTemplate pages:Accueil}" />
<ShellContent
Title="Connexion"
ContentTemplate="{DataTemplate pages:ConnexionPage}" />
<ShellContent
Title="TableauScore"
ContentTemplate="{DataTemplate pages:TableauScore}" />
<ShellContent
Title="Regle"
ContentTemplate="{DataTemplate pages:Regle}" />
<ShellContent
Title="Victoire"
ContentTemplate="{DataTemplate pages:Victoire}" />
<ShellContent
Title="Defaite"
ContentTemplate="{DataTemplate pages:Defaite}" />
<ShellContent
Title="Egalite"
ContentTemplate="{DataTemplate pages:Egalite}" />
<ShellContent
Title="Plateau"
ContentTemplate="{DataTemplate pages:Plateau}" />
</Shell>

@ -1,10 +0,0 @@
namespace MauiSpark
{
public partial class AppShell : Shell
{
public AppShell()
{
InitializeComponent();
}
}
}

@ -79,6 +79,9 @@
<MauiXaml Update="Pages\Egaliter.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="Pages\Mode.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="Pages\Plateau.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
@ -94,9 +97,6 @@
<MauiXaml Update="Views\CTableauScore.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
<MauiXaml Update="Views\UsernameEntryView.xaml">
<Generator>MSBuild:Compile</Generator>
</MauiXaml>
</ItemGroup>
</Project>

@ -1,6 +1,7 @@
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiSpark.Pages.Accueil"
Title="Accueil">
<Grid
@ -27,7 +28,7 @@
<Button
Grid.Row="2"
Text="Jouer"
/>
Clicked="QuandJouerClique"/>
<Grid
Grid.Row="3"

@ -1,3 +1,5 @@
using CoreLibrary;
namespace MauiSpark.Pages;
public partial class Accueil : ContentPage
@ -6,4 +8,9 @@ public partial class Accueil : ContentPage
{
InitializeComponent();
}
private void QuandJouerClique(Object? sender, EventArgs e)
{
Navigation.PushAsync(new Mode());
}
}

@ -19,13 +19,30 @@
Grid.Row="1"
VerticalOptions="Center">
<Views:UsernameEntryView/>
<Views:UsernameEntryView/>
<Grid
Margin="0, 50"
ColumnDefinitions="auto, *, 8*, *"
RowDefinitions="auto">
<Label
x:Name="Nom"
Text="{Binding}"
FontSize="Large"
Margin="50, 0, 0, 0"
VerticalOptions="Center"
HorizontalOptions="Center"/>
<Entry
Grid.Column="2"
FontSize="Medium"
Margin="50, 0"/>
</Grid>
</VerticalStackLayout>
<Button
VerticalOptions="Center"
Grid.Row="2"
Text="Se connecter"/>
Text="Se connecter"
Clicked="QuandSeConnecterPresse"/>
</Grid>
</ContentPage>

@ -1,9 +1,34 @@
using CoreLibrary;
using CoreLibrary.Events;
using CoreLibrary.Joueurs;
namespace MauiSpark.Pages;
public partial class ConnexionPage : ContentPage
{
public ConnexionPage()
private readonly JoueurBuilder joueurBuilder;
public ConnexionPage(Partie partie, DemanderNomEventArgs e)
{
InitializeComponent();
InitializeComponent();
joueurBuilder = e.JoueurBuilder;
if(partie.Regles.NbJoueurs + 1 == partie.Regles.NbJoueursMaximum)
partie.NouveauTour += QuandNouveauTour;
BindingContext = $"Joueur {e.Indice}";
}
private void QuandNouveauTour(object sender, NouveauTourEventArgs e)
{
if (sender != null && sender is Partie)
Navigation.PushAsync(new Plateau(sender as Partie, e));
}
private void QuandSeConnecterPresse(Object sender, EventArgs e)
{
joueurBuilder.Joueur(new Joueur(Nom.Text));
}
}

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiSpark.Pages.Mode"
Title="Mode">
<Grid ColumnDefinitions="*" RowDefinitions="*, *">
<Label Text="Mode de jeu"/>
<Button Grid.Row="1" Text="Règles classiques" Clicked="QuandReglesClassiques"/>
</Grid>
</ContentPage>

@ -0,0 +1,26 @@
using CoreLibrary;
using CoreLibrary.Events;
using CoreLibrary.Regles;
namespace MauiSpark.Pages;
public partial class Mode : ContentPage
{
public Mode()
{
InitializeComponent();
}
private void QuandReglesClassiques(Object? sender, EventArgs e)
{
Partie partie = new Partie(new ReglesClassiques());
partie.DemanderNom += QuandDemanderNom;
partie.Jouer();
}
private void QuandDemanderNom(Object? sender, DemanderNomEventArgs e)
{
if(sender != null && sender is Partie)
Navigation.PushAsync(new ConnexionPage(sender as Partie, e));
}
}

@ -4,75 +4,5 @@
x:Class="MauiSpark.Pages.Plateau"
Title="Plateau">
<ScrollView>
<StackLayout Padding="20">
<Label Text="Enter the player's name:"
FontSize="Medium"
VerticalOptions="CenterAndExpand" />
<Entry x:Name="PlayerNameEntry1"
Placeholder="Player Name"
FontSize="Medium"/>
<Entry x:Name="PlayerNameEntry2"
Placeholder="Player Name"
FontSize="Medium"/>
<Button Text="Submit" Clicked="OnSubmitClicked" VerticalOptions="EndAndExpand" />
<Label Text="Tour en cours :" FontSize="Large" />
<Label Text="{Binding Tour}" FontSize="Large" />
<Label Text="Joueur :" FontSize="Large" />
<Label Text="{Binding Nom}" FontSize="Large" />
<ListView ItemsSource="{Binding Jetons}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Couleur}" />
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Grid x:Name="PlateauGrid" RowSpacing="5" ColumnSpacing="5">
<Grid ColumnDefinitions="*,*" Margin="50" BackgroundColor="White">
<ListView Grid.Column="0" ItemsSource="{Binding Grille}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid ColumnDefinitions="*,*,*,*" Grid.Column="0">
<Label Grid.Column="0" Text="{Binding [0].Couleur}" TextColor="Black"/>
<Label Grid.Column="1" Text="{Binding [1].Couleur}" TextColor="Black" />
<Label Grid.Column="2" Text="{Binding [2].Couleur}" TextColor="Black" />
<Label Grid.Column="3" Text="{Binding [3].Couleur}" TextColor="Black" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<ListView Grid.Column="1" ItemsSource="{Binding Indicateurs}" >
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid ColumnDefinitions="*,*,*,*" Grid.Column="0">
<Label Grid.Column="0" Text="{Binding [0]}" TextColor="Black"/>
<Label Grid.Column="1" Text="{Binding [1]}" TextColor="Black"/>
<Label Grid.Column="2" Text="{Binding [2]}" TextColor="Black"/>
<Label Grid.Column="3" Text="{Binding [3]}" TextColor="Black"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Grid>
<Label Text="Sélectionnez une couleur de jeton : " />
<VerticalStackLayout Spacing="1">
<Button Text="Rouge" Clicked="OnColorButtonClicked" />
<Button Text="Vert" Clicked="OnColorButtonClicked" />
<Button Text="Bleu" Clicked="OnColorButtonClicked" />
<Button Text="Jaune" Clicked="OnColorButtonClicked" />
<Button Text="Blanc" Clicked="OnColorButtonClicked" />
<Button Text="Noir" Clicked="OnColorButtonClicked" />
</VerticalStackLayout>
<Button Text="Valider" Clicked="OnValidateButtonClicked" />
<Button Text="Supprimmer le dernier Jeton" Clicked="OnSupprimmerButtonClicked" />
</StackLayout>
</ScrollView>
</ContentPage>

@ -1,220 +1,15 @@
using CoreLibrary.Events;
using CoreLibrary.Manager;
using CoreLibrary;
using CoreLibrary.Regles;
using CoreLibrary.Joueurs;
using Microsoft.Maui.Controls;
using CoreLibrary.Core;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions;
using System.Collections.ObjectModel;
using CoreLibrary.Exceptions;
namespace MauiSpark.Pages
{
public partial class Plateau : ContentPage, INotifyPropertyChanged
{
public event PropertyChangedEventHandler? PropertyChanged;
public void QuandPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private TaskCompletionSource<CouleurSelectionResult> CouleurSelectedTask;
public Couleur? selectedColor;
public Jeton selectedJeton;
public List<string> Noms { get; set; }
public string Nom { get; set; }
public IRegles regles;
public Partie partie;
Joueur joueur;
public int Tour { get; set; }
public IEnumerable<IEnumerable<Jeton?>> Grille { get; set; }
public IEnumerable<IEnumerable<Indicateur>> Indicateurs { get; set; }
public ObservableCollection<Jeton?> Jetons { get; set; }
public Plateau()
{
InitializeComponent();
regles = new ReglesClassiques();
partie = new Partie(regles);
partie.DemanderNom += DemanderNom;
partie.DebutPartie += OnDebutPartie;
partie.NouveauTour += NouveauTourAsync;
partie.PartieTerminee += OnPartieTerminee;
Jetons = new ObservableCollection<Jeton?>();
BindingContext = this;
}
private void OnSubmitClicked(object sender, EventArgs e)
{
Noms = new List<string> { PlayerNameEntry1.Text, PlayerNameEntry2.Text };
partie.Jouer();
}
private void DemanderNom(object sender, DemanderNomEventArgs e)
{
int joueurIndex = e.Indice - 1;
if (joueurIndex >= 0 && joueurIndex < Noms.Count())
{
e.JoueurBuilder.Nom(Noms[joueurIndex]);
}
}
private void OnDebutPartie(object sender, DebutPartieEventArgs e)
{
DisplayAlert("Début de la partie", "La partie commence !", "OK");
}
private void OnPartieTerminee(object sender, PartieTermineeEventArgs e)
{
DisplayAlert("Partie terminée", "La partie est terminée !", "OK");
}
private void OnColorButtonClicked(object sender, EventArgs e)
{
Button button = (Button)sender;
string colorText = button.Text;
selectedColor = GetColorFromString(colorText);
System.Diagnostics.Debug.WriteLine($"Couleur sélectionnée: {selectedColor}");
}
private void OnValidateButtonClicked(object sender, EventArgs e)
{
if (selectedColor.HasValue)
{
System.Diagnostics.Debug.WriteLine($"Couleur validée: {selectedColor.Value}");
OnJetonSelected(selectedColor);
}
}
private void OnSupprimmerButtonClicked(object sender, EventArgs e)
{
OnJetonSelected(null);
}
public async void NouveauTourAsync(Object? sender, NouveauTourEventArgs e)
{
Code code = e.Code;
Tour = e.Tour;
Grille = e.Grille;
Indicateurs = e.Indicateurs;
joueur = regles.JoueurCourant().Item1;
Nom = joueur.Nom;
QuandPropertyChanged(nameof(joueur));
QuandPropertyChanged(nameof(Tour));
QuandPropertyChanged(nameof(Grille));
QuandPropertyChanged(nameof(Indicateurs));
QuandPropertyChanged(nameof(Nom));
while (!code.EstComplet())
{
await DisplayAlert("Cliquer sur une couleur", "Cliquer sur une couleur", "OK");
System.Diagnostics.Debug.WriteLine("En attente de la sélection d'un jeton...");
CouleurSelectionResult result = await WaitForCouleurSelection();
if (result.IsSuppression)
{
System.Diagnostics.Debug.WriteLine("Supprimer le dernier jeton suite à une suppression");
try
{
code.SupprimerDernierJeton();
}
catch (CodeVideException)
{
await DisplayAlert("Le code est deja vide", "Vous ne pouvez pas supprimmer", "OK");
}
}
else
{
Jeton jetonSelectionne = new Jeton(result.Couleur.Value);
System.Diagnostics.Debug.WriteLine($"Jeton sélectionné: {jetonSelectionne.Couleur}");
code.AjouterJeton(jetonSelectionne);
}
Jetons.Clear();
foreach (Jeton? jeton in code.Jetons())
{
if (jeton.HasValue)
{
Jetons.Add(jeton.Value);
}
}
}
e.Joueur.Code(code);
}
private Task<CouleurSelectionResult> WaitForCouleurSelection()
{
System.Diagnostics.Debug.WriteLine("WaitForJetonSelection appelé");
CouleurSelectedTask = new TaskCompletionSource<CouleurSelectionResult>();
return CouleurSelectedTask.Task;
}
private void OnJetonSelected(Couleur? selectedColor)
{
System.Diagnostics.Debug.WriteLine("OnJetonSelected appelé");
if (CouleurSelectedTask != null && !CouleurSelectedTask.Task.IsCompleted)
{
if (selectedColor.HasValue)
{
System.Diagnostics.Debug.WriteLine($"OnJetonSelected - complétion de la tâche avec: {selectedColor.Value}");
CouleurSelectedTask.SetResult(CouleurSelectionResult.FromCouleur(selectedColor.Value));
}
else
{
System.Diagnostics.Debug.WriteLine("OnJetonSelected - complétion de la tâche avec un jeton nul (suppression)");
CouleurSelectedTask.SetResult(CouleurSelectionResult.Suppression());
}
}
else
{
System.Diagnostics.Debug.WriteLine("OnJetonSelected - tâche déjà complétée ou null");
}
}
private Couleur? GetColorFromString(string colorText)
{
return colorText.ToLower() switch
{
"rouge" => Couleur.ROUGE,
"vert" => Couleur.VERT,
"bleu" => Couleur.BLEU,
"jaune" => Couleur.JAUNE,
"blanc" => Couleur.BLANC,
"noir" => Couleur.NOIR,
_ => null,
};
}
}
}
public class CouleurSelectionResult
{
public Couleur? Couleur { get; }
public bool IsSuppression { get; }
private CouleurSelectionResult(Couleur? couleur, bool isSuppression)
{
Couleur = couleur;
IsSuppression = isSuppression;
}
public static CouleurSelectionResult FromCouleur(Couleur couleur)
{
return new CouleurSelectionResult(couleur, false);
}
public static CouleurSelectionResult Suppression()
{
return new CouleurSelectionResult(null, true);
}
}
using CoreLibrary;
using CoreLibrary.Events;
namespace MauiSpark.Pages;
public partial class Plateau : ContentPage
{
public Plateau(Partie p, NouveauTourEventArgs e)
{
InitializeComponent();
BindingContext = e;
}
}

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<ContentView xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiSpark.Views.UsernameEntryView">
<Grid
Margin="0, 50"
ColumnDefinitions="auto, *, 8*, *"
RowDefinitions="auto">
<Label
Text="Joueur X"
FontSize="Large"
Margin="50, 0, 0, 0"
VerticalOptions="Center"
HorizontalOptions="Center"/>
<Entry
Grid.Column="2"
FontSize="Medium"
Margin="50, 0"/>
</Grid>
</ContentView>

@ -1,9 +0,0 @@
namespace MauiSpark.Views;
public partial class UsernameEntryView : ContentView
{
public UsernameEntryView()
{
InitializeComponent();
}
}
Loading…
Cancel
Save