Little Strange Software

スマホアプリの開発を行う LittleStrangeSoftware のブログです。

続々・コンピュータゲームにおける迷路の表現について(まだ駄文)

 どうも!LSSです!!

 

 いまだ、迷路表現について考えています。

 少しはまとまってきました。

 

前々回の記事

 

前回の記事

 

 

…なお、この記事は(前回・前々回もそうですが)またわけのわからない記事になりそうです^^;;;

 ゲームプログラムを作る人は作る前にこんな事を考えてるんだー、的な内容です。

 

 

 要は、

f:id:little_strange:20200414224720p:plain

↑こういうタイプの迷路をどう表現するのがスマートか、という問題。

 

 

 少し考えを整理しました。

 まず、方眼紙のようなマス目の並びがあったとします。

f:id:little_strange:20200428224802p:plain

で、この1マスが1つの座標を示す、とすると、X座標(横何マスめか)とY座標(縦何マスめか)の二次元配列を用意します。

と、ここまでは、薄壁じゃないタイプの迷路でも同じなんですが、さらにその1つのマスを

f:id:little_strange:20200428225054p:plain

こう、4つの領域に区切り、の部分が上の壁になる部分、の部分が左の壁になる部分。

 

で、の領域との領域をそれぞれデータに基づいて、壁なら黒く塗り、通過可能なら白く塗る。

という形で表現したマスを縦横並べると、薄壁迷路になります。
※前回の記事で悩んだのは、その「縦複数×横複数、並べた時に右辺と下辺が空いちゃう」のをなんとかしようとして、5×6とか6×5とかになってしまいましたが^^;

 

 の領域については「その上下左右のすべてが通過可能であれば白、ひとつでも壁があれば黒」で良いかと思います。

 

 の領域はそのマスそのもので、これもデータとして持ち、ゴール地点だったり、宝箱だったり、階段だったり、と考えるほど表現の幅が広がりますね^^

 

 

と、すると、1つのマスにつき、は不要として、の3つの領域についてのデータを持てば事足ります。

 

 

 前回の記事の時に「視覚的にわかりづらい」というコメントをいただきましたが、まったくその通りで、「縦(左)の壁と横(上)の壁を別々の配列で管理」していた事も大きい要因かと思います。

 それを少しマシにするには…「もう一つ配列の次元を増やして、3次元配列にする」という事をいまさら思いつきました。

 

( X座標 , Y座標 , 0~2 ) といった添え字(配列のうち何番目かを指定する数値)で構成し、最後の添え字が0の配列変数には左壁情報、1の配列変数には上壁情報、2の配列変数にはマス情報、って感じです。

 

 具体的には、

f:id:little_strange:20200428231322p:plain

↑のような3×3の迷路だったら、通過可能=0、壁=1、とした場合…

[[1,1,0],[0,1,0],[0,1,0]],
[[1,1,0],[1,1,0],[0,0,0]],
[[1,0,0],[0,1,0],[0,0,0]]

という配列。(マス情報は全て0、一番右と一番下は壁扱いとする、とした場合)
※追記:おっと、これだと(Y,X,マス情報ですね^^;)

 

 

 今んとこ、こんな感じです。

 

 右辺下辺問題は解決していませんが、迷路のスタンスが
「すべて壁にする」か
「ループ迷路にする」か
「超巨大迷宮」か
で対応が変わるところですね。

 

 配列への問い合わせに関数を使用する事で、悩む事も減りそうです。

 

 

 

 

 ところで、LSSがこんな事を考えてる間に、またまたアーシさんの新しい操作可能迷路が公開されました!!

 

 5段階の難易度が用意されています!

 自分も超巨大迷宮の難易度設定には悩みましたが、ライトに楽しみたい人も、ヘビーに楽しみたい人も、ゴールまで遊べる方法ですね^^