2018年3月7日水曜日

ゲームの進展状況56 落下判定1

アニマドロップでは、上にくっつくものがなくなった場合、一気に落下する。これがアニマドロップの醍醐味である。さて…それをプログラミング的に解釈するとどうなるか。

とりあえず1マス目を考えて、これと同じグループ(落ちるのならば一緒に落ちるドロップたちの集合)を算出していく。全方向に放射するような形でこのグループを算出。

そして、その先に何も無いマスがあれば処理中断。それまでこれを繰り返し続ける。全てのマスに対してこれ以上新たに進めなくなったとき、終了。

たとえば1からはじめるとすると、右、右下にあれば一番上の段が11個ならば、次の対象は2と12その次、2に対して3と12,13であり、12に対して1,2,13,22とどんどん増加していくことになる。
まあとりあえず下位のプログラムとして、周囲6マスがつながっているかどうかの判定を行うものを作ってみる。

あ、それと空白の存在を忘れていたので急遽種別と番号を-1として定義。

そして、とりあえずグループ1を視覚化した。
とりあえず今は一番番号の若いものを1とし、それと連結しているものを全て1というグループにするように。ただこれを作るのにそこそこ時間がかかった。なぜか左上から自身に来るときにグループ情報の受け渡しができず、以降が0になるという問題が。
しかしこれはどうやら1行プログラムに抜けがあっただけだったことに気づいて、完成。
上の画像では、もっとも上のBOMBが若い番号なので、それとくっついているもののみが1というグループに属することになる。

なぜグループを作ったりするのか。
それはこれがまとまった落下処理に直結するからである。

実は、落下するかどうかは、グループという言葉でいいかえると
あるグループの中にもっとも上の段と連結しているものが存在しないことが落下することの必要十分条件となるので、もうここまでくればもっとも上の段にグループの数字が存在するか、もしなければそのグループは全部落とす、という簡単な処理に結び付けられる、ということに今気づいた。
まあグループ付けすることは必要だろうという気はしていたが…。

あとはその他のグループに2,3,…と順に振っていけば、ほとんど落下処理の完成は目前。


ちなみにこのグループ化する内部処理は結構難しく、
まず1つグループ名を定めて、まわり6マスが空白でなければそのグループ名と同一になり、それを繰り返すことにより順番にグループが定義されていく。ただしいつかのビンゴのように、定義の順に関する問題があるので、都度グループ情報を更新していっている。ここの説明はかなり難しいし、おまけに言葉で説明するのも相当難しいと思うので省略。
図を描いたら分かりやすいと思うが…。

新しいアニマ系ゲームの作成に伴うブログ移転

https://zisakukarako.blogspot.com/ というブログで、今度は自作カラコロッタをつくってみようということにした。 今度は自作アニマロッタ風ゲームでの反省を生かす予定。 どこまで続くかは不明。 さらに、自作アニマロッタまで作ろうと試みている...