配列の破壊を防ぐ

  今回は不具合が起きているマップデータを改良します。

~問題のバグ~

A
 どんどん更新していきます。

B
↓↓↓

C
↓↓↓

D
↓↓↓

E

 どんなバグかというと、前回のマップのデータを引き継いでしまっているんです。このゲームはランダムでマップを表示させて攻略していくという趣旨のもと作成しています。そのマップデータは元からプログラム内に保存されている2次元配列データを使用しています。この画像では、過去にランダムで配置したアイテムや階段のデータを配列が記憶してしまっているため、その記憶したデータをもとにまた階段やアイテムを生成しているのです。画像C、Eを見てください。このゲームはアイテムを配置する際に階段は1つしか配置しないようにしていますが、画像Eでは階段が2つ配置されてしまっています。また、右上の階段と左上のリンゴの位置が同じであることからこの現象がよくわかると思います。

~直していく~

 このバグの根幹には元の配列に上書き(破壊)してしまうというのが原因だと推測しました。それに伴い、元のデータAを複製してデータBを作成し、データBに対して配列の変更作業を行うようにすればよいと考えました。

 これを考えたら、次はネット上で解決策を調べまくります。そこで参考になるサイトを見つけました。

こちらのサイトです。→ https://qiita.com/Tatamo/items/444969a7ff2fbba30479

 このサイトによると、どうやら私が行いたいコピーは、配列に対しては2種類あるようです。それは浅いコピーと深いコピーです。これは、配列の構造によるのですが、普通の配列だと浅いコピーとして扱われるようです。深いコピーは、多重構造の配列に用いられます。私が行いたいのは2次元配列のコピーなので、深いコピーに該当します。

 ここまで来たら残りはJavaScriptで深いコピーのやり方を検索するだけです。

 [Js 配列 深いコピー] [検索]

こちらのサイトが参考になりました。
 深いコピーをしたい場合、StructureCloneというメソッドを使用するのが良いみたいです。どうやらこのメソッドは最近になって標準搭載されたようです。ラッキー^^

 その後、色々と改良を加えたプログラムがこちらになります。

 主に変えたのは171行目と175行目です。
 171行目で変数onmap(表示されているマップという意味)を追加しました。
 175行目ではonmapにmap[stage]を代入しています。この操作によって、ランダムに選ばれたマップの配列が複製されます。
 その他、map[stage] と書いたものを全て onmap に変更しました。これによって、複製された配列にランダムに階段やアイテムが表示されるようになります。
 以下が、改良後のマップになります。

おわり

 今回はマップの不具合を直しました。バグが発生した当初は絶望しましたが、思ったより簡単に早く直せてよかったです。
 少しずつではありますが、ゲームが理想の状態に近づいているのがわかります。ここまでくると上手く動かない時があっても楽しめますね。次はどうしましょうか。選択ウィンドウを作るか階層移動画面を作るかですね。

参考文献

@Tatamo . ”もう一度理解する、JavaScriptの配列とコピー” . Qiita . 
        (2024-07-02参照)

akkie.i . "【JacaScript】オブジェクトのディープコピーが標準機能で使えるようになりま            した" . Zenn . 2023-04-07 .
         https://zenn.dev/akkie1030/articles/js-structured-clone . (2024-07-02参照)

コメント

コメントを投稿

このブログの人気の投稿

自己紹介と作成するゲームの説明

ランダムにモンスターを出現させる

マップをランダムで生成する