Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ 推測ゲームコンソールアプリの構築 | Node.jsとExpress.jsによるコンソールアプリケーションの構築
Node.jsとExpress.jsによるバックエンド開発

book推測ゲームコンソールアプリの構築

メニューを表示するにはスワイプしてください

この章では、コンソールアプリケーションのスキルをさらに高めるために、エキサイティングな数当てゲームアプリの作成に取り組みます。このインタラクティブなゲームでは、プレイヤーがあらかじめ定められた範囲内でランダムに生成された数を直感で当てることに挑戦します。進行の中で、以下の基本的な概念についても学びます。

  • ランダムな数値の生成
  • 入力値の検証
  • ユーザーとの対話
  • ゲーム結果のファイル保存

チャレンジ

ワクワクと興味を約束するアプリに挑戦してみましょう。プレイヤーは、あらかじめ定められた範囲内で神秘的に選ばれた数を当てることに招待されます。アプリは各推測に対して即座にフィードバックを返し、試行回数も丁寧に記録します。

この実践的な例は、CLIアプリ構築のスキルを磨く絶好の機会であり、インタラクティブなプログラム作成の技術を示します。

完成アプリ

実際の動作を確認しましょう!下記のGIFは、あなたが作成するエキサイティングな数当てゲームアプリの様子を示しています。

数当てゲームコンソールアプリの構築

2つの道が用意されています。1つ目は、サポートなしで自分の力で挑戦する道、2つ目は成功をサポートするガイド付きの道です。どちらを選んでも、魅力的で実用的なコンソールアプリを作り上げる貴重な体験が待っています。

マスタープラン

  • ステップ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(ユーザーとの対話用)と fs.promises(ファイル操作用)をインポートします。次に、入出力を処理するための Readline インターフェース rl を作成します。

ステップ2:ゲームパラメータの定義

最小値と最大値の設定:

const minNumber = 1;
const maxNumber = 100;

シークレットナンバーの生成:

const secretNumber =
  Math.floor(Math.random() * (maxNumber - minNumber + 1)) + minNumber;

試行回数カウンターの初期化:

let attempts = 0;

説明:秘密の数が生成される範囲(minNumbermaxNumber)を定義します。秘密の数は Math.random() を使用してランダムに生成され、secretNumber に代入されます。attempts 変数はユーザーの試行回数を記録するために初期化されます。

ステップ 3: ユーティリティ関数の定義

正確なバリデーションのためのユーティリティ関数:

function isValidGuess(guess) {
  return !isNaN(guess)
    && guess >= minNumber
    && guess <= maxNumber;
}

説明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();
    }
  });
}

解説: 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.');
  }
}

説明: 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();
すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  8

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  8
some-alt