TypeScript で 数当てゲーム に挑む #TypeScript #CLI

TypeScript で 数当てゲーム に挑む

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

TypeScript で 数当てゲーム に挑む

数当てゲーム とは

プログラミング学習でよく見る 入門用プログラムです

  • ランダムに決められた数を当てる
  • ハズレの入力の場合は、ヒントを出す
  • 当たれば終了

TypeScript で 数当てゲーム コードを書いてみます

  • 標準のライブラリで実装
  • Promise で入力値を待つ
import readline, { ReadLine } from "readline";

type Input = any;
type Ans = number;
type InputValidate = (p: Input, ans: Ans) => string;
type IsMatch = (p: Input, ans: Ans) => boolean;

// 定型文
const msg = "0-100で数字を当てて\n";

// 0 ~ 100
const createAnser = () => Math.floor(Math.random() * (100 - 0) + 0);

// 対話形式の準備, 答えの生成
const init = (ansCreater: () => number) => ({
  rl: readline.createInterface({
    input: process.stdin,
    output: process.stdout
  }),
  ans: ansCreater()
});

// 入力値の取得
const readUserInput = (rl: ReadLine, question: string) =>
  new Promise(resolve => rl.question(question, answer => resolve(answer)));

// 入力値に対して の処理
const inputResponse = async (rl: ReadLine, msg: string): Promise<Input> =>
  await readUserInput(rl, msg);

// 答え合わせ
const isMatch: IsMatch = (input: Input, ans: Ans) => input === ans;

// 入力値に対してのレスポンス
const inputValidate: InputValidate = (input, ans) => {
  if (isNaN(input)) {
    return "まじめに...";
  }

  if (input < ans) {
    return "もっと上";
  }

  if (input > ans) {
    return "もっと下";
  }

  return "あたり";
};

// 出力 これを console.log を ラップしておくと後々 テストしやすいので おすすめ
const put = (p: string, f = console.log) => f(p);

// 実処理
const game = async (rl: ReadLine, ans: Ans) => {
  // 入力 -> Enter をプロミスで待ちつつ
  await new Promise(async resolve => {
    // 入力値受け取り
    const input = parseInt(await inputResponse(rl, msg));
    put(inputValidate(input, ans));

    if (!isMatch(input, ans)) {
      // 再帰 while で待たない
      await game(rl, ans);
    }

    // おしまい
    resolve();
  });
};

// エントリーポイント
const main = async () => {
  const { rl, ans } = init(createAnser);
  console.log(`答え: ${ans}`);
  await game(rl, ans);
  rl.close();
};

main();

TypeScript で 数当てゲーム コードを動かしてみる

まとめ

対話形式は、ライブラリを使った方が簡単ですが
一度自分で作って 雰囲気を掴むのはいいかもしれません