LaBouaBouate

Cours PowerShell #9 - Réparation

Consigne

On continue d’adapter notre script pour convenir à l’interface graphique. Dans cette partie, on va simplement s’assurer que le jeu re-fonctionne correctement sur sa base :

Résultat attendu

Démonstration du résultat attendu pour la partie 9

On note que les boutons “Recommencer” et “Meilleurs scores” n’ont pas a être fonctionnels, ils doivent simplement être rendus visible via le StackPannel qui regroupe les deux éléments.


Étape par étape

  1. Adaptation des variables
  2. Intégration du traitement
  3. Gestion de la victoire
  4. Gestion de la défaite

Adaptation des variables

Certaines de nos anciennes variables vont être directement intégrées à des éléments de l’interface graphique : les bornes inférieures et supérieures ainsi que la barre de progression :

Ancienne variable Composant XAML Description
$i Barre de progression Compte le nombre de tentatives du joueur
$min Label Borne inférieure
$max Label Borne supérieure
$progressbarCoupsRestants.Value = 0
$labelMin.Content = 1
$labelMax.Content = 1000

Pour les autres variables ($allAnswers, $stopwatch et $random) il va surtout s’agir de les passer dans l’étendue globale pour être sûr qu’elles puissent être utilisées n’importe où dans le script.

$Global:allAnswers = [System.Collections.Generic.List[int]]@()
$Global:stopwatch  = [System.Diagnostics.Stopwatch]::New()
$Global:random     = Get-Random -Minimum $labelMin.Content -Maximum $labelMax.Content

Intégration du traitement

Dans l’action de la boite de texte, on va remplacer l’actuel Write-Host $answer pour intégrer et adapter la comparaison entre l’estimation du joueur et le nombre aléatoire.

Changements a effectuer :

$progressbarCoupsRestants.Value++
if ($stopwatch.IsRunning -eq $false) { $stopwatch.Start() }
$allAnswers.Add($answer)
if ($random -gt $answer) { 
    $labelText.Content = "Le nombre aléatoire est plus grand que $answer"
    $labelMin.Content = $allAnswers | Where-Object {$_ -lt $random} | Sort-Object | Select-Object -Last 1
} elseif ($random -lt $answer) {
    $labelText.Content = "Le nombre aléatoire est plus petit que $answer"
    $labelMax.Content = $allAnswers | Where-Object {$_ -gt $random} | Sort-Object | Select-Object -First 1
} else {
    $labelText.Content = "VICTOIRE ! Vous avez deviné le nombre aléatoire"
}

Problème d’encodage

Si vous rencontrez des problèmes avec l’affichage des accents à ce stade, il faut bien vérifier que votre script (c’est-à-dire le fichier .ps1) est enregistré au format UTF8-BOM.

Gestion de la victoire

Si vous testez le script à ce stade et que vous parvenez à trouver le nombre aléatoire, vous constaterez que la victoire n’empêche pas le joueur de continuer à jouer. On va donc ajouter quelques traitement supplémentaires :

$stackpanelButtons.Visibility = "Visible"
$textboxResponse.Text = $random
$textboxResponse.IsEnabled = $false
$stopwatch.Stop()

Gestion de la défaite

Dans l’état, la défaite n’est pas possible puisque si le joueur dépasse le nombre de tentatives autorisées, il ne se passe rien. Pour résoudre le problème, on va mettre en place une condition : si l’on arrive à la valeur maximum de la barre de progression et que la dernière tentative du joueur n’est pas la bonne réponse, alors on effectue les actions suivantes :

if ($progressbarCoupsRestants.Value -eq $progressbarCoupsRestants.Maximum -and $textboxResponse.Text -ne $random) {
    $stackpanelButtons.Visibility = "Visible"
    $textboxResponse.Text = $random
    $textboxResponse.IsEnabled = $false
    $labelText.Content = "DEFAITE ! Le nombre etait : $random"
    $stopwatch.Stop()
}

Correction

Voir le script complet

Commentaires