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

2025/02/05

ゲーム 開発

t f B! P L
eyecatch

謎解き13. アイテムのクラフティングロジック

シナリオ

プレイヤーはアイテムをクラフトして特定の武器を作り出す必要がある。

問題

必要な素材と量を満たすかどうかを判定するコードを書く。 素材の必要値メニューと、保持する素材をオブジェクトデータで比較して、全ての素材が条件を満たしているかを確認する。 保持する素材は、ランダムで作り、判定は毎回変わる様にする。

条件

const wood = Math.floor(Math.random() * 10) const iron = Math.floor(Math.random() * 10) const gem = Math.floor(Math.random() * 10) const inventory = { wood: wood, iron: iron, gem: gem } // 保持する素材 const recipe = { wood: 5, iron: 3, gem: 1 } // 素材の必要値メニュー

答え

回答

const wood = Math.floor(Math.random() * 10) const iron = Math.floor(Math.random() * 10) const gem = Math.floor(Math.random() * 10) const inventory = { wood: wood, iron: iron, gem: gem } const recipe = { wood: 5, iron: 3, gem: 1 } const canCraft = Object.keys(recipe).every(key => inventory[key] >= recipe[key]) console.log(inventory) console.log(canCraft ? "クラフト成功!" : "素材が足りません!")

解説

この問題では、プレイヤーが持つ素材がクラフトに必要な量を満たしているかをチェックしました。 - Object.keys を使い、レシピに必要な素材を一つずつ取り出します。 - every メソッドで、すべての素材が条件(所持数 >= 必要数)を満たしているかを確認します。 - 条件を満たしていれば「クラフト成功」、そうでなければ「素材が足りません」と表示します。 この方法を学ぶと、アイテム管理や条件判定のスキルが向上します。

謎解き14. ダンジョンのパス探索(再帰処理による深さ優先探索)

シナリオ

ダンジョンの部屋を探索し、「ゴール」への道を見つける必要がある。

問題

深さ優先探索(DFS)を用いてゴールへの道を見つけるコードを書く。

条件

次の迷路マップを使って、スタートからゴールまで辿り着ける道順を探索する。 let dungeon = [ ["スタート", "道", "壁", "壁"], ["壁", "道", "道", "壁"], ["壁", "壁", "道", "ゴール"], ]; 道順は、プレイヤーが進む座標を配列で作成する。

答え

回答

let dungeon = [ ["スタート", "道", "壁", "壁"], ["壁", "道", "道", "壁"], ["壁", "壁", "道", "ゴール"], ] function findPath(maze, x, y, path = []) { if (x < 0 || y < 0 || x >= maze.length || y >= maze[0].length || maze[x][y] === "壁") return false if (maze[x][y] === "ゴール") { console.log("Path:", [...path, [x, y]]) return true } maze[x][y] = "壁" // Visited let moves = [ [x + 1, y], [x - 1, y], [x, y + 1], [x, y - 1] ] for (let [nx, ny] of moves) { if (findPath(maze, nx, ny, [...path, [x, y]])) return true } return false } findPath(dungeon, 0, 0)

解説

深さ優先探索(DFS)を用いて、迷路の「スタート」から「ゴール」までの道を探索しました。 - 再帰を使い、現在位置から「ゴール」に到達できるかを確認します。 - 進めない場所(壁や範囲外)に到達したら終了し、別の方向に進みます。 - 一度訪れた場所は「壁」に変えて、無限ループを防ぎます。 この問題は、アルゴリズムの基礎である「グラフ探索」を実践的に理解する練習になります。

謎解き15. 動的計画法を用いた宝物の回収最適化

シナリオ

プレイヤーはダンジョン内の宝物を制限時間内で最大限回収したい。

問題

動的計画法を用いて、最大の価値を得る方法を求める。

条件

宝箱は大きさがパターンが3つあり、入っている宝物の個数が違う。
宝箱サイズ1 : 6個 宝箱サイズ2 : 10個 宝箱サイズ3 : 12個
持ち運べる、宝箱は入れる袋の大きさに応じて持ち運べる個数が変わる。 袋の許容サイズは、変数capacityとして、ランダムに指定されるものとする。(1から10の数値が代入される) let capacity = Math.floor(Math.random() * 10) これらの条件の時に、最大個数の宝箱を保持するプログラムを作る。 また、宝箱はたくさんあるため、同じものをいくつ選択しても構わないものとする。

答え

回答

let items = [ { weight: 1, value: 6 }, { weight: 2, value: 10 }, { weight: 3, value: 12 }, ] let capacity = Math.floor(Math.random() * 10) function unboundedKnapsack(items, capacity) { // DPテーブルを初期化 let dp = Array(capacity + 1).fill(0) // DPテーブルを埋める for (let w = 0; w <= capacity; w++) { for (let i = 0; i < items.length; i++) { if (items[i].weight <= w) { dp[w] = Math.max( dp[w], // 現在の最大値 dp[w - items[i].weight] + items[i].value // アイテムを追加した場合の価値 ) } } } return dp[capacity] // 最大値を返す } console.log(unboundedKnapsack(items, capacity))

解説

動的計画法(DP)を用いて、限られた容量内で最大の価値を得る方法を計算します。 - DPテーブル dp を初期化し、配列の行はアイテム、列は容量を表します。 - 各アイテムを選ぶ場合と選ばない場合の価値を比較し、大きい方を選択します。 - 最後に dp の右下(アイテム全体・容量全体)に最大値が格納されます。 この問題を通じて、最適化問題を効率的に解く技術を学べます。

あとがき

もはやかなり難しくなってしまいましたね。 色々なプログラミング手法みたいな名称がでてきましたが、手法は気にしなくても構いません。 答えを見て、プログラムの内容を理解できるかどうかがポイントです。 プログラムを理解するポイントは、一度自分がわかりやすい様に書き直してみたり、 書かれている数値を書き直して値を確認するというのが、非常に理解する手助けになります。 めんどくさがらずにこうした作業ができた人だけが、プログラミングを習得していけるというのも良く分かります。

人気の投稿

このブログを検索

ごあいさつ

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

ブログ アーカイブ