MENU
そらいろ
SEとして7年の経験があるそこそこのエンジニア。
スキルセット:C#/VB.net/HTML/CSS/JavaScript/PHP
DB:Oracle/SQLServer他etc
専門はWebアプリケーション。データ分析やRPAにも精通。
当ブログのおすすめテーマはこちら!

【C#】コナミコマンドのロジック作ってみた。分かりやすく解説します!

今回はコナミコマンドを作っていきます。

最近はマインドチックな話題ばかりしていたのでたまには技術者っぽいことをやろうと思って今回の題材を選びました。笑

条件分岐だけでできてしまうので、割と初心者向けの学習としても最適なのではないかと思っています。

僕自身が嵌ったポイントも記述しているので是非参考にしてみください。

コードを利用する際の注意事項

当ブログのコードを利用して起こる不具合については対応できませんのでご了承ください。
本記事の内容を参考にブログ等で情報発信をする場合には、下記のルールを確認頂きたいと思います。

目次

コナミコマンドとは

「コナミコマンド」とは、ゲーム会社のコナミがデバック用に仕込んでいた隠しコマンドのことです。

発売前には削除される予定だったようですが、コマンドを残したまま発売されてしまい世に知られることとなります。

コマンドパターンは様々ありますが、一番有名な型は「上上下下左右左右BA」でしょうか。

最近のゲームはコマンドが仕込まれていることがほぼ無くなってしまっているので若い世代の人は知らないという人も多いのではと思います。

ざっくりと説明するとタイトル画面等で隠しコマンドを入力すると何かが起きるよという裏技の一種ということです。

C#でコナミコマンドを作ってみる

ということで「コナミコマンド」作っていきます。

開発環境は「VisualStudio2017」です。

言語は「C#」、Windowsフォームアプリケーションで作成していきます。

仕様

仕様は下記のような感じです。

仕様
  • キーボードで「上上下下左右左右BA」と入力されたらメッセージを表示する。
  • シンプルにするため、入力の時間制限はなし。
  • 入力値は分かりやすいように画面に表示する。

端的に言ってしまうとコマンド入力でメッセージが出るよというだけです。

ゲームだったらフラグを更新するなどして隠しモードやステージを出現させたりしますね。

完成イメージ

fin_image

コマンド通りに入力したらメッセージ表示するだけです。

シンプルイズベストなんです。デザインは気にしません。笑

コード

プロジェクト名は「SampleForm」としました。

Form1はデフォルトの名称のままです。

この辺りはお好きなように変更してください。

フォームにはコマンド表示用に「lblComand」という名称のラベルを配置しています。

using System.Windows.Forms;

namespace SampleForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            //キーダウンイベント作成
            this.KeyDown += new KeyEventHandler(FormKeyDown);
        }

        //コマンドリスト
        Keys[] aryAnsKeys = new Keys[10]{ Keys.Up, Keys.Up, Keys.Down, Keys.Down, Keys.Left, Keys.Right, Keys.Left, Keys.Right, Keys.B, Keys.A };
        //入力キー格納用
        Keys[] aryInpKeys = new Keys[10];
        //入力回数(配列の添え字)
        int i = 0;

        /// <summary>
        /// 通常のキー押下イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void FormKeyDown(object sender, KeyEventArgs e)
        {
            Comand(e.KeyData);
        }

        /// <summary>
        /// コマンド判定
        /// </summary>
        /// <param name="Key"></param>
        private void Comand(Keys Key)
        {
            //画面に入力文字を表示
            KeysConverter kc = new KeysConverter();
            lblComand.Text += kc.ConvertToString(Key) + "\r\n";

            //配列にキーを設定
            aryInpKeys[i] = Key;

            //コマンドが10個入力された
            if (i == 9)
            {
                //配列を文字列に変換して一致しているか判定
                if (string.Join("", aryInpKeys) == string.Join("", aryAnsKeys))
                {
                    MessageBox.Show("Success");
                }
                //添え字リセット
                i = 0;
                //配列リセット
                aryInpKeys = new Keys[10];
                //画面表示リセット
                lblComand.Text = "";
            }
            else
            {
                //添え字加算
                i++;
            }
        }
    }
}

まず12行目でキーダウンイベントを作成します。

本体は27~30行目になります。

これだけで一先ずキー入力をフォームが受け付けるようになるので、後はロジックを組んでいきます。

今回の肝になるのが「Comand」メソッドです。

とは言ってもやってることは大したことがなく、入力されたキーを配列に詰めていき10番目のキーが入力されたらコマンドの判定を行います。

正解のコマンド自体は16行目で作成済みです。

「string.Join()」を使用すると配列同士の比較が簡単に行えるのでお勧めです。

カウンタが配列の添え字ベースで0始まりになっているので注意です。

これでうまいことコマンドを入力できれば「Success」のメッセージが表示されます。

ボタンが配置されているとキーダウンが正常に取得できない

上記のコードでほぼ動作するのですが、ボタンなどのコントロールが配置されているとキー入力がコントロールに吸収され反応しなくなります。

その場合は下記のようにするといい感じになります。

        public Form1()
        {
            InitializeComponent();
            //キーダウンイベント作成
            this.KeyDown += new KeyEventHandler(FormKeyDown);
            //Formがキーを受け取る設定
            this.KeyPreview = true;
        }

先ほどのコードに「this.KeyPreview=true;」を記述します。

ボタンなどのコントロールが設定されていた場合はそのコントロールにキーイベントを取られてしまうのですが、この設定をすることにより先にフォームへキーイベントを渡すようにできます。

数字やアルファベットのキーであればこれだけで問題ないのですが、十字キーは少し特殊な動きをするので別途下記の記述を書き足す必要があります。

        /// <summary>
        /// 上下左右キーが取れないコントロールにフォーカスが当たっていた際の対応(ボタン等)
        /// </summary>
        /// <param name="keyData"></param>
        /// <returns></returns>
        protected override bool ProcessDialogKey(Keys keyData)
        {
            switch (keyData)
            {
                case Keys.Down:
                case Keys.Right:
                case Keys.Up:
                case Keys.Left:
                    Comand(keyData);
                    break;
                default:
                    return base.ProcessDialogKey(keyData);
            }
            return true;
        }

「ProcessDialogKey」メソッドをオーバーライドします。

上記のように条件分岐を使用し動作を変更させたいキーを、自作した「Comand」メソッドに渡してあげます。

ちなみに独自の動作をさせた場合は「true」をreturnさせる必要があるので注意です。

これは知らなかったので個人的に勉強になりました!

まとめ

今回はコナミコマンドの作成の仕方でした。

「C#」でやったのは個人的に好きだからです。笑

Windowsフォームで隠しコマンド付けるかと言われたらそんなに機会がないような気もするので、あまり需要はないかもしれません。

もしかしたら隠しコマンド以外でも使えるかもしれないので、その場合は結果オーライです。

是非試してみてください。

よかったらシェアしてね!
目次
閉じる