謎解き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処理で行う。
0 件のコメント:
コメントを投稿