using CoreLibrary.Core;
using CoreLibrary.Evenements;
using CoreLibrary.Exceptions;
using CoreLibrary.Joueurs;
namespace MauiSpark.Pages;
///
/// Représente un tour de jeu, avec le plateau actuel, le joueur en cours, le numéro de tour et le code.
///
internal class Tour
{
///
/// Obtient ou définit le plateau de jeu pour ce tour.
///
public IEnumerable<(IEnumerable, IEnumerable)> Plateau { get; private init; }
///
/// Obtient ou définit le nom du joueur pour ce tour.
///
public string Joueur { get; private init; }
///
/// Obtient ou définit le numéro de tour.
///
public string Numero { get; private init; }
///
/// Obtient ou définit le code pour ce tour.
///
public Code Code { get; private init; }
///
/// Initialise un tour à partir des arguments de l'événement de nouveau tour de jeu.
///
/// Les arguments de l'événement PartieNouveauTourEventArgs.
public Tour(PartieNouveauTourEventArgs e)
{
Numero = $"Tour {e.Tour}";
Joueur = e.Joueur;
Code = e.Code;
(IReadOnlyList> jetons, IReadOnlyList < IReadOnlyList < Indicateur >> indicateurs) = e.Plateau.Grille;
List<(IEnumerable, IEnumerable)> plateau = new List<(IEnumerable, IEnumerable)>();
for (int i = 0; i < e.Plateau.TailleMax; ++i)
{
if(i >= jetons.Count)
{
plateau.Add(([], []));
continue;
}
plateau.Add((jetons.ElementAt(i), indicateurs.ElementAt(i)));
}
Plateau = plateau;
}
}
///
/// Page affichant le plateau de jeu et permettant aux joueurs d'interagir avec celui-ci.
///
public partial class PlateauPage : ContentPage
{
private Code? code;
private Plateau? plateau;
///
/// Constructeur de la page du plateau de jeu.
/// Initialise les paramètres de navigation et les composants de la page.
///
public PlateauPage()
{
NavigationPage.SetHasNavigationBar(this, false);
InitializeComponent();
}
///
/// Méthode appelée lorsqu'un nouveau tour de jeu commence.
/// Affiche le nouveau tour de jeu sur le plateau.
///
/// La source de l'événement ; dans ce cas, la partie.
/// Les arguments de l'événement PartieNouveauTourEventArgs.
public async void QuandNouveauTour(object? sender, PartieNouveauTourEventArgs e)
{
if (Application.Current == null || Application.Current.MainPage == null)
return;
if (((NavigationPage)Application.Current!.MainPage).CurrentPage != this)
await Application.Current.MainPage.Navigation.PushAsync(this);
IEnumerable pages = Application.Current.MainPage.Navigation.NavigationStack.Reverse().Skip(1);
foreach (Page page in pages)
{
if (page is AccueilPage)
break;
Application.Current.MainPage.Navigation.RemovePage(page);
}
code = e.Code;
plateau = e.Plateau;
BindingContext = new Tour(e);
}
///
/// Supprime le dernier jeton ajouté au code en cours.
/// Affiche une alerte si le code est vide.
///
/// La source de l'événement ; ici, le bouton de suppression de jeton.
/// Les arguments de l'événement EventArgs.
private void SupprimerDernierJeton(Object sender, EventArgs e)
{
try
{
if(code != null)
code.SupprimerDernierJeton();
}
catch(CodeVideException)
{
DisplayAlert("Attention", "La code est vide", "OK");
}
}
///
/// Valide le code actuel et l'ajoute au plateau de jeu.
/// Affiche une alerte si le code est incomplet.
///
/// La source de l'événement ; ici, le bouton de validation de code.
/// Les arguments de l'événement EventArgs.
private void ValiderCode(Object sender, EventArgs e)
{
try
{
if (plateau != null && code != null)
plateau.AjouterCode(code);
}
catch (CodeIncompletException)
{
DisplayAlert("Attention", "La code n'est pas complet", "OK");
}
}
///
/// Ouvre la page des règles du jeu.
///
/// La source de l'événement ; ici, le bouton de règles du jeu.
/// Les arguments de l'événement EventArgs.
private async void QuandReglesClique(object sender, EventArgs e)
{
await Navigation.PushAsync(new ReglesPage());
}
}