この記事は公開されてから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 で 数当てゲーム コードを動かしてみる
まとめ
対話形式は、ライブラリを使った方が簡単ですが
一度自分で作って 雰囲気を掴むのはいいかもしれません