Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

コナミコマンドで動くJavaScriptコードを書いてみる

More than 3 years have passed since last update.

※このエントリーは コナミコマンドで動くJavaScriptコードを書いてみる | SDN Memo を書き直したものです。

はじめに

Webサイトにイースター・エッグ(隠し要素)を仕込んだりするのもたまには面白いなぁという事で、「コナミコマンドをキーボードで打つと何かが起こるスクリプト」を書いてみる事にしました。
コナミコマンドって何だ、という人はWikipediaを見てください。

コナミコマンド - Wikipedia

まずどう組むか考える

お遊びでも作るからには簡単な仕様を決めておかねばなりません。

キーボード入力によるJavaScriptの操作

JavaScriptには keydown / keypress / keyup などのキーボードのキーの操作によって発火するイベントが用意されています。
keydown はキーが押された瞬間、keypress はキーが押されて文字が入力された瞬間(なので矢印キーなどには無反応)、keyup はキーが上がった(キーを放した)瞬間に動くイベントです。
コマンドは基本的に押された瞬間なので keydown を使います。

(function () {
  'use strict';

  document.addEventListener('keydown', function () {
    // 何かやらせる
  });
})();

コマンドのキーコードを取得する

キーボードには特殊なキーをのぞきほとんどのキーに「キーコード」という数字が割り当てられています。
キーコードを確認するための簡単なHTMLでも用意しておきましょう。

キーコード確認
<input type="text" id="keyCode">
<script>
document.addEventListener('keydown', function (ev) {
  document.getElementById('keyCode').value = ev.keyCode;
});
</script>

コナミコマンドは ↑↑↓↓←→←→BA なので、そのキーコードを見ると 38 38 40 40 37 39 37 39 66 65 である事がわかります。
これを配列にして、n番目のコマンドが合っていたらn+1番目のコマンドを確認するといった感じに書きます。

(function () {
  'use strict';

  var
    // コマンドのキーコード
    command = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65],

    length = command.length,
    index = 0;

  document.addEventListener('keydown', function (ev) {
    if (ev.keyCode === command[index]) {
      index++;

      if (index >= length) {
        index = 0;

        // 全てのコマンドを入力したら何かする
      }
    } else {
      // コマンド入力を間違えたらリセット
      index = 0;
    }
  });
})();

これでもいけなくないですが、コマンド入力としてはまだ物足りないかも。

コマンドの入力受付の猶予時間を設定

n秒以内に次のコマンド入力がない場合はコマンド入力をリセットした方がよりそれっぽくなるかと思います。

(function () {
  'use strict';

  var
    // 入力受付時間(1.5秒)
    wait = 1500,

    // standby = false の時は入力を受け付けない
    standby = true,

    // コマンドのキーコード
    command = [38, 38, 40, 40, 37, 39, 37, 39, 66, 65],

    length = command.length,
    index = 0,
    timer = null;

  document.addEventListener('keydown', function (ev) {
    // タイマーのリセット
    clearTimeout(timer);

    // コマンドの確認
    if (standby && ev.keyCode === command[index]) {

      index++;

      if (index >= length) {
        // すべてのコマンドを入力した!

        standby = false;  // 処理中にコマンドを受け付けないようにする
        index = 0;  // コマンドリセット

        /*

          何かしらの処理
          処理が完了したら standby = true に戻す

        */

      } else {
        // 一定時間入力がなかったらリセット
        timer = setTimeout(function () {
          index = 0;
        }, wait);
      }

    } else {
      // コマンドが間違っていたらリセット
      index = 0;
    }
  });
})();

やりました。これで完成です。
あとは好きな処理を書いてページに設置するだけです。

amamamaou
ドット絵を嗜む人です
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away