■ はじめに
前回、マップ自動生成をやってみましたが思ったほど変わり映えしなかったので、今回はマップ複雑化にチャレンジします。
マップを複雑化する方向には、2つの方向性があります。
①地図要素の種類をふやす
②マップ自体のサイズを変える
取り敢えず②が簡単で効果が期待できるので、先ずやりたいと思います。足らなかったら①をやって見ます。
今の16×16というサイズはスマホ縦置き状態で、Colab実行結果をみるのに都合が良かったのです。
しかし、最終的にはgifアニメに変更したいので、サイズアップを断行します。
今回は、サイズアップ(32×32)による
①道の数を4本にしてマップを複雑化する
②サイズアップに合わせた人配置数の増加
を行います。
■マップ面積4倍なので交差点も4倍にした
マップ面積が4倍あるので、交差点が4つセットできます。この交差点間隔を変えればマップを多様化できます。
指定構造は同じですか、(row,col)で指定していた所を、配列にして(row(i),col(j))とします。
こうしておくと、過去にちゃんと動いたルーチンを再利用しやすく、更にどの交差点の話をしているかを指定しやすいのでオススメします。
更に、広げたマップへの受/A/B/Cの配置と、このA*結果を使うことで将来の難易度コントロールに対応できます。
■広くなったので人も増やします
現在、人発生の最大数を10人に固定して、マンハッタン距離2以内は発生不可という条件で多少の変化が起こるという仕組みでした。
人の発生は、マップの歩道と横断歩道でマンハッタン距離2以内は発生不可です。
この条件で最密に詰めてみると、こんな感じになります。
■■■■■■■■■■■
・++◎+++・・・・
・・+++◎++・・・
◆◆◆◆◆◆◆◆◆◆◆
ここで、各記号の示す意味は、
◎:人
・:歩道
+:マンハッタン距離2以内の歩道
■:建物
◆:道
つまりは、人を図のように置くと、空き場所4カ所あたり人1人が最密になりますね。
後は誤差ですか、受/A/B/Cへの入口に人が立たれると困るので、その4コマをひいて、人発生の最大値は、
h_max=x/4-4 となります。
この値を最大値としてランダム関数で人の出現数を計算します。
■エージェントを動かして動きを確認
マップのサイズアップと人配置の変更が出来たので、エージェントを走らせて確認します。
(GitHubリンク)
github.com/logicmaker256-prog/auto_large_map/blob/main/large_map.py
正常には動作するのですが、マップをサイズアップしたので見づらいこと、見づらいこと。
いよいよ、Gifアニメ化を真剣に考えないと駄目ですね。
■結果:
マップを32×32に、サイズアップした自動生成の仕様書がコチラになります。
(GitHubリンク)
github.com/logicmaker256-prog/auto_large_map/blob/main/large_map_doc.txt
サイズアップ自体はそんなにむづかしくなかったですが、単にサイズアップだけするとマップが崩れたりするので注意が必要ですね。
今回は交差点の数を1つから4つにしたのですが、モチロンこっちを可変にして複雑化する方向もありますが苦労の割に対したマップにならないという判断です。
僕は交差点の支持を配列化したかったので、現状の形になってます。
この辺りは、各自の考え方ですかね。
■ 今回の学び:
今回の学びは、私的な選択にもなるんですが、
「設計を拡張するときは、動作実績のある部品を拡張する形にする」
ですかね。前にイメージ通りの交差点を生成したルーチンを配列化しただけの構造で本コードの大部分はできました。
モチロンこの辺は、コーディングがどれくらい好きかによるので、この学びは僕専用という事で。
■まとめ
今回は、マップの複雑化にチャレンジという事で、サイズアップによる複雑化を簡単にやる事にトライしてみました。
複雑化したので、動作チェックで、
「なんじゃ、こりゃ」
になってます。
途中でも言ってますが、次回は、いよいよGifアニメ化に真面目に取り組む回になりそうです。
