2017年 5月30日~6月2日
さて、今回は MAP生成をやって行く事にする。
まずは予定している属性 6つの勢力にそれぞれ対応した地形というものを考える。

左から火山(火)水辺(水)草原(風)山(地)森(光)沼地(闇)という予定。
それにしてもひどいグラだなあ。
グラについてはそのうちエンジェルメーカー氏に描いてもらうとして、あの人も働くだけでほとんど死んでるからなあ、あんまり期待はできない。
とりあえず、まず単純に乱数で表示してみる。
こんな感じだ
これだけでも戦略マップとしては面白く無いので、進入できない地形を作る。
と、言うのは簡単だけどプログラムは多少てこずった。
何が難しいって地形が空白によって分断してるのをどう判別するか分からない。
地形が全部陸続きになってないと、とりあえずゲームをクリアできない。
思考錯誤の末、結局 1マスから隣接するマスを調べていって、全部調べた時に最初に出したマスの総数と隣接で調べたマスの総数が同じなら全部陸続きという方法にした。
もっとスマートな方法があるのかも知れないが、自分にはこれ以上分からない。
最初はもう一つの方法で、真ん中の 13番から隣接するマップを作る方法をやってみたが、どうも地形がダマになって面白く無い。
そこで、始めに一度 25マス全部地形で埋めてから、地形無しをランダムに引き算する事にした、
こうするといい具合に地形に変化が出る。
今は一応引き算するのは 5マスにした。
5マスでもこんな感じにできる
ソース
/////// 地形生成プログラム ///////
#include "hsp3dish.as"
gosub *main : end
#deffunc map_check ; 6回同じ処理なので一つにまとめ
if map(m)=0 : return ; 地形無し
f=0
repeat 25 : cn=cnt
if mf(cn)=0 : break ; 登録はもう無いよ
if mf(cn)=m : f=1 : break ; 登録済み
loop
if f=1 : return ; 登録済み
mf(cn)=m ; チェック済みに登録
return
*main
screen 0,640,360
celload "hex_104_90_map.png",1
celdiv 1,104,96
dim hxyd,2,26 ; HEX座標変数(0=x、1=y)
bload "hxyd.dat",hxyd ; HEX座標データ読み込み
dim txyd,4,26 ; タップ座標変数(0=tx1、1=ty1、2=tx2、3=ty2)
bload "txyd.dat",txyd ; タップ座標データ読み込み
randomize
repeat ;------- マップ生成 -------
dim map,26
; マップ(0=無し、1=火山、2=水辺、3=草原、4=山、5=森、6沼)
dim mf,26 ; 生成チェックフラグ
mapg=0 ; いくつ地形を作ったか
mfn=0 ; 次に処理する MAP No.
repeat 25,1 ; MAPを地形で埋める
r=rnd(6)+1 : map(cnt)=r
loop
repeat 5 ; ランダムに5つ地形を消す
r=rnd(25)+1
map(r)=0
loop
bn=0 ; 地形無しのマス数
repeat 25,1
if map(cnt)=0 : bn+
loop
mapg=25-bn ; 地形有りのマス数
repeat 25,1 ; 始めるマップの位置
if map(cnt)>0 : mapn=cnt : mf(mfn)=mapn : mfn+ : break
loop
f=0
repeat 25 ; 隣接マップ順に順次確認処理-------------------------------
repeat 1 ; 上はあるか -------------------------
if mapn\7=1 or mapn\7=5 : break ; 上が無い地形なら終わり
m=mapn-1 ; 上のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 右上はあるか -----------------------
if mapn\7=1 or mapn>=22 : break ; 右上が無い地形なら終わり
m=mapn+3 ; 右上のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 右下はあるか -----------------------
if mapn\7=4 or mapn>=22 : break ; 右下が無い地形なら終わり
m=mapn+4 ; 右下のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 下はあるか -------------------------
if mapn\7=0 or mapn\7=4 : break ; 下が無い地形なら終わり
m=mapn+1 ; 下のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 左上はあるか -----------------------
if mapn\7=1 or mapn<=4 : break ; 左上が無い地形なら終わり
m=mapn-4 ; 左上のマップ座標
map_check ; マップチェックと書き込み処理
loop
repeat 1 ; 左下はあるか -----------------------
if mapn\7=4 or mapn<=4 : break ; 左下が無い地形なら終わり
m=mapn-3 ; 左下のマップ座標
map_check ; マップチェックと書き込み処理
loop
mapn=mf(mfn) : mfn+ ; 次にチェックする地形
if mapn=0 : break ; が無いなら終わり
if mapg=mfn : f=2 : break ; チェック数とマス最大数が同じなら全部繋がってるとみなして完成
loop
if f=2 : break
loop
redraw 0;------- 表示 -------
color 0,0,0 : boxf : color 255,255,255
gmode 2
repeat 25,1
x=hxyd(0,cnt) : y=hxyd(1,cnt)
pos x,y : celput 1,map(cnt)+5 ; HEX描画
n=map(cnt)
pos x+86,y+38 : mes n ;map(cnt) ; マス番号表示
pos 10,10 : mes bn
loop
redraw 1
repeat
stick k,,0 : if k=128 : break
await 1000/20
loop
return
6角形 HEXの隣接マスの移動座標計算の仕方。
上は-1、下は+1だとして、右上は必ず+3、右下は必ず+4、左下は-3、左上は-4になる。
これはこのマップが縦 4+3で 7で一周するから。
もちろん座標の取り方がx,yのようなものなら、別のやり方になるだろう。
外周の空白に隣接するマスは例外設定を設けている if mapn\7=0のようなものだ。
これは 7の倍数の HEX番号の上は無い事を意味します。
データとソースのセットをダウンロード出来るようにするので、参考にしたい人はどうぞ。
hex_bulid ←zipフォルダ