⌂ Programmation
Fiche 13 sur 13

Fonctionnalités bonus

De la couleur, des pauses et du son pour des programmes plus vivants.

Après cette fiche, vous saurez :

À retenir

Cette fiche est facultative. Rien ici n'est nécessaire pour réussir les fiches précédentes. Ces outils servent à rendre vos jeux plus agréables.

Vous connaissez déjà deux outils de console utiles : Console.Clear() et Console.ReadKey(), vus à la fiche 6.

1De la couleur

Par défaut, tout s'affiche en gris clair sur fond noir. Vous pouvez changer la couleur du texte avant de l'afficher.

Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Aïe ! Vous perdez 10 points de vie.");

Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Vous trouvez 10 pièces d'or.");

Console.ResetColor();
Console.WriteLine("Retour à la couleur normale.");
Ce que l'ordinateur affiche
Aïe ! Vous perdez 10 points de vie.
Vous trouvez 10 pièces d'or.
Retour à la couleur normale.

Dans la fenêtre noire, la première ligne s'affiche en rouge, la deuxième en jaune, et la troisième retrouve sa couleur normale.

Console.ForegroundColor règle la couleur du texte. La couleur reste active pour tout ce qui suit, jusqu'à ce que vous la changiez à nouveau ou que vous écriviez Console.ResetColor();.

Pour obtenirJ'écris
RougeConsoleColor.Red
VertConsoleColor.Green
JauneConsoleColor.Yellow
Bleu clairConsoleColor.Cyan
RoseConsoleColor.Magenta
BlancConsoleColor.White

Visual Studio vous propose toute la liste dès que vous tapez ConsoleColor. avec le point. Les versions foncées commencent par Dark : DarkRed, DarkGreen, DarkBlue...

La couleur de fond

Console.BackgroundColor = ConsoleColor.DarkBlue;
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine("  LE DONJON DE RADAKASS  ");
Console.ResetColor();

BackgroundColor colore le fond, mais seulement derrière les caractères que vous écrivez ensuite.

Attention

N'oubliez pas Console.ResetColor();

Sans lui, tout ce que le programme affiche ensuite garde la dernière couleur choisie, y compris les questions posées à l'utilisateur. Prenez l'habitude de remettre la couleur normale juste après le message coloré.

2Faire une pause

Parfois, on veut que le programme attende un peu : suspense, compte à rebours, animation. C'est le rôle de Thread.Sleep.

Console.WriteLine("Vous poussez la porte...");
Thread.Sleep(2000);
Console.WriteLine("Un monstre apparaît !");
Ce que l'ordinateur affiche
Vous poussez la porte...
Un monstre apparaît !

Le deuxième message n'apparaît qu'après deux secondes.

J'écrisLe programme attend
Thread.Sleep(500);une demi-seconde
Thread.Sleep(1000);une seconde
Thread.Sleep(3000);trois secondes

À retenir

La durée s'exprime en millisecondes : 1000 millisecondes font 1 seconde.

Pendant la pause, le programme ne fait plus rien. Gardez des pauses courtes (une à trois secondes) pour ne pas donner l'impression qu'il est bloqué.

Attention

Si Thread est souligné en rouge, ajoutez cette ligne tout en haut du fichier, avant toutes les autres :

using System.Threading;

3Faire un bip

Console.Beep();                 // un bip standard
Console.Beep(1000, 300);        // 1000 hertz pendant 300 ms

Avec deux nombres, vous choisissez le son : le premier est la fréquence (plus elle est grande, plus le son est aigu), le second la durée en millisecondes. Essayez des valeurs entre 400 et 2000.

Deux notes qui montent pour une victoire :

Console.Beep(800, 200);
Console.Beep(1200, 400);

Attention

Le programme attend la fin du bip avant de passer à la ligne suivante.

Le bip avec fréquence ne fonctionne que sous Windows. Pensez à vos voisins : testez à faible volume.

4Jouer un son avec SoundPlayer

Pour une vraie musique de victoire ou un cri de monstre, C# peut jouer un fichier son. On utilise SoundPlayer.

Attention

Deux limites à connaître.

Étape 1 : se procurer un son en .wav

En classe, nous procédons en deux temps : télécharger un .mp3, puis le convertir en .wav.

  1. Allez sur myinstants.com, cherchez un son court (quelques secondes) et téléchargez-le. Vous obtenez un fichier .mp3.
  2. Allez sur un site de conversion comme Convertio (convertio.co). Déposez votre .mp3, choisissez le format WAV et lancez la conversion.
  3. Téléchargez le fichier .wav obtenu.
  4. Donnez-lui un nom simple, sans espaces ni accents : victoire.wav, defaite.wav.

Attention

Renommer un .mp3 en .wav ne sert à rien. Le contenu du fichier reste du mp3 et le son ne se jouera pas. Il faut bien passer par la conversion.

Ne déposez sur un site de conversion que des sons pour la classe, jamais de documents personnels.

