マップをランダムで生成する
今回はマップをランダムで生成するプログラムを作成します。
~説明~
更新ボタンを押します。
別のマップが表示されます。また更新ボタンを押します。
~プログラムの説明~
今回のプログラムは、既にあるマップデータからランダムで一つのマップを選択するようなプログラムになっています。本当は完全にランダムで画面上に生成したいとは思うのですが、現在の私の知恵と技術では無理がありました。厳しいって。
173 function mapselect() {
174 stage = Math.floor(Math.random() * map.length);
175 px = Math.floor(Math.random()*map[stage].length);
176 py = Math.floor(Math.random()*map[stage].length);
177 if (map[stage][py][px] == 0 || map[stage][py][px] == 2) {
178 mapselect();
179 }
180 else {
181 return;
182 }
上記が、今回作成した主なプログラムになります。
まず、ゲームが始まるとinit関数が発動します。init関数の中身は以下になります。
185 function init() {
186 cv = document.getElementById("field");
187 gc = cv.getContext("2d");
188 window.addEventListener("keydown", fieldkeydown);
189 mapselect();190 fieldpaint();
191 }
189行目に mapselect(); があります。これによって、init関数が発動した際に、関数mapselectを発動するようにしています。
では、mapselect関数の中を見ていきます。
まず、174行目で6つのマップデータの中からランダムでステージを1つ選びます。
Math.random により、0以上1未満の乱数を決定します。その値に配列map の中にある要素の数(今回は6)を掛けることによって、乱数は0以上6未満となります。この時、値は整数ではなく、少数が含まれてとても細かい値になってしまいます。
Math.floor で小数点以下を切り捨てします。すると、ランダムで作成される値は0~5となります。これによって、選ばれた値のマップが表示されるようになります。
175,176行目ではプレイヤーの初期位置をランダムで決定しています。その際、位置をダンジョン内に表示させるために、177~182行目の条件をプログラムします。
条件の内容は「プレイヤーの初期位置がステージの外(0)または通路(2)だった場合、 mapselect関数を発動する、それ以外は条件分岐から抜ける」となります。
これによって、条件から抜けた場合に表示されるマップが確定することとなります。
以上が今回のプログラムの説明です。
おわり
いかがでしょうか。当初ローグライクを作ろうと考えたときはマップをランダムで表示させるにはどうすればよいか不安でしたが、いざ考えてみると意外と形になるものなんですね。本当は、マップデータを作成するのが大変なのでロード時、移動時にその場で生成するようにしたいのですが、如何せんどうすればよいのか全く見当がつかない。誰か良い案があったら是非教えてほしいです。
今後は、マップ移動の仕組みづくり、コマンド(アイテム、イベント選択)画面の表示、マップにランダムでアイテムや敵を表示するプログラムを作っていきたいと思います。
コメント
コメントを投稿