LoginSignup
0
0

More than 3 years have passed since last update.

タイマー作成②

Last updated at Posted at 2020-10-25

初めに

投稿をサボってはいけない(戒め)

キー入力

「Mキーが押されたら~、Xキーが押されたら~」と仕様書にある通り、今回のタイマー作成に必須なのがこのキー入力。
フォームアプリケーションならKeyDownメソッドがあるから楽なのですが、今回は自分で作らないといけません。

ReadKey()

調べてみると、このConsoleクラスReadKeyメソッドでキー入力に関する処理を行えそうです。以下、公式サイトから。

オーバーロード
ReadKey()
ユーザーによって押された次の文字キーまたはファンクション キーを取得します。 押されたキーは、コンソール ウィンドウに表示されます。

ReadKey(Boolean)
ユーザーによって押された次の文字キーまたはファンクション キーを取得します。 押されたキーは、オプションでコンソール ウィンドウに表示されます。

・・・要するに
「ReadKeyメソッドは引数なしだと入力したキーを標準出力して、引数ありだと出力するかしないか選べるよ~」
ってことですね。今回はコンソール上に出力する必要はないのでConsole.ReadKey(false)を使うことになりそうですね。
逆でした。Console.ReadKey(true)で標準出力なしだそうです。普通逆だろぉ。

戻り値
押されたコンソール キーに対応する ConsoleKey 定数と Unicode 文字 (存在する場合) を記述するオブジェクト。 また、ConsoleKeyInfo オブジェクトは、1 つ以上の Shift、Alt、Ctrl の各修飾子キーがコンソール キーと同時に押されたかどうかを ConsoleModifiers 値のビットごとの組み合わせで記述します。

何を言ってるのかさっぱりですね。公式は日本語を喋ってほしい。

ConsoleKeyInfo

調べてみると、キー情報が格納されたConsoleKeyInfo構造体が戻り値として渡されるそうです。
・・・そろそろややこしくなってきました。構造体とクラスの違いについては、また後日。

プロパティ
Key
現在の ConsoleKeyInfo オブジェクトが表すコンソール キーを取得します。

KeyChar
現在の ConsoleKeyInfo オブジェクトが表す Unicode 文字を取得します。

Modifiers
コンソール キーと同時に押される 1 つ以上の修飾子キーを指定する、ConsoleModifiers 値のビットごとの組み合わせを取得します。

やっとそれらしきものにたどり着きました。
このKeyCharプロパティを使えば、キー入力時の処理を実現できそうですね!

デモ

今回のキー入力はタイマーというより、むしろユーザー側の操作に関係するので、新たにUserクラスを作成。

Userクラス


using System;

namespace Timer
{
    class User
    {
        public char PressedKey()
        {
            ConsoleKeyInfo keyInfo;
            if (Console.KeyAvailable)
            {
                keyInfo = Console.ReadKey(true);
                return keyInfo.KeyChar;
            }
            else
                return '\0';
        }
    }
}

Timerクラス

using System;

namespace Timer
{
    /// <summary>
    /// タイマー
    /// </summary>
    class Timer
    {
        //private int min = 0;
        //private int sec = 0;
        private User user;

        public Timer()
        {
            user = new User();
        }

        private int Min { get; set; }

        private int Sec { get; set; }
        /// <summary>
        /// 時間設定中の様子を表示
        /// </summary>
        public void printTimerSetting()
        {
            Console.CursorLeft = 0;
            Console.Write("時間を設定してください");
            Console.Write("Sキー:+10秒");
            Console.Write("Mキー:+1分");
            Console.Write("Cキー:リセット");
            Console.Write("Xキー:スタート/ストップ");            
            Console.Write("{0}分:{1}秒", Min, Sec);
        }

        /// <summary>
        /// タイマーの設定を行う
        /// </summary>
        public void settingTime()
        {
            char pressedKey;
            do
            {
                pressedKey = user.PressedKey();
                switch(pressedKey)
                {
                    case 's':
                        Sec += 10;
                        break;

                    case 'm':
                        Min++;
                        break;

                    case 'c':
                        Sec = 0;
                        Min = 0;
                        break;

                    case 'x':
                        Console.WriteLine("Xキーが押されました");
                        break;
                }
                printTimerSetting();
            } while (pressedKey != 'x');
        }
    }
}

Main

namespace Timer
{
    class main
    {
        public static void Main()
        {
            Timer timer = new Timer();

            timer.settingTime();
        }
    }
}

実行画面

実行画面.PNG

画像なので分かりづらいですが、Sキーを押すと10秒、Mキーを押すと1分追加され、Cキーを押すと値がリセット、そしてXキーを押すと「Xキーが押されました」と表示されて終了します。これでタイマーをセットするのは、概ね完成しましたね。

ただ、コンソールに上書き出力する時に文字がちらつくのが気になります・・・。どうにか改善しないと。

長くなりましたが、今回はここまで。
読んでいただき、ありがとうございます。

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