Bygga en Gissningsspel-Konsolapplikation
Svep för att visa menyn
I det här kapitlet får du möjlighet att utveckla dina färdigheter i att skapa konsolapplikationer när vi bygger ett spännande Gissa numret-spel. Det här interaktiva spelet utmanar spelare att använda sin intuition för att gissa ett slumpmässigt genererat nummer inom ett fördefinierat intervall. Under arbetets gång kommer vi att utforska grundläggande koncept som:
- Slumpmässig talgenerering;
- Inmatningsvalidering;
- Användarinteraktion;
- Även spara spelresultat till en fil.
Utmaning
Föreställ dig att utforska en app som lovar spänning och nyfikenhet. Spelare bjuds in att gissa ett mystiskt valt nummer inom ett fördefinierat intervall. Appen ger omedelbar återkoppling på varje gissning och håller noggrant räkning på antalet försök.
Detta praktiska exempel är din möjlighet att finslipa dina färdigheter i att bygga CLI-appar och visar konsten att skapa interaktiva program.
Slutlig app
Se magin i praktiken! Nedan visas en GIF som illustrerar det spännande Gissa numret-spelet som du kommer att bygga:
Bygga en gissningsspel-konsolapp
Du står inför två vägar. Det första alternativet lockar dig att påbörja resan utan hjälp, medan det andra erbjuder en hjälpsam guide för att säkerställa din framgång. Oavsett om du kastar dig in modigt eller följer den strukturerade guiden väntar en fascinerande upplevelse som lämnar dig med en funktionell och fängslande konsolapp.
Huvudplan
- Steg 1: Installation och initiering;
- Steg 2: Definiera spelparametrar;
- Steg 3: Definiera hjälpfunktioner;
- Steg 4: Spellogik;
- Steg 5: Spara spelresultat;
- Steg 6: Starta spelet;
- Slutsats;
- Komplett appkod.
Steg 1: Installation och initiering
Förbered arbetsytan genom att skapa en ny katalog och en fil med namnet app.js. I denna fil importerar vi de nödvändiga modulerna:
const readline = require('readline');
const fs = require('fs').promises;
Skapa ett Readline-gränssnitt:
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
-
readline: tillhandahåller ett gränssnitt för att läsa inmatning från och skriva utdata till konsolen; -
readline.createInterface({ ... }): skapar en instans av klassenreadline.Interface. Den accepterar ett objekt med egenskapernainputochoutput; -
input: process.stdin: ställer in inmatningsströmmen tillprocess.stdin, vilket gör att programmet kan läsa användarens inmatning från tangentbordet; -
output: process.stdout: ställer in utmatningsströmmen tillprocess.stdout, vilket gör att programmet kan visa text i konsolen.
Förklaring: Vi importerar de nödvändiga modulerna: readline för användarinteraktion och fs.promises för filoperationer. Därefter skapar vi ett Readline-gränssnitt med namnet rl för att hantera in- och utmatning.
Steg 2: Definiera spelparametrar
Ange minsta och största tal:
const minNumber = 1;
const maxNumber = 100;
Generera det hemliga numret:
const secretNumber =
Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
-
Math.random(): genererar ett slumpmässigt flyttal mellan0(inklusive) och1(exklusive); -
maxNumber - minNumber + 1: beräknar intervallet av möjliga tal. Att lägga till1säkerställer att bådeminNumberochmaxNumberinkluderas i intervallet; -
Math.random() * (maxNumber - minNumber + 1): genererar ett slumpmässigt tal mellan0och det beräknade intervallet; -
Math.floor(...): avrundar det genererade flyttalet nedåt till närmaste heltal, vilket säkerställer att resultatet är ett heltal inom önskat intervall; -
... + minNumber: förskjuter det genererade talet så att intervallet börjar vidminNumberistället för0.
Initiera räknaren för försök:
let attempts = 0;
Förklaring: Vi definierar intervallet av tal (minNumber och maxNumber) inom vilket det hemliga numret kommer att genereras. Det hemliga numret genereras slumpmässigt med hjälp av Math.random() och tilldelas secretNumber. Variabeln attempts initieras för att hålla reda på användarens försök.
Steg 3: Definiera hjälpfunktioner
Utrusta med en hjälpfunktion för felfri validering:
function isValidGuess(guess) {
return !isNaN(guess)
&& guess >= minNumber
&& guess <= maxNumber;
}
-
!isNaN(guess): kontrollerar omguessär ett giltigt tal. FunktionenisNaN()returnerarfalseför giltiga tal, och!-operatorn vänder detta tilltrue; -
guess >= minNumber: verifierar attguessär större än eller lika medminNumber, vilket säkerställer att det inte är under det tillåtna intervallet; -
guess <= maxNumber: verifierar attguessär mindre än eller lika medmaxNumber, vilket säkerställer att det inte är över det tillåtna intervallet; -
&&: kombinerar alla villkor med hjälp av den logiska OCH-operatorn. Alla villkor måste varatrueför att hela uttrycket ska utvärderas tilltrue.
Förklaring: Funktionen isValidGuess kontrollerar om användarens gissning är ett giltigt tal inom det angivna intervallet (minNumber till maxNumber).
Steg 4: Spellogik
Spelets kärnmekanik via funktionen 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)) { ... }: kontrollerar om det angivna värdet är en giltig gissning med hjälp av funktionenisValidGuess(); -
attempts++;: ökar räknarenattemptsför att hålla reda på hur många gissningar spelaren har gjort; -
const guessNumber = parseInt(guess);: konverterar användarens inmatning från en sträng till ett heltal medparseInt(); -
if (guessNumber === secretNumber) { ... }: kontrollerar om spelarens gissning matchar det hemliga talet. Om så är fallet visas ett meddelande om framgång, resultatet sparas,readline-gränssnittet stängs och spelet avslutas; -
else if (guessNumber < secretNumber) { ... }: informerar spelaren om att det hemliga talet är högre och anroparplayGame()igen för att fortsätta spelet; -
else { ... }: informerar spelaren om att det hemliga talet är lägre och anroparplayGame()igen för att fortsätta spelet; -
else { ... }(efter valideringskontrollen): hanterar ogiltig inmatning genom att be spelaren ange ett giltigt tal inom det tillåtna intervallet och anropar sedanplayGame()igen.
Förklaring: Funktionen playGame utgör spelets huvudloop. Den använder rl.question för att be användaren om en gissning. Om gissningen är giltig kontrollerar funktionen om gissningen matchar det hemliga numret. Om inte, ger den feedback till användaren och fortsätter spel-loopen rekursivt.
Steg 5: Spara spelresultat
Implementera logiken för att spara användarens spelprestationer i filen 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) { ... }: definierar en asynkron funktion med namnetsaveGameResult()som tar emot en parameterresultoch möjliggör användning avawait-nyckelordet i funktionskroppen; -
try { ... } catch (err) { ... }: hanterar potentiella fel som kan uppstå under den asynkrona filoperationen; -
await fs.appendFile('game_results.txt', \${result}\n`);: appends the providedresultfollowed by a newline character to thegame_results.txtfile. Theawait` pausar exekveringen tills filoperationen har slutförts framgångsrikt; -
console.log('Game result saved.');: visar ett bekräftelsemeddelande när spelresultatet har skrivits till filen; -
console.log('Failed to save game result.');: visar ett felmeddelande om filoperationen misslyckas och ett undantag fångas avcatch-blocket.
Förklaring: Funktionen saveGameResult använder fs.promises för att lägga till spelresultatet i en fil med namnet game_results.txt. Den ger återkoppling om det lyckades eller misslyckades att spara resultatet.
Steg 6: Starta spelet
Skapa välkomstmeddelandet och starta spelet:
console.log('Welcome to the Guess the Number game!');
playGame();
Förklaring: Vi visar ett välkomstmeddelande och startar spelloppet genom att anropa funktionen playGame.
Fullständig appkod
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();
-
Rader 1-2: importerar den inbyggda modulen
readlineochfs-modulenspromises-API för asynkrona filoperationer; -
Rader 4-7: skapar ett readline-gränssnitt med namnet
rlför att läsa användarinmatning och visa utdata i konsolen; -
Rader 9-10: definierar minimi- och maximivärden för gissningsintervallet;
-
Rader 12-13: genererar ett slumpmässigt hemligt tal inom det angivna intervallet med hjälp av
Math.random(); -
Rad 14: initierar räknaren
attemptsför att hålla reda på antalet gissningar som spelaren gör; -
Rader 16-18: definierar funktionen
isValidGuess()för att validera att det inmatade värdet är ett tal inom det tillåtna intervallet; -
Rader 20-47: definierar den rekursiva funktionen
playGame()som:- ber spelaren ange en gissning;
- validerar det inmatade värdet;
- kontrollerar om gissningen matchar det hemliga talet;
- ger återkoppling om gissningen är för hög eller för låg;
- fortsätter spelet genom att anropa sig själv igen vid behov;
- sparar resultatet och avslutar spelet när rätt tal gissas;
-
Rader 49-56: definierar den asynkrona funktionen
saveGameResult()som sparar spelresultatet till filengame_results.txtoch hanterar eventuella fel; -
Rad 58: visar ett välkomstmeddelande till spelaren;
-
Rad 59: startar spelet genom att anropa funktionen
playGame().
Sammanfattning
Detta program skapar ett gissningsspel med tal. Spelaren försöker gissa ett slumpmässigt genererat tal inom ett angivet intervall. Spelet ger återkoppling efter varje gissning, håller reda på antalet försök och sparar lyckade resultat till en textfil med hjälp av asynkrona filoperationer.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Bygga en Gissningsspel-Konsolapplikation
I det här kapitlet får du möjlighet att utveckla dina färdigheter i att skapa konsolapplikationer när vi bygger ett spännande Gissa numret-spel. Det här interaktiva spelet utmanar spelare att använda sin intuition för att gissa ett slumpmässigt genererat nummer inom ett fördefinierat intervall. Under arbetets gång kommer vi att utforska grundläggande koncept som:
- Slumpmässig talgenerering;
- Inmatningsvalidering;
- Användarinteraktion;
- Även spara spelresultat till en fil.
Utmaning
Föreställ dig att utforska en app som lovar spänning och nyfikenhet. Spelare bjuds in att gissa ett mystiskt valt nummer inom ett fördefinierat intervall. Appen ger omedelbar återkoppling på varje gissning och håller noggrant räkning på antalet försök.
Detta praktiska exempel är din möjlighet att finslipa dina färdigheter i att bygga CLI-appar och visar konsten att skapa interaktiva program.
Slutlig app
Se magin i praktiken! Nedan visas en GIF som illustrerar det spännande Gissa numret-spelet som du kommer att bygga:
Bygga en gissningsspel-konsolapp
Du står inför två vägar. Det första alternativet lockar dig att påbörja resan utan hjälp, medan det andra erbjuder en hjälpsam guide för att säkerställa din framgång. Oavsett om du kastar dig in modigt eller följer den strukturerade guiden väntar en fascinerande upplevelse som lämnar dig med en funktionell och fängslande konsolapp.
Huvudplan
- Steg 1: Installation och initiering;
- Steg 2: Definiera spelparametrar;
- Steg 3: Definiera hjälpfunktioner;
- Steg 4: Spellogik;
- Steg 5: Spara spelresultat;
- Steg 6: Starta spelet;
- Slutsats;
- Komplett appkod.
Steg 1: Installation och initiering
Förbered arbetsytan genom att skapa en ny katalog och en fil med namnet app.js. I denna fil importerar vi de nödvändiga modulerna:
const readline = require('readline');
const fs = require('fs').promises;
Skapa ett Readline-gränssnitt:
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
-
readline: tillhandahåller ett gränssnitt för att läsa inmatning från och skriva utdata till konsolen; -
readline.createInterface({ ... }): skapar en instans av klassenreadline.Interface. Den accepterar ett objekt med egenskapernainputochoutput; -
input: process.stdin: ställer in inmatningsströmmen tillprocess.stdin, vilket gör att programmet kan läsa användarens inmatning från tangentbordet; -
output: process.stdout: ställer in utmatningsströmmen tillprocess.stdout, vilket gör att programmet kan visa text i konsolen.
Förklaring: Vi importerar de nödvändiga modulerna: readline för användarinteraktion och fs.promises för filoperationer. Därefter skapar vi ett Readline-gränssnitt med namnet rl för att hantera in- och utmatning.
Steg 2: Definiera spelparametrar
Ange minsta och största tal:
const minNumber = 1;
const maxNumber = 100;
Generera det hemliga numret:
const secretNumber =
Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
-
Math.random(): genererar ett slumpmässigt flyttal mellan0(inklusive) och1(exklusive); -
maxNumber - minNumber + 1: beräknar intervallet av möjliga tal. Att lägga till1säkerställer att bådeminNumberochmaxNumberinkluderas i intervallet; -
Math.random() * (maxNumber - minNumber + 1): genererar ett slumpmässigt tal mellan0och det beräknade intervallet; -
Math.floor(...): avrundar det genererade flyttalet nedåt till närmaste heltal, vilket säkerställer att resultatet är ett heltal inom önskat intervall; -
... + minNumber: förskjuter det genererade talet så att intervallet börjar vidminNumberistället för0.
Initiera räknaren för försök:
let attempts = 0;
Förklaring: Vi definierar intervallet av tal (minNumber och maxNumber) inom vilket det hemliga numret kommer att genereras. Det hemliga numret genereras slumpmässigt med hjälp av Math.random() och tilldelas secretNumber. Variabeln attempts initieras för att hålla reda på användarens försök.
Steg 3: Definiera hjälpfunktioner
Utrusta med en hjälpfunktion för felfri validering:
function isValidGuess(guess) {
return !isNaN(guess)
&& guess >= minNumber
&& guess <= maxNumber;
}
-
!isNaN(guess): kontrollerar omguessär ett giltigt tal. FunktionenisNaN()returnerarfalseför giltiga tal, och!-operatorn vänder detta tilltrue; -
guess >= minNumber: verifierar attguessär större än eller lika medminNumber, vilket säkerställer att det inte är under det tillåtna intervallet; -
guess <= maxNumber: verifierar attguessär mindre än eller lika medmaxNumber, vilket säkerställer att det inte är över det tillåtna intervallet; -
&&: kombinerar alla villkor med hjälp av den logiska OCH-operatorn. Alla villkor måste varatrueför att hela uttrycket ska utvärderas tilltrue.
Förklaring: Funktionen isValidGuess kontrollerar om användarens gissning är ett giltigt tal inom det angivna intervallet (minNumber till maxNumber).
Steg 4: Spellogik
Spelets kärnmekanik via funktionen 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)) { ... }: kontrollerar om det angivna värdet är en giltig gissning med hjälp av funktionenisValidGuess(); -
attempts++;: ökar räknarenattemptsför att hålla reda på hur många gissningar spelaren har gjort; -
const guessNumber = parseInt(guess);: konverterar användarens inmatning från en sträng till ett heltal medparseInt(); -
if (guessNumber === secretNumber) { ... }: kontrollerar om spelarens gissning matchar det hemliga talet. Om så är fallet visas ett meddelande om framgång, resultatet sparas,readline-gränssnittet stängs och spelet avslutas; -
else if (guessNumber < secretNumber) { ... }: informerar spelaren om att det hemliga talet är högre och anroparplayGame()igen för att fortsätta spelet; -
else { ... }: informerar spelaren om att det hemliga talet är lägre och anroparplayGame()igen för att fortsätta spelet; -
else { ... }(efter valideringskontrollen): hanterar ogiltig inmatning genom att be spelaren ange ett giltigt tal inom det tillåtna intervallet och anropar sedanplayGame()igen.
Förklaring: Funktionen playGame utgör spelets huvudloop. Den använder rl.question för att be användaren om en gissning. Om gissningen är giltig kontrollerar funktionen om gissningen matchar det hemliga numret. Om inte, ger den feedback till användaren och fortsätter spel-loopen rekursivt.
Steg 5: Spara spelresultat
Implementera logiken för att spara användarens spelprestationer i filen 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) { ... }: definierar en asynkron funktion med namnetsaveGameResult()som tar emot en parameterresultoch möjliggör användning avawait-nyckelordet i funktionskroppen; -
try { ... } catch (err) { ... }: hanterar potentiella fel som kan uppstå under den asynkrona filoperationen; -
await fs.appendFile('game_results.txt', \${result}\n`);: appends the providedresultfollowed by a newline character to thegame_results.txtfile. Theawait` pausar exekveringen tills filoperationen har slutförts framgångsrikt; -
console.log('Game result saved.');: visar ett bekräftelsemeddelande när spelresultatet har skrivits till filen; -
console.log('Failed to save game result.');: visar ett felmeddelande om filoperationen misslyckas och ett undantag fångas avcatch-blocket.
Förklaring: Funktionen saveGameResult använder fs.promises för att lägga till spelresultatet i en fil med namnet game_results.txt. Den ger återkoppling om det lyckades eller misslyckades att spara resultatet.
Steg 6: Starta spelet
Skapa välkomstmeddelandet och starta spelet:
console.log('Welcome to the Guess the Number game!');
playGame();
Förklaring: Vi visar ett välkomstmeddelande och startar spelloppet genom att anropa funktionen playGame.
Fullständig appkod
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();
-
Rader 1-2: importerar den inbyggda modulen
readlineochfs-modulenspromises-API för asynkrona filoperationer; -
Rader 4-7: skapar ett readline-gränssnitt med namnet
rlför att läsa användarinmatning och visa utdata i konsolen; -
Rader 9-10: definierar minimi- och maximivärden för gissningsintervallet;
-
Rader 12-13: genererar ett slumpmässigt hemligt tal inom det angivna intervallet med hjälp av
Math.random(); -
Rad 14: initierar räknaren
attemptsför att hålla reda på antalet gissningar som spelaren gör; -
Rader 16-18: definierar funktionen
isValidGuess()för att validera att det inmatade värdet är ett tal inom det tillåtna intervallet; -
Rader 20-47: definierar den rekursiva funktionen
playGame()som:- ber spelaren ange en gissning;
- validerar det inmatade värdet;
- kontrollerar om gissningen matchar det hemliga talet;
- ger återkoppling om gissningen är för hög eller för låg;
- fortsätter spelet genom att anropa sig själv igen vid behov;
- sparar resultatet och avslutar spelet när rätt tal gissas;
-
Rader 49-56: definierar den asynkrona funktionen
saveGameResult()som sparar spelresultatet till filengame_results.txtoch hanterar eventuella fel; -
Rad 58: visar ett välkomstmeddelande till spelaren;
-
Rad 59: startar spelet genom att anropa funktionen
playGame().
Sammanfattning
Detta program skapar ett gissningsspel med tal. Spelaren försöker gissa ett slumpmässigt genererat tal inom ett angivet intervall. Spelet ger återkoppling efter varje gissning, håller reda på antalet försök och sparar lyckade resultat till en textfil med hjälp av asynkrona filoperationer.
Tack för dina kommentarer!