CDW マップを生成する


2021年 8月 17日
 
 
 このゲーム製作ではマップ生成が難しい所だと思う。

 とにかくやってみよう。


 
 

1、6方向の座標を求める関数を作る

 まず現在の HEXから 6方向の座標を帰す関数(命令)を作る。

 hm2 基のHEX座標 , 調べる方向

 ht1、ht2 = 上下に移動した時の、x座標の変化、ht1=奇数列の時、ht2=偶数列の時

 hm2n1 = 基の HEXNo.
 hm2n2 = 調べる方向(1=右上、2=右、3=右下、4=左下、5=左、6=左上)

 hm2p = 調べた方向の HEXNo.を返す、-1は無し、0はマップの座標で使ってしまっているので -1を使ってる。

 f = 奇数列か偶数列か(0=偶数列、1=奇数列)

 n = 位置種類判定用、主に、奇数列の右端左端か?、偶数列の右端左端か?

 x座標(左右)は -1 +1ずつで良い。

 本ゲームでは MAP座標(HEX座標)を 1次元で扱うため、上下にずれる時は横の長さ(hxb)分 + -する。
 
 
 
2、作りたい国の数だけ MAP上にランダムに点を打つ

 まず国の中心点を決める。

 この時に国同士が一定の距離を持つようにすれば、だま(固まり)になる事が無い。

 r=rnd(mb)+1 でランダムに点を決めます。

 その周辺 2マスに既に点が打ってないか調べます。

 周辺 2マスに点が無ければ、その場所に点を打ちます。

 これを国の数(この場合は 40個)だけ行います。

 各国の国土は ldで持ちます。

 この場合、マップの大きさに対して国の数が多いと、点が打てなくて無限ループします、await 0はその時用に書いてあります。

 もし、この段階で、例えば中心の 20 × 20マスの範囲には点を打てないようにすれば、マップとしてはドーナツ型、リング状のマップを作成したりできると思います。
 
 
 
3、各国の中心点を基に国土を拡大する

 打った点を基に周辺に拡大して行きます。

 拡大するかどうかは確率でランダムに決めます。

 まず最初に国の中心点の回り 6マスに国土を拡張するかどうか乱数で決めます。

 r=rnd(100)+1 : if r>60-rc*10 : continue ; 領土伸ばすか

 なので 100%で最初は 60%の確率で国土を伸ばすか決めます。

 この時、1マスも国土を拡張しない確率もあり、その場合はその国は 1マスという事になってしまいますけど、1マス60% × 6マスなのでまず無いでしょう。

 伸ばした国土を ldに格納し、次に調べる HEXとして ldpに格納します。

 2週目は ldpに格納した HEXNo.を基に、拡張するかどうか決めます、2週目は 50%になります。

 調べるマスの数は ldpecですので、この場合 1週目は 1マス、2週目は 3マス、3週目は 5マスですね。

 こんな風に 3週目は 40%、4週目は 30%と段々確率が低くなり、先細りでも有る程度まとまった国土をランダムに作る事ができます。

 なぜ何週もしてるのかと言うと、各周回毎に各国全てを一通り拡大してます。

 そうする事により、1国だけが極端に大きくなったり、後からの国が広げる領土がなかったりを防いで、均等な大きさになるうようにしてます。

 1つの国に穴が空いていたりするので、元の DiceWarsのマップ作成アルゴリズムとは、また違うのでしょうけど、まあ、穴は湖か山にでもすれば、おもむきがあるんじゃないかと考えてます。
 
 
 
4、隣接国判定

 各国が、どの国と隣接しているかの判定をします。


 
 
 ldb = 国の数

 ldl = 各国の隣接国を登録

 ldlb = 登録数の上限

 
 
 各国の領土のデータは ldで持ってます。

 それを 1マスづつ 6方向探査して、その国と違う国があれば ldlに登録します。
 
 
 
5、全国の接続判定

 全部の国が一つに繋がっているか判定します。

 ここまでだと島国ができてしまいます。

 これだと攻められない国ができてしまいます。

 島は地形的には味があるので、船で攻めるような設定で隣接国を設定してもみようかと考えましたけど、まずどの国が島か判定し、かつその島の大陸に一番近い国と、大陸側の一番近くの国がどれかを判定し、かつどう繋がってるかを表示するという事を考えると、結構ややこしくてめんどくさいので、とりあえず全部の国が繋がってる事にしました。
 
 

 
 
 1国から始めます。

 判定には先ほど作った隣接国のデータ ldlを使います。

 ldl1に 1国に隣接する国を登録し、それを元に順番に接続国を登録していきます。
 
 
 最終的にマップ生成は次のように呼び出します。

 ldb = 国の数 40国なので、要するに接続国が 40国あるか判定してます。

 接続国が 40国に満たない場合は、もう一度マップを作り直しています。
 
 

コメントを残す

メールアドレスが公開されることはありません。