Top >コンソール・アプリケーション集

プニグマ punigma C#

using System;

/// <summary>
/// ローターの機能に対応するクラス
/// </summary>
class Roter
{
    protected int[] mWire = new int[26];    // 結線
    protected int mPosition;                // 位置

    /// <summary>
    /// 結線を設定する
    /// </summary>
    /// <param name="n1">結線する端子(0~25)</param>
    /// <param name="n2">結線する端子(0~25)</param>
    protected void Connect(int n1, int n2)
    {
        // n1 を n2 に、n2 を n1 に結線する
        mWire[n1] = n2;
        mWire[n2] = n1;
    }

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public Roter()
    {
        // ローターの結線を設定します
        // 0~25が、必ず1回、使用されるようにします
        Connect(16, 6);
        Connect(15, 20);
        Connect(0, 21);
        Connect(17, 22);
        Connect(7, 2);
        Connect(5, 11);
        Connect(12, 23);
        Connect(10, 1);
        Connect(8, 24);
        Connect(3, 25);
        Connect(18, 9);
        Connect(13, 4);
        Connect(14, 19);

        // ローターの初期位置を設定
        mPosition = 0;
    }

    /// <summary>
    /// 現在のローターの位置を取得する
    /// </summary>
    public int Position
    {
        get { return mPosition; }
    }

    /// <summary>
    /// 文字を変換する
    /// </summary>
    /// <param name="ch">変換する文字</param>
    /// <returns>変換された文字</returns>
    public char Encode(char ch)
    {
        int n = (ch - 'A' + mPosition) % 26;
        int encoded = 'A' + ((mWire[n] - mPosition + 26) % 26);

        mPosition++;    // ローターを回転

        return (char)encoded;
    }

    /// <summary>
    /// ローターを回転する
    /// </summary>
    /// <param name="n">回転する量</param>
    public void Rotate(int n)
    {
        mPosition = (mPosition + n) % 26;
    }
}

/// <summary>
/// 本体みたいなクラス
/// </summary>
class Punigma
{
    /// <summary>
    /// 画面の表示
    /// </summary>
    /// <param name="roter">ローター</param>
    /// <param name="input">入力された文字列</param>
    /// <param name="encoded">変換された文字列</param>
    static void ShowPunigma(Roter roter, string input, string encoded)
    {
        string str0 = "------------------------";
        string str1 = "Q W E R T Y U I O P   |||";
        string str2 = " A S D F G H J K L    |*|";
        string str3 = "  Z X C V B N M       |||";

        str2 = str2.Replace('*', (char)('A' + roter.Position));

        Console.WriteLine(str0);
        Console.WriteLine(str1);
        Console.WriteLine(str2);
        Console.WriteLine(str3);

        Console.WriteLine("\n{0}    {1}", input, encoded);
    }

    /// <summary>
    /// Main
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        Roter roter = new Roter();
        string input = "";
        string encoded = "";
        bool reset = false;     // 文字列表示のリセット

        // 操作ガイドを表示
        Console.WriteLine("1~9の数字を入力するとローターが回転します。");
        Console.WriteLine("A~Zを入力すると右側に変換した文字を表示します。");
        Console.WriteLine("0を入力するとプログラムを終了します。");

        while (input.Length < 30)
        {
            // 画面を表示
            ShowPunigma(roter, input, encoded);

            ConsoleKeyInfo cki = Console.ReadKey();

            // 文字を入力
            char ch = cki.KeyChar;

            // 小文字なら、大文字に変換
            ch = Char.ToUpper(ch);

            if ('A' <= ch && ch <= 'Z')
            {
                // アルファベットの場合
                if (reset)
                {
                    // 表示をリセット
                    input = "";
                    encoded = "";
                    reset = false;
                }

                input += ch;
                encoded += roter.Encode(ch);
            }
            else if ('1' <= ch && ch <= '9')
            {
                // 数字の場合。ローターを回す
                roter.Rotate(ch - '0');

                reset = true;
            }
            else
            {
                break;
            }
        }
    }
}
PAPER BOWL
NEZEN