地形生成を試みる


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フォルダ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です