2017年 5月30日~6月2日
さて、今回は MAP生成をやって行く事にする。
まずは予定している属性 6つの勢力にそれぞれ対応した地形というものを考える。
左から火山(火)水辺(水)草原(風)山(地)森(光)沼地(闇)という予定。
それにしてもひどいグラだなあ。
グラについてはそのうちエンジェルメーカー氏に描いてもらうとして、あの人も働くだけでほとんど死んでるからなあ、あんまり期待はできない。
とりあえず、まず単純に乱数で表示してみる。
こんな感じだ
これだけでも戦略マップとしては面白く無いので、進入できない地形を作る。
と、言うのは簡単だけどプログラムは多少てこずった。
何が難しいって地形が空白によって分断してるのをどう判別するか分からない。
地形が全部陸続きになってないと、とりあえずゲームをクリアできない。
思考錯誤の末、結局 1マスから隣接するマスを調べていって、全部調べた時に最初に出したマスの総数と隣接で調べたマスの総数が同じなら全部陸続きという方法にした。
もっとスマートな方法があるのかも知れないが、自分にはこれ以上分からない。
最初はもう一つの方法で、真ん中の 13番から隣接するマップを作る方法をやってみたが、どうも地形がダマになって面白く無い。
そこで、始めに一度 25マス全部地形で埋めてから、地形無しをランダムに引き算する事にした、
こうするといい具合に地形に変化が出る。
今は一応引き算するのは 5マスにした。
5マスでもこんな感じにできる
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
/////// 地形生成プログラム /////// #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フォルダ