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

2025/02/03

ゲーム 開発

t f B! P L
eyecatch プログラミング謎解き、実際に作っていて思うことは、「自分が一番やってみたい!」という点です。 でも、答えを先に考えているので、自分で作った問題を解いても面白く感じないかもしれないんですよ。 こういう問題集の書籍が販売されていたらすぐに買っちゃいそうですね。 でも、できる事なら、その場でプログラミングして答え合わせをしてくれるデジタルのコンテンツである方がありがたいかも・・・ というわけで、今回も謎解き問題の続きです。

謎解き7. ランダムな敵生成プログラム

シナリオ

ダンジョンで次に現れる敵をランダムに生成する魔法の巻物を作成する。

問題

モンスターリスト(配列)からランダムな要素を選ぶコードを書く。
# モンスターリスト 1. slime // スライム 2. goblin // ゴブリン 3. dragon // ドラゴン

答え

回答

const enemies = ["slime", "goblin", "dragon"] const randomEnemy = enemies[Math.floor(Math.random() * enemies.length)] console.log(`次の敵: ${randomEnemy}`)

解説

- Javascriptの乱数の生成方法は、Math.random()ですが、0から1の間の少数値が生成されるので、Math.floor()で整数にします。 - enemiesの配列のデータを増やすと、乱数も対応するコードになっています。

謎解き8. NPCのダイアログ分岐プログラム

シナリオ

村の住人(NPC)がプレイヤーの所持アイテムに応じて異なるダイアログを表示する。

問題

所持アイテムに応じて異なるメッセージを表示するコードを書く。
# 持ち物リスト(サンプル) 1. 食べ物 2. クスリ 3. 装備 4. 道具
持ち物リストは、タイミング毎に変更になります。
# NPCリスト 1. パン屋のおばさん 2. 薬屋の主人 3. 武器屋の店主 4. 道具屋の商人
NPCそれぞれの人と話した際の判定とコメントをプログラミングする。

答え

回答

function talk(items, npc){ switch(npc){ case "パン屋のおばさん": return items.includes("食べ物") ? "うまそうなパンを持ってるね。" : "おいしいパンができてるよ!" case "薬屋の主人": return items.includes("クスリ") ? "ケガしても大丈夫だね。" : "ケガをした時の準備ができてないね。" case "武器屋の店主": return items.includes("装備") ? "その剣は強そうだね!" : "旅の準備は整っているかい?" case "道具屋の商人": return items.includes("道具") ? "持ち物は十分だね。" : "何か足りないものがあるんじゃないかい?" } } const full_items = ["食べ物", "クスリ", "装備", "道具"] const full_npc = ["パン屋のおばさん", "薬屋の主人", "武器屋の店主", "道具屋の商人"] const item_count = Math.floor(Math.random() * full_items.length) const items = full_items.map(e => Math.random() > 0.5 ? e : null) const npc = full_npc[Math.floor(Math.random() * full_npc.length)] const message = talk(items, npc) console.log(npc,message)

解説

- 今回持ち物とNPCはランダムで選んでいるが、固定値にしても問題ない。 - itemのランダム取得を.map()関数で行なっているが、乱数で、0.5以上(1/2の確率)で判定している。 - talk関数内は、npcをswitch文で判定して、それぞれ三項演算子で対象の持ち物を持っているかどうかの判定を行なっている。

謎解き9. ダンジョンの構造をランダム生成

シナリオ

プレイヤーが入ってしまったダンジョンは、10個以上の部屋を生成しないと脱出できない構造になっている。 部屋を生成する為に魔法プログラムを作成する。 ただし、同じ部屋を2回通ってはいけない。

問題

部屋は100個あり、その中から10個の部屋をランダムでピックアップして、配列を生成する。

答え

回答

const nums = [] for(let i=0; i<10; i++){ let num = null while(num === null && nums.indexOf(num) === -1){ num = Math.floor(Math.random() * 100) + 1 } nums.push(num) } console.log(nums)

解説

- 1から100までの数字をランダムで10個ピックアップする - 同じ数値がカブってはいけないので、もしrandomでカブリが発生した時は、再度random()を実行するようにwhile処理で行う。

あとがき

今回は少し難易度が高めになりましたが、 実際にビジネスアプリなどでも使うプログラムばかりだったので、触り慣れている人は難なく解けるかもしれません。 あと、回答が少しコンテンツ寄りになっているモノもありますが、文章などはそれぞれの回答でお好きにセットしてもらって大丈夫です。 シナリオとセットで、世界観が保てればゲームとしては正解なんですよね。 何はともあれ、問題を作っているのも何だか楽しくなってきました。 これ続けていくと、ゲームが出来上がるんじゃないか?という錯覚すら感じてきますね。 でも、シナリオ、全然まとまっていませんから!

人気の投稿

このブログを検索

ごあいさつ

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

ブログ アーカイブ