Création d'une Application Console de Jeu de Devinettes
Glissez pour afficher le menu
Dans ce chapitre, préparez-vous à perfectionner vos compétences en développement d'applications console en plongeant dans la création d'un jeu captivant Devinez le Nombre. Ce jeu interactif mettra les joueurs au défi de faire preuve d'intuition en devinant un nombre généré aléatoirement dans une plage prédéfinie. Au fil du chapitre, nous explorerons des concepts fondamentaux tels que :
- Génération de nombres aléatoires ;
- Validation des entrées ;
- Interaction utilisateur ;
- Enregistrement des résultats du jeu dans un fichier.
Défi
Imaginez-vous explorer une application qui promet excitation et mystère. Les joueurs sont invités à deviner un nombre choisi secrètement dans une plage prédéfinie. L'application fournit un retour instantané sur chaque proposition et tient un compte précis du nombre de tentatives effectuées.
Cet exemple pratique est l'occasion idéale d'affiner vos compétences dans la création d'applications CLI et de découvrir l'art de concevoir des programmes interactifs.
Application finale
Découvrez la magie en action ! Ci-dessous, un GIF illustre l'application palpitante Devinez le Nombre que vous allez réaliser :
Création d'une application console de jeu de devinettes
Deux chemins s'offrent à vous. Le premier vous invite à vous lancer dans l'aventure sans aide, tandis que le second propose un guide utile pour assurer votre réussite. Que vous plongiez avec audace ou suiviez le guide structuré, vous vivrez une expérience fascinante qui vous permettra de créer une application console fonctionnelle et captivante.
Plan directeur
- Étape 1 : Configuration et initialisations ;
- Étape 2 : Définition des paramètres du jeu ;
- Étape 3 : Définition des fonctions utilitaires ;
- Étape 4 : Logique du jeu ;
- Étape 5 : Sauvegarde du résultat du jeu ;
- Étape 6 : Lancement du jeu ;
- Conclusion ;
- Code complet de l'application.
Étape 1 : Configuration et initialisations
Préparation de l'environnement en créant un nouveau répertoire et un fichier nommé app.js. Dans ce fichier, nous importons les modules nécessaires :
const readline = require('readline');
const fs = require('fs').promises;
Création d'une interface Readline :
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
-
readline: fournit une interface pour lire les entrées et écrire les sorties dans la console ; -
readline.createInterface({ ... }): crée une instance de la classereadline.Interface. Elle accepte un objet avec les propriétésinputetoutput; -
input: process.stdin: définit le flux d'entrée surprocess.stdin, permettant au programme de lire les saisies utilisateur depuis le clavier ; -
output: process.stdout: définit le flux de sortie surprocess.stdout, permettant au programme d'afficher du texte dans la console.
Explication : Importation des modules nécessaires : readline pour l'interaction avec l'utilisateur et fs.promises pour les opérations sur les fichiers. Ensuite, création d'une interface Readline nommée rl pour gérer les entrées et sorties.
Étape 2 : Définir les paramètres du jeu
Définir les nombres minimum et maximum :
const minNumber = 1;
const maxNumber = 100;
Génération du nombre secret :
const secretNumber =
Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
-
Math.random(): génère un nombre à virgule flottante aléatoire compris entre0(inclus) et1(exclus) ; -
maxNumber - minNumber + 1: calcule l'étendue des nombres possibles. L'ajout de1garantit queminNumberetmaxNumbersont inclus dans l'intervalle ; -
Math.random() * (maxNumber - minNumber + 1): génère un nombre aléatoire compris entre0et l'étendue calculée ; -
Math.floor(...): arrondit à l'entier inférieur le nombre à virgule flottante généré, garantissant que le résultat est un nombre entier dans l'intervalle souhaité ; -
... + minNumber: décale le nombre généré afin que l'intervalle commence àminNumberau lieu de0.
Initialisation du compteur de tentatives :
let attempts = 0;
Explication : Définition de la plage de nombres (minNumber et maxNumber) dans laquelle le nombre secret sera généré. Le nombre secret est généré aléatoirement à l'aide de Math.random() et assigné à secretNumber. La variable attempts est initialisée pour suivre le nombre de tentatives de l'utilisateur.
Étape 3 : Définir des fonctions utilitaires
Utilisation d'une fonction utilitaire pour une validation irréprochable :
function isValidGuess(guess) {
return !isNaN(guess)
&& guess >= minNumber
&& guess <= maxNumber;
}
-
!isNaN(guess): vérifie siguessest un nombre valide. La fonctionisNaN()retournefalsepour les nombres valides, et l'opérateur!inverse le résultat entrue; -
guess >= minNumber: vérifie queguessest supérieur ou égal àminNumber, garantissant qu'il n'est pas en dessous de la plage autorisée ; -
guess <= maxNumber: vérifie queguessest inférieur ou égal àmaxNumber, garantissant qu'il n'est pas au-dessus de la plage autorisée ; -
&&: combine toutes les conditions à l'aide de l'opérateur logique AND. Chaque condition doit êtretruepour que l'expression entière soit évaluée àtrue.
Explication : La fonction isValidGuess vérifie si la proposition de l'utilisateur est un nombre valide compris dans la plage spécifiée (minNumber à maxNumber).
Étape 4 : Logique du jeu
Les mécanismes principaux du jeu via la fonction playGame :
function playGame() {
rl.question(`Guess a number between ${minNumber} and ${maxNumber}: `, guess => {
if (isValidGuess(guess)) {
attempts++;
const guessNumber = parseInt(guess);
if (guessNumber === secretNumber) {
console.log(`Congratulations! You guessed the number in ${attempts} attempts.`);
saveGameResult(`Player won in ${attempts} attempts.`);
rl.close();
} else if (guessNumber < secretNumber) {
console.log('Try higher.');
playGame();
} else {
console.log('Try lower.');
playGame();
}
} else {
console.log('Please enter a valid number within the specified range.');
playGame();
}
});
}
-
rl.question(\Guess a number between ${minNumber} and ${maxNumber}: `, guess => { ... }): prompts the user to enter a number within the specified range. The user's input is passed to the callback function as theguess` ; -
if (isValidGuess(guess)) { ... }: vérifie si la valeur saisie est une proposition valide à l'aide de la fonctionisValidGuess(); -
attempts++;: incrémente le compteurattemptspour suivre le nombre de tentatives effectuées par le joueur ; -
const guessNumber = parseInt(guess);: convertit la saisie de l'utilisateur d'une chaîne de caractères en entier à l'aide deparseInt(); -
if (guessNumber === secretNumber) { ... }: vérifie si la proposition du joueur correspond au nombre secret. Si c'est le cas, le jeu affiche un message de réussite, enregistre le résultat, ferme l'interfacereadlineet termine la partie ; -
else if (guessNumber < secretNumber) { ... }: informe le joueur que le nombre secret est plus grand et appelle à nouveauplayGame()pour continuer la partie ; -
else { ... }: informe le joueur que le nombre secret est plus petit et appelle à nouveauplayGame()pour continuer la partie ; -
else { ... }(après la vérification de validation) : gère les entrées invalides en demandant au joueur de saisir un nombre valide dans la plage autorisée, puis appelle à nouveauplayGame().
Explication : La fonction playGame constitue la boucle principale du jeu. Elle utilise rl.question pour demander à l'utilisateur de deviner un nombre. Si la proposition est valide, la fonction vérifie si la réponse correspond au nombre secret. Sinon, elle fournit un retour à l'utilisateur et continue la boucle du jeu de manière récursive.
Étape 5 : Sauvegarder le résultat du jeu
Implémentation de la logique permettant d'enregistrer les réussites de l'utilisateur dans le fichier game_results.txt.
async function saveGameResult(result) {
try {
await fs.appendFile('game_results.txt', `${result}\n`);
console.log('Game result saved.');
} catch (err) {
console.log('Failed to save game result.');
}
}
-
async function saveGameResult(result) { ... }: définit une fonction asynchrone nomméesaveGameResult()qui accepte un paramètreresultet permet l'utilisation du mot-cléawaitdans le corps de la fonction ; -
try { ... } catch (err) { ... }: gère les erreurs potentielles pouvant survenir lors de l'opération asynchrone sur le fichier ; -
await fs.appendFile('game_results.txt', \${result}\n`) ;: appends the providedresultfollowed by a newline character to thegame_results.txtfile. Theawait` suspend l'exécution jusqu'à la réussite de l'opération sur le fichier ; -
console.log('Game result saved.');: affiche un message de confirmation lorsque le résultat du jeu est correctement écrit dans le fichier ; -
console.log('Failed to save game result.');: affiche un message d'erreur si l'opération échoue et qu'une exception est capturée par le bloccatch.
Explication : La fonction saveGameResult utilise fs.promises pour ajouter le résultat de la partie à un fichier nommé game_results.txt. Elle fournit un retour sur le succès ou l'échec de l'enregistrement du résultat.
Étape 6 : Démarrer le jeu
Créer le message de bienvenue et lancer le jeu :
console.log('Welcome to the Guess the Number game!');
playGame();
Explication : Un message de bienvenue est affiché et la boucle du jeu commence en appelant la fonction playGame.
Code complet de l'application
const readline = require("readline");
const fs = require("fs").promises;
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const minNumber = 1;
const maxNumber = 100;
const secretNumber =
Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
let attempts = 0;
function isValidGuess(guess) {
return !isNaN(guess) && guess >= minNumber && guess <= maxNumber;
}
function playGame() {
rl.question(
`Guess a number between ${minNumber} and ${maxNumber}: `,
(guess) => {
if (isValidGuess(guess)) {
attempts++;
const guessNumber = parseInt(guess);
if (guessNumber === secretNumber) {
console.log(
`Congratulations! You guessed the number in ${attempts} attempts.`
);
saveGameResult(`Player won in ${attempts} attempts.`);
rl.close();
} else if (guessNumber < secretNumber) {
console.log("Try higher.");
playGame();
} else {
console.log("Try lower.");
playGame();
}
} else {
console.log("Please enter a valid number within the specified range.");
playGame();
}
}
);
}
async function saveGameResult(result) {
try {
await fs.appendFile("game_results.txt", `${result}\n`);
console.log("Game result saved.");
} catch (err) {
console.log("Failed to save game result.");
}
}
console.log("Welcome to the Guess the Number game!");
playGame();
-
Lignes 1-2 : importation du module natif
readlineet de l'APIfsdu modulepromisespour les opérations de fichiers asynchrones ; -
Lignes 4-7 : création d'une interface readline nommée
rlpour lire les entrées utilisateur et afficher la sortie dans la console ; -
Lignes 9-10 : définition des valeurs minimale et maximale pour la plage de nombres à deviner ;
-
Lignes 12-13 : génération d'un nombre secret aléatoire dans la plage spécifiée à l'aide de
Math.random(); -
Ligne 14 : initialisation du compteur
attemptspour suivre le nombre d'essais effectués par le joueur ; -
Lignes 16-18 : définition de la fonction
isValidGuess()pour valider que la valeur saisie est un nombre dans la plage autorisée ; -
Lignes 20-47 : définition de la fonction récursive
playGame()qui :- invite le joueur à saisir une proposition ;
- valide la valeur saisie ;
- vérifie si la proposition correspond au nombre secret ;
- fournit un retour si la proposition est trop élevée ou trop basse ;
- poursuit le jeu en s'appelant à nouveau si nécessaire ;
- enregistre le résultat et termine le jeu lorsque le bon nombre est trouvé ;
-
Lignes 49-56 : définition de la fonction asynchrone
saveGameResult()qui enregistre le résultat de la partie dans le fichiergame_results.txtet gère les erreurs potentielles ; -
Ligne 58 : affichage d'un message de bienvenue au joueur ;
-
Ligne 59 : démarrage du jeu en appelant la fonction
playGame().
Résumé
Ce programme crée un jeu de devinette de nombre. Le joueur tente de deviner un nombre généré aléatoirement dans une plage spécifiée. Le jeu fournit un retour après chaque proposition, compte le nombre d'essais et enregistre les résultats réussis dans un fichier texte à l'aide d'opérations de fichiers asynchrones.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Création d'une Application Console de Jeu de Devinettes
Dans ce chapitre, préparez-vous à perfectionner vos compétences en développement d'applications console en plongeant dans la création d'un jeu captivant Devinez le Nombre. Ce jeu interactif mettra les joueurs au défi de faire preuve d'intuition en devinant un nombre généré aléatoirement dans une plage prédéfinie. Au fil du chapitre, nous explorerons des concepts fondamentaux tels que :
- Génération de nombres aléatoires ;
- Validation des entrées ;
- Interaction utilisateur ;
- Enregistrement des résultats du jeu dans un fichier.
Défi
Imaginez-vous explorer une application qui promet excitation et mystère. Les joueurs sont invités à deviner un nombre choisi secrètement dans une plage prédéfinie. L'application fournit un retour instantané sur chaque proposition et tient un compte précis du nombre de tentatives effectuées.
Cet exemple pratique est l'occasion idéale d'affiner vos compétences dans la création d'applications CLI et de découvrir l'art de concevoir des programmes interactifs.
Application finale
Découvrez la magie en action ! Ci-dessous, un GIF illustre l'application palpitante Devinez le Nombre que vous allez réaliser :
Création d'une application console de jeu de devinettes
Deux chemins s'offrent à vous. Le premier vous invite à vous lancer dans l'aventure sans aide, tandis que le second propose un guide utile pour assurer votre réussite. Que vous plongiez avec audace ou suiviez le guide structuré, vous vivrez une expérience fascinante qui vous permettra de créer une application console fonctionnelle et captivante.
Plan directeur
- Étape 1 : Configuration et initialisations ;
- Étape 2 : Définition des paramètres du jeu ;
- Étape 3 : Définition des fonctions utilitaires ;
- Étape 4 : Logique du jeu ;
- Étape 5 : Sauvegarde du résultat du jeu ;
- Étape 6 : Lancement du jeu ;
- Conclusion ;
- Code complet de l'application.
Étape 1 : Configuration et initialisations
Préparation de l'environnement en créant un nouveau répertoire et un fichier nommé app.js. Dans ce fichier, nous importons les modules nécessaires :
const readline = require('readline');
const fs = require('fs').promises;
Création d'une interface Readline :
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
-
readline: fournit une interface pour lire les entrées et écrire les sorties dans la console ; -
readline.createInterface({ ... }): crée une instance de la classereadline.Interface. Elle accepte un objet avec les propriétésinputetoutput; -
input: process.stdin: définit le flux d'entrée surprocess.stdin, permettant au programme de lire les saisies utilisateur depuis le clavier ; -
output: process.stdout: définit le flux de sortie surprocess.stdout, permettant au programme d'afficher du texte dans la console.
Explication : Importation des modules nécessaires : readline pour l'interaction avec l'utilisateur et fs.promises pour les opérations sur les fichiers. Ensuite, création d'une interface Readline nommée rl pour gérer les entrées et sorties.
Étape 2 : Définir les paramètres du jeu
Définir les nombres minimum et maximum :
const minNumber = 1;
const maxNumber = 100;
Génération du nombre secret :
const secretNumber =
Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
-
Math.random(): génère un nombre à virgule flottante aléatoire compris entre0(inclus) et1(exclus) ; -
maxNumber - minNumber + 1: calcule l'étendue des nombres possibles. L'ajout de1garantit queminNumberetmaxNumbersont inclus dans l'intervalle ; -
Math.random() * (maxNumber - minNumber + 1): génère un nombre aléatoire compris entre0et l'étendue calculée ; -
Math.floor(...): arrondit à l'entier inférieur le nombre à virgule flottante généré, garantissant que le résultat est un nombre entier dans l'intervalle souhaité ; -
... + minNumber: décale le nombre généré afin que l'intervalle commence àminNumberau lieu de0.
Initialisation du compteur de tentatives :
let attempts = 0;
Explication : Définition de la plage de nombres (minNumber et maxNumber) dans laquelle le nombre secret sera généré. Le nombre secret est généré aléatoirement à l'aide de Math.random() et assigné à secretNumber. La variable attempts est initialisée pour suivre le nombre de tentatives de l'utilisateur.
Étape 3 : Définir des fonctions utilitaires
Utilisation d'une fonction utilitaire pour une validation irréprochable :
function isValidGuess(guess) {
return !isNaN(guess)
&& guess >= minNumber
&& guess <= maxNumber;
}
-
!isNaN(guess): vérifie siguessest un nombre valide. La fonctionisNaN()retournefalsepour les nombres valides, et l'opérateur!inverse le résultat entrue; -
guess >= minNumber: vérifie queguessest supérieur ou égal àminNumber, garantissant qu'il n'est pas en dessous de la plage autorisée ; -
guess <= maxNumber: vérifie queguessest inférieur ou égal àmaxNumber, garantissant qu'il n'est pas au-dessus de la plage autorisée ; -
&&: combine toutes les conditions à l'aide de l'opérateur logique AND. Chaque condition doit êtretruepour que l'expression entière soit évaluée àtrue.
Explication : La fonction isValidGuess vérifie si la proposition de l'utilisateur est un nombre valide compris dans la plage spécifiée (minNumber à maxNumber).
Étape 4 : Logique du jeu
Les mécanismes principaux du jeu via la fonction playGame :
function playGame() {
rl.question(`Guess a number between ${minNumber} and ${maxNumber}: `, guess => {
if (isValidGuess(guess)) {
attempts++;
const guessNumber = parseInt(guess);
if (guessNumber === secretNumber) {
console.log(`Congratulations! You guessed the number in ${attempts} attempts.`);
saveGameResult(`Player won in ${attempts} attempts.`);
rl.close();
} else if (guessNumber < secretNumber) {
console.log('Try higher.');
playGame();
} else {
console.log('Try lower.');
playGame();
}
} else {
console.log('Please enter a valid number within the specified range.');
playGame();
}
});
}
-
rl.question(\Guess a number between ${minNumber} and ${maxNumber}: `, guess => { ... }): prompts the user to enter a number within the specified range. The user's input is passed to the callback function as theguess` ; -
if (isValidGuess(guess)) { ... }: vérifie si la valeur saisie est une proposition valide à l'aide de la fonctionisValidGuess(); -
attempts++;: incrémente le compteurattemptspour suivre le nombre de tentatives effectuées par le joueur ; -
const guessNumber = parseInt(guess);: convertit la saisie de l'utilisateur d'une chaîne de caractères en entier à l'aide deparseInt(); -
if (guessNumber === secretNumber) { ... }: vérifie si la proposition du joueur correspond au nombre secret. Si c'est le cas, le jeu affiche un message de réussite, enregistre le résultat, ferme l'interfacereadlineet termine la partie ; -
else if (guessNumber < secretNumber) { ... }: informe le joueur que le nombre secret est plus grand et appelle à nouveauplayGame()pour continuer la partie ; -
else { ... }: informe le joueur que le nombre secret est plus petit et appelle à nouveauplayGame()pour continuer la partie ; -
else { ... }(après la vérification de validation) : gère les entrées invalides en demandant au joueur de saisir un nombre valide dans la plage autorisée, puis appelle à nouveauplayGame().
Explication : La fonction playGame constitue la boucle principale du jeu. Elle utilise rl.question pour demander à l'utilisateur de deviner un nombre. Si la proposition est valide, la fonction vérifie si la réponse correspond au nombre secret. Sinon, elle fournit un retour à l'utilisateur et continue la boucle du jeu de manière récursive.
Étape 5 : Sauvegarder le résultat du jeu
Implémentation de la logique permettant d'enregistrer les réussites de l'utilisateur dans le fichier game_results.txt.
async function saveGameResult(result) {
try {
await fs.appendFile('game_results.txt', `${result}\n`);
console.log('Game result saved.');
} catch (err) {
console.log('Failed to save game result.');
}
}
-
async function saveGameResult(result) { ... }: définit une fonction asynchrone nomméesaveGameResult()qui accepte un paramètreresultet permet l'utilisation du mot-cléawaitdans le corps de la fonction ; -
try { ... } catch (err) { ... }: gère les erreurs potentielles pouvant survenir lors de l'opération asynchrone sur le fichier ; -
await fs.appendFile('game_results.txt', \${result}\n`) ;: appends the providedresultfollowed by a newline character to thegame_results.txtfile. Theawait` suspend l'exécution jusqu'à la réussite de l'opération sur le fichier ; -
console.log('Game result saved.');: affiche un message de confirmation lorsque le résultat du jeu est correctement écrit dans le fichier ; -
console.log('Failed to save game result.');: affiche un message d'erreur si l'opération échoue et qu'une exception est capturée par le bloccatch.
Explication : La fonction saveGameResult utilise fs.promises pour ajouter le résultat de la partie à un fichier nommé game_results.txt. Elle fournit un retour sur le succès ou l'échec de l'enregistrement du résultat.
Étape 6 : Démarrer le jeu
Créer le message de bienvenue et lancer le jeu :
console.log('Welcome to the Guess the Number game!');
playGame();
Explication : Un message de bienvenue est affiché et la boucle du jeu commence en appelant la fonction playGame.
Code complet de l'application
const readline = require("readline");
const fs = require("fs").promises;
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const minNumber = 1;
const maxNumber = 100;
const secretNumber =
Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
let attempts = 0;
function isValidGuess(guess) {
return !isNaN(guess) && guess >= minNumber && guess <= maxNumber;
}
function playGame() {
rl.question(
`Guess a number between ${minNumber} and ${maxNumber}: `,
(guess) => {
if (isValidGuess(guess)) {
attempts++;
const guessNumber = parseInt(guess);
if (guessNumber === secretNumber) {
console.log(
`Congratulations! You guessed the number in ${attempts} attempts.`
);
saveGameResult(`Player won in ${attempts} attempts.`);
rl.close();
} else if (guessNumber < secretNumber) {
console.log("Try higher.");
playGame();
} else {
console.log("Try lower.");
playGame();
}
} else {
console.log("Please enter a valid number within the specified range.");
playGame();
}
}
);
}
async function saveGameResult(result) {
try {
await fs.appendFile("game_results.txt", `${result}\n`);
console.log("Game result saved.");
} catch (err) {
console.log("Failed to save game result.");
}
}
console.log("Welcome to the Guess the Number game!");
playGame();
-
Lignes 1-2 : importation du module natif
readlineet de l'APIfsdu modulepromisespour les opérations de fichiers asynchrones ; -
Lignes 4-7 : création d'une interface readline nommée
rlpour lire les entrées utilisateur et afficher la sortie dans la console ; -
Lignes 9-10 : définition des valeurs minimale et maximale pour la plage de nombres à deviner ;
-
Lignes 12-13 : génération d'un nombre secret aléatoire dans la plage spécifiée à l'aide de
Math.random(); -
Ligne 14 : initialisation du compteur
attemptspour suivre le nombre d'essais effectués par le joueur ; -
Lignes 16-18 : définition de la fonction
isValidGuess()pour valider que la valeur saisie est un nombre dans la plage autorisée ; -
Lignes 20-47 : définition de la fonction récursive
playGame()qui :- invite le joueur à saisir une proposition ;
- valide la valeur saisie ;
- vérifie si la proposition correspond au nombre secret ;
- fournit un retour si la proposition est trop élevée ou trop basse ;
- poursuit le jeu en s'appelant à nouveau si nécessaire ;
- enregistre le résultat et termine le jeu lorsque le bon nombre est trouvé ;
-
Lignes 49-56 : définition de la fonction asynchrone
saveGameResult()qui enregistre le résultat de la partie dans le fichiergame_results.txtet gère les erreurs potentielles ; -
Ligne 58 : affichage d'un message de bienvenue au joueur ;
-
Ligne 59 : démarrage du jeu en appelant la fonction
playGame().
Résumé
Ce programme crée un jeu de devinette de nombre. Le joueur tente de deviner un nombre généré aléatoirement dans une plage spécifiée. Le jeu fournit un retour après chaque proposition, compte le nombre d'essais et enregistre les résultats réussis dans un fichier texte à l'aide d'opérations de fichiers asynchrones.
Merci pour vos commentaires !