[ペチパーの大冒険] ゲーム制作#17「プログラミング謎解き問題 その6」

2025/02/07

ゲーム 開発

t f B! P L
eyecatch

謎解き16. 複数の敵の行動予測(非同期処理の管理)

シナリオ

敵が異なる速度で攻撃してくる。プレイヤーはそれに応じた防御行動を取る必要がある。

問題

非同期処理を使い、複数の敵の行動タイミングを管理するコードを書く。

条件

モンスターの攻撃タイミングは、以下のデータを使用する。 const enemies = [ { name: "Goblin", delay: 1000 }, { name: "Dragon", delay: 3000 }, { name: "Slime", delay: 2000 }, ];

答え

回答

const enemies = [ { name: "Goblin", delay: 1000 }, { name: "Dragon", delay: 3000 }, { name: "Slime", delay: 2000 }, ] async function attackSequence(enemies) { for (let enemy of enemies) { await new Promise(resolve => setTimeout(resolve, enemy.delay)) console.log(`${enemy.name} が攻撃してきた!`) } } attackSequence(enemies)

解説

非同期処理を使い、複数の敵が異なるタイミングで攻撃してくるシナリオを作りました。 - Promise と setTimeout を組み合わせて、一定時間後に敵が攻撃するようにしています。 - asyncとawait を使って、1つの敵が攻撃を終えるまで次の敵を待機させる動作を表現しました。 この問題では、非同期処理や時間制御の基本が学べます。 敵の攻撃が順番でアクセスするタイミングをずらしましたが、同時に攻撃する場合の処理を考えてみてもいいかも。

謎解き17. 文字列操作で呪文を完成させる

シナリオ

古代の呪文の一部が失われている。文字列操作を使って呪文を復元する必要がある。

問題

与えられた文字列を変換して呪文を完成させる。

条件

呪文は次の文字列になっている。 let spell = "abrxxxcdabra" "x"を"@"にすることで、復元する事がわかった。

答え

回答

let spell = "abrxxxcdabxxxra" let completedSpell = spell.replace(/x/g, "@") console.log(completedSpell) // "abr@@@cdab@@@ra"

解説

問題の目的は、文字列操作を用いて失われた呪文を復元することです。 - replace メソッドを使って、不要な部分(xxx)を指定の文字(a)に置き換えています。(複数部分を書き換えるために、"g"オプションを付けるのがミソ。 - 正規表現を使用することで、柔軟にパターンを指定できます。 文字列操作の基本的なスキルを強化する良い練習になります。

謎解き18. 謎の暗号を解読せよ

シナリオ

古代の呪文書には、特定のルールに基づいた暗号が記されているので、指定された暗号文字列を解読する。

問題

以下の関数 decodeMessage を完成させて、指定された暗号文字列を解読してください。

仕様

1. 関数 decodeMessage を作成する。 2. 入力は1つの文字列 message と、数列 key です。 3. message の各文字は、対応する key の値に基づいて変換されます。 ルール:
- 英字の場合: アルファベット順を基に、key の値分シフトする(ループする)。 - 例: 'a' → 'd'(key が 3 の場合)、'z' → 'c'(key が 3 の場合)。 - 数字の場合: key の値分加算し、結果を文字列に置き換える。 - 例: '4' → '7'(key が 3 の場合)。 - その他の文字はそのまま。
4. key の要素数が message より少ない場合、key を繰り返して適用する。 入力例 const message = "hello-world-123" const key = [3, 1, 4] 出力例 decodeMessage(message, key) の結果は次の文字列になります。 "khops-xtupe-457" ヒント
- アルファベットのループ処理には、String.fromCharCode と charCodeAt を使用すると便利です。 - key を繰り返すには、モジュロ演算(%)を活用してください。

答え

回答

function decodeMessage(message, key) { let result = "" for (let i = 0; i < message.length; i++) { const char = message[i] const shift = key[i % key.length] // key を繰り返す if (/[a-z]/.test(char)) { // 小文字アルファベットをシフト const code = ((char.charCodeAt(0) - 97 + shift) % 26) + 97 result += String.fromCharCode(code) } else if (/[0-9]/.test(char)) { // 数字をシフト result += (parseInt(char) + shift).toString() } else { // その他の文字はそのまま result += char } } return result } // テスト const message = "hello-world-123" const key = [3, 1, 4] console.log(decodeMessage(message, key)) // 出力: "khops-xtupe-457"

解説

この問題で学べるポイント 1. 文字列操作(正規表現の活用) 2. ASCIIコードを使ったアルファベットのループ処理 3. 配列のインデックス操作(モジュロ演算) 4. 条件分岐と各種データ型の操作 この問題は、文字列操作や配列の扱いに慣れた中級~上級者向けの演習になります。 解答が正しいか確認してみてください!

あとがき

今回の問題は、難易度がバラバラで、簡単なモノから、超激ムズのモノを作ってみました。 要するに、あまり一貫性がない作り方してるって事かも・・・ もっと局所的なプログラム問題を作った方がいいと思ったから、そのうち作ってみます。

人気の投稿

このブログを検索

ごあいさつ

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

ブログ アーカイブ