2021/10/07(木) [n年前の日記]
#1 [python][pygame] 道路の自動生成処理の雛形がたぶんできた気がする
Python + Pygame を使って道路の自動生成処理っぽいことができないか試していたけど、最低限の処理と言うか、雛形になりそうな処理は書けたような気がする。道路の幅は一種類だし、曲がる時は直角にしか曲がらないけど…。
動作確認環境は、Windows10 x64 21H1 + Python 3.9.7 64bit + Pygame 2.0.1。
とりあえず、こんな感じに。Spaceキーで再作成できる。
単にグリッド上で1マス1マスを順に塗り潰していくだけなら、ここまで悩まなかったのだけど…。道路のタイルパターンに、横もしくは縦方向を持たせて、交差点や角では別のパターンになる、という条件でドット絵を作ってしまったものだから、面倒臭いことに…。
動作確認環境は、Windows10 x64 21H1 + Python 3.9.7 64bit + Pygame 2.0.1。
とりあえず、こんな感じに。Spaceキーで再作成できる。
単にグリッド上で1マス1マスを順に塗り潰していくだけなら、ここまで悩まなかったのだけど…。道路のタイルパターンに、横もしくは縦方向を持たせて、交差点や角では別のパターンになる、という条件でドット絵を作ってしまったものだから、面倒臭いことに…。
◎ ソースや使用画像。 :
ソースや使用画像は以下。ソースが長くなってしまったので、ファイルを置いておくだけにしておく。CC0 / Public Domain ってことで。
_06_makeroadtilemap3.py
_road_chip.png
_06_makeroadtilemap3.py
_road_chip.png
◎ 仕組みについてメモ。 :
一応、仕組みについて簡単にメモしておく。
タートルグラフィックスっぽく、一筆書きのような感じでグリッドを埋めていくわけだけど…。上下左右のどれかで進む方向を決めて、ランダムな回数分進んだら、乱数で方向を変えて、またランダムな回数分進んで、を繰り返して…。グリッド外に飛び出したら1本分の処理終了、みたいな。
ただ、その場所に何のタイルを置くかで悩んでしまった。上下左右をチェックして、置くべきタイルを決めるわけだけど…。
以下の場合は、接続しないものとして扱えば良い、と気づくまでハマってしまった。まあ、無理矢理繋げてしまう方法もありそうだけど…。
逆に言うと、上記以外の場合は、接続するものとして扱う。
また、何かしらのタイルとぶつかった場合は、そこで処理を打ち切るか、それともそのまま上書きして進むかを乱数で決める。
自分の進む方向と重複したタイルにぶつかった場合は、そこで処理を終了する。そのまま進んでも、既に存在する道路を上書きしていくだけなので…。
大体こんな感じで分かるだろうか…。
タートルグラフィックスっぽく、一筆書きのような感じでグリッドを埋めていくわけだけど…。上下左右のどれかで進む方向を決めて、ランダムな回数分進んだら、乱数で方向を変えて、またランダムな回数分進んで、を繰り返して…。グリッド外に飛び出したら1本分の処理終了、みたいな。
ただ、その場所に何のタイルを置くかで悩んでしまった。上下左右をチェックして、置くべきタイルを決めるわけだけど…。
以下の場合は、接続しないものとして扱えば良い、と気づくまでハマってしまった。まあ、無理矢理繋げてしまう方法もありそうだけど…。
逆に言うと、上記以外の場合は、接続するものとして扱う。
また、何かしらのタイルとぶつかった場合は、そこで処理を打ち切るか、それともそのまま上書きして進むかを乱数で決める。
自分の進む方向と重複したタイルにぶつかった場合は、そこで処理を終了する。そのまま進んでも、既に存在する道路を上書きしていくだけなので…。
大体こんな感じで分かるだろうか…。
◎ 今後の課題。 :
元々は3種類ぐらいの道路幅で生成したいと考えていたので、今後は 2x2, 4x4 の道路幅で生成できないか試してみたいなと…。更に、斜めの道路も入れたい…。もっとも、斜めの道路が入ると接続部分で出現するパターンがめちゃくちゃ増えるので、斜めは無しという前提にしたほうがいいのかもしれないけど…。
道路が無い領域を検出してビルを配置する、という処理もさせたいけど、そのためには検出した領域をイイ感じの矩形に分割していく処理が必要になりそうでもあり…。そもそも歩道も置かないといけないから、領域の一番外側のグリッドを歩道タイルで埋める処理も必要になるよな…。
道路が無い領域を検出してビルを配置する、という処理もさせたいけど、そのためには検出した領域をイイ感じの矩形に分割していく処理が必要になりそうでもあり…。そもそも歩道も置かないといけないから、領域の一番外側のグリッドを歩道タイルで埋める処理も必要になるよな…。
[ ツッコむ ]
以上です。