2018年 4月20日
まだ連日スランプが続いていてほとんど進んで無い。
あれから出来たのと言えば、勢力のユニットを能力ごとに大きい順の順列にピックアップするプログラムと
#deffunc hmf_set int hmf_setn ; 国の部隊配置 no0=0 ; 最高平均値、首領 dim no1,pub ; STR、一列 dim no2,pub ; STR+MAG、二列 dim no3,pub ; MAG、三列 pug=(hmf_setn-1)*pub+1 ; データ先頭 repeat pub,pug ; 順列 un=pud(cnt) : udg=un*udb if un=0 : continue ; 無い if un=-1 : break ; 終端 n0=un(udg+1)+un(udg+2)+un(udg+3)+un(udg+4) ; 総力 n1=un(udg+1) ; 筋力 n2=un(udg+1)+un(udg+2) ; 筋力+魔力 n3=un(udg+2) ; 魔力 if no0<n1 : no0=n1 ; 総力の順列 if no1(cnt)=0 : no1(cnt)=n1 ; 筋力の順列 if no1(cnt)<n1 : n=no1(cnt) : no1(cnt)=n1 : n1=n ; 入れ替え if no2(cnt)=0 : no2(cnt)=n2 ; 筋力+魔力の順列 if no2(cnt)<n2 : n=no2(cnt) : no2(cnt)=n2 : n2=n ; 入れ替え if no3(cnt)=0 : no3(cnt)=n3 ; 魔力の順列 if no3(cnt)<n3 : n=no3(cnt) : no3(cnt)=n3 : n3=n ; 入れ替え loop return
その順列から選択したユニット No.を消すプログラム
#deffunc mfn_del int mfn_delf,int mfn_deln ; 順列の消去 n=mfn_deln ; ユニットNp. if mfn_delf=1 : c=pug ; ヒーロー if mfn_delf=2 : c=10 ; 中立 if no0=n : no0=0 ; 総力 repeat c ; 筋力 if no1(cnt)=n : no1(cnt)=0 : break loop repeat c ; 筋力*魔力 if no2(cnt)=n : no2(cnt)=0 : break loop repeat c ; 魔力 if no3(cnt)=n : no3(cnt)=0 : break loop return
それだけ。
まず考えた要素と言えば、一つの勢力のユニットやアイテム数の上限をどうするか。
なぜかと言えば、沢山設定するとメモリを食うから。
25勢力あったとして、1国最大 500ユニットだとしても 12500だから、12MB?
もし 500ユニットの一つ 7アイテムならアイテムだけで 87500、87MB?
まあ現在のスマホなら 4GB程メモリがあるのだろうし、そもそもグラフィックや音楽で 50MB前後は使う訳だから、もしかしたらそんなでも無いのかも知れないけど、ちょっとメモリの使用量はできるだけ少ない方が色々良いとは思う。
一つのやり方としては全国でユニットテーブルを共有して、つまりデータテーブルは一つだけにして全部で2000ユニットまで、という風にすれば節約できる。
しかしこの場合、国ごとのアルゴリズムで、一勢力一回ユニットテーブルからその勢力のユニットをピックアップしないといけないので、時間がかかると言うのと、プログラムが複雑になるので自信が無い。
そこで考えたのは、1国が養えるユニットの上限を原則 1国 10体、建物の効果で +10体、最大見込み数 20体で、全国 25カ国×20体=理論最大 500体とする事。
1勢力の最大が 500だから ×25国で、12500、12MB。
あ、さっきの数と同じだ、しかしまず最低限この数から考えてみる。
アイテムも同じように考えて、初期 1国の数は 70+城 30で 100として、属領は基本+20の倉庫を建てると+50だったとして、1国最大+70の 100+70*24国だから 1780?
1勢力最大 1780のヒーロー最大数 25で 1780×25=44500、つまり 44MBか・・・・。
それから中立国は今の所 1国だけで攻め込まない、つまり国が増えない予定なので、中立国のユニットは最大で 10体、アイテムはその×7の 70か、まあ 100くらいあれば良いだろう。
つまり総数は ユニットだとヒーロー勢力数×500+中立国×10、アイテムはヒーロー勢力数×1780+中立国×100くらいのデータ数を用意すれば良いかな。
そしてややこしい事に、これは各勢力の所持するユニットNo.やアイテムNo.のテーブルであって、実際のユニットやアイテムのデータとは違う。
実際にこれと同じだけのデータを作ると、さらに×40とか×60等のデータ量になってしまう。
う~む流石にユニットデ-タやアイテムデータは、全体で総数 2000とか 3000とかにするべきだろうか?
と、そんな感じで、一つにはマップ戦略要素という、今まで作った事の無い新しい要素に取り組んでるので、毎度新しい要素の時は時間と根気が要る感じだ。
意外と戦略のアルゴリズムも難しい感じで、例えばユニットをどの国にどれだけ配置するか、持ってる国の隣接する勢力と持ってる戦力の配置バランスはどうするのか、足りない場合はどこから優先して置くのか?
そもそも隣接した国だけの戦力評価ならまだしも、マップ全体を俯瞰した戦略をどうプログラムで実践するのか、サッパリ分からない。
そもそもコーエーゲーム元祖信長の野望の始めから、国の評価なんて隣接意外で実行してるのがあるとは思えないけど、これをもし考えるとしたら将棋の手を考えるプログラムのような複雑な事になるんじゃないだろうか。
それから持ってるアイテムをどのユニットに装備させるか、どのユニットを隊列の何処に置くのか、例えば 3列目は魔法の強いユニットなのか弓の強いユニットなのか、その優先順位は?、武器の射程も考慮して装備させなければいけないけど、足りない場合は射程に満たないアイテムから装備させるのか。
もろもろの要素をどうプログラムしていいのか、これは意外と難しい。
そんな所を思考錯誤中、つまりプログラムの構造、アルゴリズムを考え中なので、そういう時は散歩して歩きながら考えてる事が多い。