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()); } }