1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

株式会社スピードリンクジャパンAdvent Calendar 2024

Day 20

VSCodeとNode.jsでおみくじを引いてみよう!🎊

Last updated at Posted at 2024-12-19

はじめに

この記事は、株式会社スピードリンクジャパン Advent Calendar 2024 の20日目の記事です。
こんにちは!もうそろそろ今年も終わりますね。
今回は、VSCodeとNode.jsを使って、コーディングのやる気を引き出す「おみくじスクリプト」を作ってみました!

毎日運勢を引いて、楽しくコーディングしませんか?✨

プロジェクトのフォルダを作る

ターミナルでプロジェクト用のフォルダを作成し、その中に移動します。

mkdir my-omikuji
cd my-omikuji

※Node.jsをインストールしておいてください。
Node.jsがインストールされているか確認するには、ターミナルで以下を打ってみてください。

node -v

おみくじスクリプトを作る

VSCodeで新しく omikuji.js というファイルを作り、次のコードを書きます。

// スピナーのパターン(おみくじの読み込み中に回転する記号)
const spinnerFrames = ['|', '/', '-', '\\'];
let spinnerIndex = 0;

// 運勢の一覧(テキスト、絵文字、色)
const fortunes = [
    { text: "大吉: 今日は最高の日になるでしょう!", emoji: "🎊", color: "\x1b[33m" }, // 黄色
    { text: "中吉: 少しラッキーなことがありそう!", emoji: "🎉", color: "\x1b[32m" }, // 緑
    { text: "小吉: 普通の日ですが、ちょっとした発見があるかも。", emoji: "😁", color: "\x1b[34m" }, // 青
    { text: "末吉: あまり運は良くないかも。でも焦らず進みましょう。", emoji: "💦", color: "\x1b[36m" }, // シアン
    { text: "凶: 気を引き締めて、慎重に行動してください。", emoji: "😨", color: "\x1b[31m" }  // 赤
];

// ランダムに1つの運勢を選ぶ
const randomIndex = Math.floor(Math.random() * fortunes.length);
const selectedFortune = fortunes[randomIndex];

// スピナーのアニメーションを開始
const spinnerInterval = setInterval(() => {
    process.stdout.write(`おみくじを引いています... ${spinnerFrames[spinnerIndex]} \r`);
    spinnerIndex = (spinnerIndex + 1) % spinnerFrames.length;
}, 100);

// 1秒後にスピナーを止めて、運勢を表示
setTimeout(() => {
    clearInterval(spinnerInterval);
    showFortuneWithAnimation(selectedFortune.emoji, selectedFortune.text, selectedFortune.color);
}, 1000);

// 絵文字がその場で揺れるアニメーションをする関数
function showFortuneWithAnimation(emoji, text, color) {
    // 揺れる位置のパターン(少し左右に揺れる動き)
    const shakePositions = [' ', '  ', '   ', '  ', ' '];
    let positionIndex = 0;

    // 150ミリ秒ごとに絵文字とテキストを揺らす
    const animationInterval = setInterval(() => {
        process.stdout.write(`\r${emoji}${shakePositions[positionIndex]}${color}${text}\x1b[0m${shakePositions[positionIndex]}${emoji}`);
        positionIndex = (positionIndex + 1) % shakePositions.length;
    }, 150);

    // 2秒後にアニメーションを終了し、最終結果を表示
    setTimeout(() => {
        clearInterval(animationInterval);
        console.log(`\r${emoji} ${color}${text}\x1b[0m ${emoji}`);
    }, 2000);
}

コード解説

1. スピナーのパターン

const spinnerFrames = ['|', '/', '-', '\\'];
let spinnerIndex = 0;

上記のコードでは、spinnerFramesに4つの回転する記号を設定しています。これが「おみくじを引いています…」の表示中にぐるぐる回ります。

2. 運勢リスト

const fortunes = [
    { text: "大吉: 今日は最高の日になるでしょう!", emoji: "🎊", color: "\x1b[33m" }, // 黄色
    { text: "中吉: 少しラッキーなことがありそう!", emoji: "🎉", color: "\x1b[32m" }, // 緑
    ・
    ・
    ・
];

ここでは、5つの運勢がfortunes配列に格納されています。各運勢にはテキスト、絵文字、そして色を指定しています。

3. ランダムに運勢を選ぶ

const randomIndex = Math.floor(Math.random() * fortunes.length);
const selectedFortune = fortunes[randomIndex];

Math.random()を使ってランダムに1つの運勢を選んでいます。これにより、おみくじを引いたときに毎回違う結果が表示されます。

4. スピナーのアニメーション

const spinnerInterval = setInterval(() => {
    process.stdout.write(`おみくじを引いています... ${spinnerFrames[spinnerIndex]} \r`);
    spinnerIndex = (spinnerIndex + 1) % spinnerFrames.length;
}, 100);

スピナーはsetIntervalを使用して、100ミリ秒ごとに記号が切り替わり、回転します。これで「おみくじを引いています…」という表示を動きながら行います。

5. 運勢を表示するタイミング

setTimeout(() => {
    clearInterval(spinnerInterval);
    showFortuneWithAnimation(selectedFortune.emoji, selectedFortune.text, selectedFortune.color);
}, 1000);

スピナーが1秒間表示された後、運勢が表示されます。setTimeoutで1秒後にスピナーを止め、選ばれた運勢を表示します。

6. 運勢のアニメーション

function showFortuneWithAnimation(emoji, text, color) {
    const shakePositions = [' ', '  ', '   ', '  ', ' '];
    let positionIndex = 0;

    const animationInterval = setInterval(() => {
        process.stdout.write(`\r${emoji}${shakePositions[positionIndex]}${color}${text}\x1b[0m${shakePositions[positionIndex]}${emoji}`);
        positionIndex = (positionIndex + 1) % shakePositions.length;
    }, 150);

    setTimeout(() => {
        clearInterval(animationInterval);
        console.log(`\r${emoji} ${color}${text}\x1b[0m ${emoji}`);
    }, 2000);
}

運勢を表示する際、絵文字が揺れながらテキストが表示されるアニメーションを作っています。この部分が少しユニークで面白い動きを加えています。

おみくじを引いてみよう!

ターミナルで以下のコマンドを実行します。

node omikuji.js

すると……🎉 おみくじが引けました!

実行結果は以下のように表示されると思います。

おみくじを引いています... /
🎊 大吉: 今日は最高の日になるでしょう! 🎊
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?