0
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?

おい磯野、フラッシュ暗算しようぜ

Last updated at Posted at 2025-12-09

歳ッ、取らずにはいられないッ!

今の世の中、人間に不老不死なんてないんです。ただ、歳を取っても努力はできるんです。昔できたのに今できなくなったなぁ、と思っていることも、努力すればもう一度できるようになるかもしれませんよ?

私はですね、最近計算が遅くなったな、と思います。出した答えにちょっと自信が持てなくなってしまっています。であれば、私が理想とする速度で、信頼できる答えが計算できるまで、努力しようではありませんか。そう、フラッシュ暗算を使ってね!!

助けて、ジピえもん

探せばフラッシュ暗算をするためのアプリケーションなんていっぱいありそうですが、こういう場なのでコードを用意します。1から自作は大変なのでChat GPTに助けてもらいましょう。とりあえず雑に「フラッシュ暗算用のC#コードを書いて」と投げます。

フラッシュ暗算

using System;
using System.Threading;

namespace FlashAnzan
{
    class Program
    {
        // =========================
        // 設定ここだけ変えればOK
        // =========================
        // 出題数
        static int QUESTION_COUNT = 10;

        // 1問あたりの数字の個数
        static int NUMBERS_PER_QUESTION = 5;

        // 出てくる数字の最小値最大値
        static int MIN_VALUE = 1;
        static int MAX_VALUE = 99;

        // 数字を表示している時間ミリ秒
        static int DISPLAY_TIME_MS = 700;

        // 数字と数字の間のブランク時間ミリ秒
        static int BLANK_TIME_MS = 300;

        // 数字表示中にキー入力を受け付けるかどうかtrue = 無視 / false = 無視しない
        static bool IGNORE_KEY_DURING_FLASH = true;

        // =========================
        // Main
        // =========================
        static void Main(string[] args)
        {
            Console.OutputEncoding = System.Text.Encoding.UTF8;

            Console.WriteLine("=== フラッシュ暗算 ===");
            Console.WriteLine($"出題数: {QUESTION_COUNT}");
            Console.WriteLine($"1問あたり: {NUMBERS_PER_QUESTION} 個の数字");
            Console.WriteLine($"範囲: {MIN_VALUE}  {MAX_VALUE}");
            Console.WriteLine();
            Console.WriteLine("Enterキーで開始します");
            Console.ReadLine();

            int correctCount = 0;
            Random rnd = new Random();

            for (int q = 1; q <= QUESTION_COUNT; q++)
            {
                int answer = RunOneQuestion(q, rnd);

                Console.Write("合計はいくつ: ");
                string input = Console.ReadLine();

                int userAnswer;
                bool ok = int.TryParse(input, out userAnswer);

                if (!ok)
                {
                    Console.WriteLine("数字で答えてください");
                    userAnswer = int.MinValue; // 明らかに不正解にする
                }

                if (userAnswer == answer)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("正解 🎉");
                    correctCount++;
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine($"不正解 正解は {answer} でした");
                }
                Console.ResetColor();

                Console.WriteLine();
                Console.WriteLine("次の問題に進むには Enter キーを押してください");
                Console.ReadLine();
            }

            Console.Clear();
            Console.WriteLine("=== 結果 ===");
            Console.WriteLine($"正解数: {correctCount} / {QUESTION_COUNT}");
            Console.WriteLine($"正答率: {((double)correctCount / QUESTION_COUNT * 100):F1}%");
            Console.WriteLine();
            Console.WriteLine("お疲れさまでした Enterキーで終了します");
            Console.ReadLine();
        }

        /// <summary>
        /// 1問分のフラッシュ表示を行い、正解の合計値を返す
        /// </summary>
        static int RunOneQuestion(int questionNumber, Random rnd)
        {
            int sum = 0;

            // 問題のイントロ
            Console.Clear();
            Console.WriteLine($" {questionNumber}  /  {QUESTION_COUNT} ");
            Console.WriteLine("数字が順番に表示されますよく覚えてください");
            Console.WriteLine();
            Thread.Sleep(1000);

            for (int i = 0; i < NUMBERS_PER_QUESTION; i++)
            {
                int n = rnd.Next(MIN_VALUE, MAX_VALUE + 1);
                sum += n;

                Console.Clear();
                Console.WriteLine($" {questionNumber}  /  {QUESTION_COUNT} ");
                Console.WriteLine();
                Console.WriteLine($"  {n}");
                Console.WriteLine();

                if (IGNORE_KEY_DURING_FLASH)
                {
                    // 表示中のキー入力を捨てる
                    long start = Environment.TickCount;
                    while (Environment.TickCount - start < DISPLAY_TIME_MS)
                    {
                        if (Console.KeyAvailable)
                        {
                            Console.ReadKey(true); // 入力を読み捨てる
                        }
                        Thread.Sleep(10);
                    }
                }
                else
                {
                    Thread.Sleep(DISPLAY_TIME_MS);
                }

                // ブランク画面
                Console.Clear();
                Thread.Sleep(BLANK_TIME_MS);
            }

            // 全て表示し終わった後の画面
            Console.Clear();
            Console.WriteLine($" {questionNumber}  /  {QUESTION_COUNT} ");
            Console.WriteLine("すべての数字の表示が終わりました");
            Console.WriteLine();

            return sum;
        }
    }
}


そのまま出てきたものをペッと貼り付け。何題解くか、何個足すか、数字の範囲、1つの数字を表示する時間、数字が消えてから次の数字が表れるまでの時間を設定できるらしい。とりあえずデフォルト設定で行ってみますか。

さぁ、勝負と行きますか

実行していきますか。
image.png
おー、わかりやすい。ではEnterを押して開始。
image.png
まずはね、間違えてみましょうかね。そうすると赤文字で不正解と告げられ、答えも出してくれます。
image.png
次に正解してみると、緑文字で正解と告げられます。
image.png
最後まで解き終わると結果が表示されます。なんとも微妙ですね。表示する時間を長くしたり、足す数を少なくして、安定してきたら自分で難しくしていく、というのがいいですね。はい~。

0
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
0
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?