LaBouaBouate

Cours PowerShell #7 - Highscores

Consigne

À partir de maintenant, les statistiques d’une partie qui se termine par une victoire du joueur seront sauvegardées dans un fichier externe au script (CSV par exemple). Pour l’occasion, on ajoute deux propriétés dans l’objet de fin : le nom du joueur et la date. À la fin de chaque partie (victoire ou défaite), on propose au joueur d’afficher les meilleurs scores dans un Out-GridView. La réponse par défaut est de ne rien afficher.

Résultat attendu

Joueur                    : john.smith
Date                      : 01/12/2022 12:00:00
Nombre aléatoire          : 20
Réponses                  : 500,250,125,75,50,25,15,20
Réponse moyenne           : 132
Temps de résolution (sec) : 10,027
Temps moyen par tentative : 1,253
Tentatives                : 8
Mode facile               : True

Voulez-vous voir les meilleurs scores?
[O] Oui  [N] Non  [?] Aide (la valeur par défaut est « N ») :

Étape par étape

  1. Modification et stockage dans une variable de l’objet de fin
  2. Affichage de l’objet dans la console
  3. Ajout d’un paramètre pour indiquer l’emplacement de sauvegarde des scores
  4. Sauvegarder le score dans un fichier CSV
  5. Demander au joueur s’il veut voir le tableau
  6. Afficher le tableau des meilleurs scores

Modification et stockage dans une variable de l’objet de fin

On va à présent vouloir stocker l’objet de fin dans une variable $stats pour pouvoir l’utiliser dans différents contextes. On prépare également le formatage des données pour pouvoir les stocker efficacement dans un fichier externe (CSV) :

  1. Ajouter la propriété “Joueur” qui contient le nom de l’utilisateur actuel Windows accessible avec la variable d’environnement $env:USERNAME
  2. Ajouter la propriété “Date” qui contient la date et l’heure de la partie. On utilise donc la commande Get-Date et on formate l’affichage avec le paramètre -Format et la valeur de paramètre G qui permet d’obtenir une date au format “31/12/2022 23:59:59”
  3. Modifier la propriété “Réponses” pour transformer l’objet en chaine de caractères avec l’opérateur -join pour mieux l’exporter en CSV
$stats = [PSCustomObject]@{
    "Joueur"   = $env:USERNAME
    "Date"     = Get-Date -Format G
    "Réponses" = $allAnswers -join ','
}

Affichage de l’objet dans la console

Comme l’objet de fin a été mis dans une variable, plus rien n’est affiché dans la console. Pour modifier ça, on va utiliser la commande Write-Output plutôt que Write-Host. Je vous laisse faire le test pour voir la différence entre les deux commandes.

$stats | Write-Output

Ajout d’un paramètre pour indiquer l’emplacement de sauvegarde des scores

On ajoute un nouveau paramètre -FilePath du type [IO.FileInfo] qui contient le chemin vers le fichier CSV qui contiendra les meilleurs scores.

param([IO.FileInfo]$FilePath = "$PSScriptRoot\highscore.csv")

Sauvegarder le score dans un fichier CSV

Avec la commande Export-Csv, on va ajouter une nouvelle ligne au fichier qui contient les meilleurs scores. Détail des paramètres utilisés :

$stats | Export-Csv -Path $FilePath -Encoding UTF8 -Delimiter ';' -NoTypeInformation -Append -Force

Demander au joueur s’il veut voir le tableau

Pour demander au joueur s’il veut voir le tableau des meilleurs scores, on va utiliser $Host.UI.PromptForChoice() avec les paramètres suivants (dans l’ordre) :

  1. Le titre
  2. La question à poser
  3. Les différents choix possibles sous forme d’un array où chaque option commence par &
  4. L’option par défaut (commence à 0)
$question = 'Voulez-vous voir les meilleurs scores?'
$choices  = '&Oui', '&Non'
$decision = $Host.UI.PromptForChoice($null, $question, $choices, 1)

Afficher le tableau des meilleurs scores

Si le premier choix est sélectionné par le joueur, alors on récupère le contenu du fichier CSV avec la commande Import-Csv pour l’afficher ensuite avec la commande Out-GridView.

if ($decision -eq 0) {
    Import-Csv -Path $FilePath -Delimiter ';' -Encoding UTF8 | Out-GridView -Title "Meilleurs scores"
}

Correction

Voir le script complet

Commentaires