fireship-io / javascript-millionaire

Who wants to be a JavaScript Millionaire terminal game
259 stars 58 forks source link

Refactored the code #7

Open Harsh-0-7 opened 1 year ago

Harsh-0-7 commented 1 year ago
#!/usr/bin/env node

import chalk from "chalk";
import chalkAnimation from "chalk-animation";
import figlet from "figlet";
import gradient from "gradient-string";
import inquirer from "inquirer";
import { createSpinner } from "nanospinner";

let playerName;
const sleep = (ms = 2000) => new Promise((r) => setTimeout(r, ms));
async function welcome() {
    const rainbowTitle = chalkAnimation.rainbow(
        "Who wants to be javascript millionaire?"
    );
    await sleep();
    rainbowTitle.stop();
    console.log(`
    ${chalk.bgBlue("HOW TO PLAY")} 
    I am a process on your computer.
    If you get any question wrong I will be ${chalk.bgRed("killed")}
    So get all the questions right...
    `);
}

async function handleAnswer(isCorrect) {
    const spinner = createSpinner("Checking answer...").start();
    await sleep();

    if (isCorrect) {
        spinner.success({ text: `Nice work ${playerName}. That's a legit answer` });
    } else {
        spinner.error({ text: `💀💀💀 Game over, you lose ${playerName}!` });
        process.exit(1); //1 is for error,0 is for success
    }
}

async function askName() {
    const answers = await inquirer.prompt({
        name: "player_name",
        type: "input",
        message: "What is your name?",
        default() {
            return "Player";
        },
    });

    playerName = answers.player_name;
}

function winner() {
    console.clear();
    figlet(`Congrats , ${playerName} !\n $ 1 , 0 0 0 , 0 0 0`, (err, data) => {
        console.log(gradient.pastel.multiline(data) + "\n");

        console.log(
            chalk.green(
                `Programming isn't about what you know; it's about making the command line look cool`
            )
        );
        process.exit(0);
    });
}

async function question(index) {
    console.log("\n");
    const answers = await inquirer.prompt({
        name: "question",
        type: "list",
        ...mcqs[index],
    });

    return handleAnswer(
        answers.question === mcqs[index].choices[mcqs[index].answer]
    );
}
let mcqs = [
    {
        message: 'What is x? var x = 1_1 + "1" + Number(1)\n',
        choices: ["4", '"4"', '"1111"', "69420"],
        answer: 2,
    },
    {
        message: "JavaScript was created in 10 days then released on\n",
        choices: [
            "May 23rd, 1995",
            "Nov 24th, 1995",
            "Dec 4th, 1995",
            "Dec 17, 1996",
        ],
        answer: 2,
    },
    {
        message: `What is the first element in the array?\n\t['🐏', '🦙', '🐍'].length = 0\n`,
        choices: ["0", "🐏", "🐍", "undefined"],
        answer: 3,
    },
    {
        message: "Which of the following is NOT a primitive type?\n",
        choices: [
            "boolean",
            "number",
            "null",
            "object", // Correct
        ],
        answer: 3,
    },
    {
        message: `JS is a high-level single-threaded, garbage-collected,
        interpreted(or just-in-time compiled), prototype-based,
        multi-paradigm, dynamic language with a ____ event loop`,
        choices: ["multi-threaded", "non-blocking", "synchronous", "promise-based"],
        answer: 1,
    },
];

async function main() {
    console.clear();
    await welcome();
    await askName();

    for (let i = 0; i < mcqs.length; i++) {
        await question(i);
    }
    winner();
}
// Run it with top-level await
main();