Створення Консольного Додатка-Гри на Вгадування
Свайпніть щоб показати меню
У цьому розділі підготуйтеся підвищити свої навички створення консольних застосунків, занурившись у розробку захопливої гри Вгадай число. Ця інтерактивна гра запропонує гравцям випробувати свою інтуїцію, вгадуючи випадково згенероване число в заданому діапазоні. По ходу роботи ми розглянемо основні поняття, такі як:
- Генерація випадкових чисел;
- Валідація введених даних;
- Взаємодія з користувачем;
- Збереження результатів гри у файл.
Завдання
Уявіть, що ви занурюєтеся у застосунок, який обіцяє захоплення та інтригу. Гравцям пропонується вгадати загадане число в заданому діапазоні. Додаток миттєво повідомляє про кожну спробу та ретельно підраховує кількість зроблених спроб.
Цей практичний приклад — чудова можливість вдосконалити навички створення CLI-застосунків і продемонструвати мистецтво розробки інтерактивних програм.
Результат
Погляньте, як це працює! Нижче наведено GIF, що ілюструє захопливу гру Вгадай число, яку ви будете створювати:
Створення консольного додатка-гри "Вгадай число"
Перед вами два шляхи. Перший пропонує вирушити у подорож без підказок, другий — скористатися корисним гідом для досягнення успіху. Незалежно від того, чи оберете ви сміливий старт, чи структурований підхід, на вас чекає захопливий досвід зі створення функціонального та цікавої консольної гри.
Головний план
- Крок 1: Налаштування та ініціалізація;
- Крок 2: Визначення параметрів гри;
- Крок 3: Визначення допоміжних функцій;
- Крок 4: Логіка гри;
- Крок 5: Збереження результату гри;
- Крок 6: Запуск гри;
- Висновок;
- Повний код додатка.
Крок 1: Налаштування та ініціалізація
Підготуйте "полотно", створивши нову директорію та файл з назвою app.js. У цьому файлі підключаємо необхідні модулі:
const readline = require('readline');
const fs = require('fs').promises;
Створення інтерфейсу Readline:
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
-
readline: надає інтерфейс для зчитування введення та виведення інформації у консоль; -
readline.createInterface({ ... }): створює екземпляр класуreadline.Interface. Приймає об'єкт із властивостямиinputтаoutput; -
input: process.stdin: встановлює потік введення наprocess.stdin, що дозволяє програмі зчитувати введення користувача з клавіатури; -
output: process.stdout: встановлює потік виведення наprocess.stdout, що дозволяє програмі відображати текст у консолі.
Пояснення: Імпортуємо необхідні модулі: readline для взаємодії з користувачем та fs.promises для роботи з файлами. Далі створюємо інтерфейс Readline з іменем rl для обробки введення та виведення.
Крок 2: Визначення параметрів гри
Встановлення мінімального та максимального чисел:
const minNumber = 1;
const maxNumber = 100;
Генерація секретного числа:
const secretNumber =
Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;
-
Math.random(): генерує випадкове число з плаваючою комою в діапазоні від0(включно) до1(невключно); -
maxNumber - minNumber + 1: обчислює діапазон можливих чисел. Додавання1гарантує, що іminNumber, іmaxNumberвключені в діапазон; -
Math.random() * (maxNumber - minNumber + 1): генерує випадкове число між0та обчисленим діапазоном; -
Math.floor(...): округлює згенероване число з плаваючою комою до найближчого меншого цілого, забезпечуючи отримання цілого числа в межах бажаного діапазону; -
... + minNumber: зміщує згенероване число так, щоб діапазон починався зminNumberзамість0.
Ініціалізація лічильника спроб:
let attempts = 0;
Пояснення: Визначення діапазону чисел (minNumber і maxNumber), в якому буде згенеровано секретне число. Секретне число генерується випадковим чином за допомогою Math.random() і присвоюється змінній secretNumber. Змінна attempts ініціалізується для відстеження кількості спроб користувача.
Крок 3: Визначення допоміжних функцій
Забезпечення допоміжною функцією для бездоганної валідації:
function isValidGuess(guess) {
return !isNaN(guess)
&& guess >= minNumber
&& guess <= maxNumber;
}
-
!isNaN(guess): перевіряє, чи єguessкоректним числом. ФункціяisNaN()повертаєfalseдля коректних чисел, а оператор!змінює результат наtrue; -
guess >= minNumber: перевіряє, щоguessне менше заminNumber, тобто не виходить за нижню межу діапазону; -
guess <= maxNumber: перевіряє, щоguessне більше заmaxNumber, тобто не виходить за верхню межу діапазону; -
&&: об'єднує всі умови за допомогою логічного оператора AND. Всі умови мають бутиtrueдля того, щоб весь вираз повертавtrue.
Пояснення: Функція isValidGuess перевіряє, чи є припущення користувача дійсним числом у заданому діапазоні (minNumber до maxNumber).
Крок 4: Логіка гри
Основні механіки гри через функцію 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)) { ... }: перевіряє, чи є введене значення дійсним припущенням за допомогою функціїisValidGuess(); -
attempts++;: збільшує лічильникattemptsдля відстеження кількості спроб користувача; -
const guessNumber = parseInt(guess);: перетворює введене користувачем значення зі строки у ціле число за допомогоюparseInt(); -
if (guessNumber === secretNumber) { ... }: перевіряє, чи співпадає припущення користувача із секретним числом. Якщо так, гра виводить повідомлення про успіх, зберігає результат, закриває інтерфейсreadlineі завершує гру; -
else if (guessNumber < secretNumber) { ... }: повідомляє користувача, що секретне число більше, і знову викликаєplayGame()для продовження гри; -
else { ... }: повідомляє користувача, що секретне число менше, і знову викликаєplayGame()для продовження гри; -
else { ... }(після перевірки валідності): обробляє некоректне введення, пропонуючи ввести дійсне число у дозволеному діапазоні, після чого знову викликаєplayGame().
Пояснення: Функція playGame є основним ігровим циклом. Вона використовує rl.question для запиту у користувача числа для вгадування. Якщо введене число коректне, функція перевіряє, чи співпадає воно із секретним числом. Якщо ні — надає користувачу підказку та рекурсивно продовжує ігровий цикл.
Крок 5: Збереження результату гри
Реалізація логіки збереження досягнень користувача у файл 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) { ... }: визначає асинхронну функцію з назвоюsaveGameResult(), яка приймає параметрresultі дозволяє використовувати ключове словоawaitу тілі функції; -
try { ... } catch (err) { ... }: обробляє можливі помилки, які можуть виникнути під час асинхронної операції з файлом; -
await fs.appendFile('game_results.txt', \${result}\n`);: appends the providedresultfollowed by a newline character to thegame_results.txtfile. Theawait` призупиняє виконання до успішного завершення операції з файлом; -
console.log('Game result saved.');: виводить повідомлення-підтвердження, коли результат гри успішно записано у файл; -
console.log('Failed to save game result.');: виводить повідомлення про помилку, якщо операція з файлом не вдалася і виняток було перехоплено блокомcatch.
Пояснення: Функція saveGameResult використовує fs.promises для додавання результату гри у файл з назвою game_results.txt. Вона надає зворотний зв'язок щодо успішності або невдачі збереження результату.
Крок 6: Запуск гри
Створення вітального повідомлення та запуск гри:
console.log('Welcome to the Guess the Number game!');
playGame();
Пояснення: Відображення вітального повідомлення та запуск ігрового циклу шляхом виклику функції playGame.
Повний код застосунку
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();
-
Рядки 1-2: імпорт вбудованого модуля
readlineта APIfsмодуляpromisesдля асинхронної роботи з файлами; -
Рядки 4-7: створення інтерфейсу readline з іменем
rlдля зчитування введення користувача та виведення інформації у консоль; -
Рядки 9-10: визначення мінімального та максимального значень для діапазону вгадування;
-
Рядки 12-13: генерація випадкового секретного числа у заданому діапазоні за допомогою
Math.random(); -
Рядок 14: ініціалізація лічильника
attemptsдля підрахунку кількості спроб гравця; -
Рядки 16-18: визначення функції
isValidGuess(), яка перевіряє, чи введене значення є числом у дозволеному діапазоні; -
Рядки 20-47: визначення рекурсивної функції
playGame(), яка:- запитує у гравця введення числа;
- перевіряє введене значення;
- перевіряє, чи співпадає спроба з секретним числом;
- надає підказку, якщо число завелике або замале;
- продовжує гру, викликаючи себе знову за потреби;
- зберігає результат і завершує гру, якщо число вгадано;
-
Рядки 49-56: визначення асинхронної функції
saveGameResult(), яка зберігає результат гри у файлgame_results.txtта обробляє можливі помилки; -
Рядок 58: виведення вітального повідомлення для гравця;
-
Рядок 59: запуск гри шляхом виклику функції
playGame().
Підсумок
Ця програма створює гру на вгадування числа. Гравець намагається вгадати випадково згенероване число у заданому діапазоні. Гра надає підказки після кожної спроби, підраховує кількість спроб та зберігає успішні результати у текстовий файл з використанням асинхронних файлових операцій.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат