[ペチパーの大冒険] ゲーム制作#34「魔法の国のイベント問題」

2025/08/06

Javascript ゲーム 開発

t f B! P L
eyecatch 忘れ去られそうになりますが、ゲーム開発企画、まだまだ裏でやってますよ。 不定期ですが、思い出すというトレーニングって、なかなか大事だな〜と思いつつ、今回もファンタジー・プログラミング学習問題を考えてみました。

ストーリー「なぜ魔法が発動しないのか?」

ここは魔法の国「コードリア王国」。 あなたは、王国の魔法ギルドに配属された若き魔導士。 今日は、国王より「火の魔法ボタン」を押すことで「ファイアボール」が発動する仕組みを作るように命じられました。 しかし…… ボタンを押しても魔法が発動しないという報告が、街中から届いてしまいます。

あなたが書いた魔法コード(JavaScript)

<script> document.getElementById("magicBtn").onclick = castFireball; function castFireball() { alert("🔥 ファイアボールを放つ!"); } </script> <button id="magicBtn">🔥 ファイアボール発射!</button>

問題

なぜ、ファイアボール魔法が発動しないのか? 一番の原因として考えられるものを選びなさい。

選択肢(魔法の文献より)

1. 魔法陣(button)の呪文 id="magicBtn" が間違っている 2. 魔導書(script)の記述が古くて onclick が使えない 3. 魔導書が魔法陣より先に読み込まれてしまっている 4. ファイア属性の魔法は addEventListener でないと発動しない

答え

正解

3. 魔導書が魔法陣より先に読み込まれてしまっている

解説 : 時空を超える読み込みの罠

魔法のページは、上から下へ順に読み込まれます。 このコードでは、魔導書(<script>)が魔法陣(<button>)の読み込みより前に実行されてしまうため、 document.getElementById("magicBtn") が**null(空)**になってしまいます。 つまり、魔法をかける対象がまだ存在していないのです!

修正方法:魔導書を末尾に置け!

<button id="magicBtn">🔥 ファイアボール発射!</button> <!-- 魔法の読み込みはここに置くべし --> <script> document.getElementById("magicBtn").onclick = castFireball; function castFireball() { alert("🔥 ファイアボールを放った!"); } </script> または、魔導書に defer 属性をつける手もあります。 <script defer> // 中略... </script>

魔導士の学び(ヒント)

教訓 : 魔法対象(HTMLの魔法実行用のscriptタグ)は先に存在していなければならない。 <script> はページの末尾に置くのが安全。(ただし、もっと別の方法もある) onclick でも動くが、より強力な魔法(addEventListener)もある。

あとがき

自分がJavascriptを覚えたての時に、よくやっていた失敗です。 読み込みタイミングと実行タイミングによって、HTMLも順番が存在するという事に気がついて、 プログラミングと同様に、読み込みと実行のタイミングを学びました。 こういうのって、失敗してみて初めて理解できるという事もあるので、読み込み順番で失敗した時に、この魔法の国問題を思い出してもらえればと思います。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