Étape 2 : ajouter le son à votre projet

  1. Dans l'Explorateur de solutions, faites un clic droit sur le nom de votre projet, puis Ajouter, puis Élément existant... Choisissez votre fichier .wav. (Vous pouvez aussi le glisser directement dans l'Explorateur de solutions.)
  2. Cliquez sur le fichier .wav dans l'Explorateur de solutions, puis regardez la fenêtre Propriétés.
  3. Pour la ligne Copier dans le répertoire de sortie, choisissez Copier si plus récent.

À retenir

Pourquoi cette dernière étape ? Votre programme ne s'exécute pas dans le dossier où se trouvent vos fichiers de code, mais dans un dossier de sortie (bin\Debug\...). Le son doit être copié à côté du programme, sinon SoundPlayer ne le trouve pas.

Étape 3 : jouer le son

using System.Media;

SoundPlayer victoire = new SoundPlayer("victoire.wav");

Console.WriteLine("Bravo, vous avez gagné !");
victoire.Play();

Console.ReadKey();   // sans cette ligne, le programme se termine et coupe le son

La ligne using System.Media; se place tout en haut du fichier. Elle dit à C# où trouver SoundPlayer. Le nom entre guillemets doit être exactement celui du fichier, avec son extension .wav.

Je veuxJ'écris
Jouer le son, et continuer le programme pendant qu'il jouevictoire.Play();
Jouer le son, et attendre qu'il soit finivictoire.PlaySync();
Rejouer le son en bouclevictoire.PlayLooping();
Arrêter le sonvictoire.Stop();

Si SoundPlayer est souligné en rouge

Selon la version de .NET de votre projet, SoundPlayer n'est pas reconnu d'office. Visual Studio affiche une erreur du type « Le nom de type SoundPlayer est introuvable ». Il faut alors installer un petit module :

  1. Clic droit sur le nom de votre projet, puis Gérer les packages NuGet...
  2. Onglet Parcourir, puis tapez System.Windows.Extensions dans la barre de recherche.
  3. Choisissez ce package et cliquez sur Installer.

L'erreur disparaît, et vous pouvez compiler.

Le son ne se joue pas ?

À retenir

Pour jouer un son : un fichier .wav, copié dans le répertoire de sortie, la ligne using System.Media;, puis new SoundPlayer("nom.wav") et Play().

→Exercices

1Le compte à reboursCréer

Écrivez un compte à rebours de lancement de fusée.

  1. Affichez 5, 4, 3, 2, 1, un nombre à la fois, avec une seconde entre chaque. L'écran est effacé avant chaque nombre.
  2. Terminez par « Décollage ! » en vert, suivi d'un bip aigu.
  3. Remettez la couleur normale, puis attendez une touche avant de fermer.

Aide : une boucle for qui descend utilise i-- au lieu de i++ (fiche 11).

Solution

for (int i = 5; i >= 1; i--)
{
    Console.Clear();
    Console.WriteLine(i);
    Thread.Sleep(1000);
}

Console.Clear();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Décollage !");
Console.ResetColor();
Console.Beep(1500, 500);

Console.ReadKey();

La boucle descend. i commence à 5, la boucle continue tant que i >= 1, et i-- retire 1 à chaque tour.

L'ordre compte à l'intérieur de la boucle. On efface, on affiche le nombre, puis on attend. Si on attendait avant d'afficher, on verrait un écran vide pendant une seconde.

Le Clear() après la boucle efface le dernier chiffre avant le message final.

2Victoire ou défaiteModifier

Reprenez le jeu du dé (fiche 9, exercice 4) et ajoutez de la couleur et du son.

  1. Préparez deux sons en .wav, comme dans la section 4 : victoire.wav et defaite.wav. Ajoutez-les au projet.
  2. Si le dé donne 6 : message en vert et son de victoire.
  3. Si le dé donne 1 : message en rouge et son de défaite.
  4. Pour tous les autres résultats : le message habituel, sans son.

Solution

using System.Media;

Random de = new Random();
SoundPlayer victoire = new SoundPlayer("victoire.wav");
SoundPlayer defaite = new SoundPlayer("defaite.wav");

int lancer = de.Next(1, 7);
Console.WriteLine($"Vous lancez le dé : {lancer}");

if (lancer == 6)
{
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine("Un six ! Vous rejouez.");
    Console.ResetColor();
    victoire.PlaySync();
}
else if (lancer == 1)
{
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("Un un... vous passez votre tour.");
    Console.ResetColor();
    defaite.PlaySync();
}
else
{
    Console.WriteLine($"Vous avancez de {lancer} cases.");
}

Console.ReadKey();

Le using System.Media; est la toute première ligne, avant le reste du programme.

Les deux SoundPlayer sont créés au début, comme le Random : une fois pour toutes, avant de les utiliser.

Pourquoi PlaySync() ici ? Le programme attend la fin du son avant de continuer. Avec Play(), le son se jouerait en même temps que la suite, ce qui est aussi correct grâce au ReadKey() final.

Pensez au ResetColor() avant de jouer le son : le texte coloré est déjà affiché, la couleur n'a plus à rester active.

Je sais faire

Une case qui coince ? Relisez la partie concernée avant de passer à la fiche suivante.

← Fiche 12