2022年 3月 18日
元のダイス戦略には、1強の国ができると他の弱小国同士では争わない、というルールがある。
このため 1強国が出てもすぐにゲームが終わらない、という面白さがある。
これを作った。
と、書いた所でパソコンが壊れた、そのため現時点で何をやっていたか覚えてない。
さて、要は全国数の何%以上だと第一戦力(勢力)とするか。
これを色々と実験してみた。
50%以上だと既に体勢が決してしまっていて、くつがえり難い。
(マップに数字があるのが強勢力、一時的に視覚化)
30%の場合だと、第一戦力が 30 : 30 : 30で 3勢力できる事があり、第一勢力の変動がめまぐるしく変わって延々と争い続ける、混沌とした情勢になりがち。
同じように 20%では話にならない。
40%だと 40 : 40と二つの勢力が第一勢力になる可能性があるけど、結局これくらいがベストだと判断した。
db_per=40 強勢力とする %値
強勢力判定
#deffunc dpb_cal ; 最大戦力計算 repeat 3 dbpl(cnt)=0 ; 最大戦力プレイヤー loop dbplc=0 ; データNo. dpb=0 ; 全ダイス戦力数 npl=0 ; 第一戦力 nb=0 ; 最大戦力 repeat plb,1 if pfd(cnt)=0 : continue ; 滅んでる dpb+=dp(cnt) ; 全ダイス戦力数 loop repeat plb,1 if pfd(cnt)=0 : continue ; 滅んでる if dp(cnt)<dpb*db_per/100 : continue ; 戦力が%以下 dbpl(dbplc)=cnt : dbplc+ loop return
if dp(cnt)<dpb*db_per/100 : continue ここで n%以上か判定してる。
dbpl(dbplc)の順列に n%以上の勢力プレイヤー No.を格納しておく、40%だと 2勢力存在する可能性がある。
マップ戦略アルゴリズムでの判定呼び出し
#deffunc dbpl_cal int _dbpl_caln ; 強勢力外判定 dbpl_caln=_dbpl_caln ; 判定する国 f=0 ; 強勢力外判定 repeat 3 n=dbpl(cnt) if n=0 : continue ; 強戦力がいない if n=pn1 : continue ; 自国が強戦力 if n=lpd(dbpl_caln) : continue ; 調べる国が強戦力 f=1 ; 強勢力以外 loop return
repeat 3 なのは 30%設定の時のため、使わないと思うけど。
マップ戦略アルゴリズム内での使用例。
; 隣接国が1国の場合 #deffunc eld1_syo int _eld1_syon1,int _eld1_syon2,int _eld1_syon3 eld1n=_eld1_syon1 ; 元の国 eld2n=_eld1_syon2 ; 確認する国 ep1=_eld1_syon3 ; 確認する国のダイス戦力 if ldcd(eld1n)<=1 : return ; 戦力が1 if ldcd(eld1n)-dcbh(dcb)<=ep1 and ldcd(eld1n)<dcb : return ; 戦力が無い ep2=0 ; 攻め込んだ先の隣接する敵国の最大戦力 ldlg=eld2n*ldlb repeat ldlb : eld3n=ldl(ldlg+cnt) if eld3n=0 : break if lpd(eld3n)=pn1 : continue ; 自国 dbpl_cal eld3n : if f=1 : continue ; 強戦力外 if ep2<ldcd(eld3n) : ep2=ldcd(eld3n) ; 最大戦力 loop if ep2<=8 : n=0 : else : n=1 ; 補正戦力 if ldcd(eld1n)-1<ep2+n and ldcd(eld1n)<dcb : return ; 2マス先に対する戦力が無い ; 攻め込む btlf=1 kln1=eld1n kln2=eld2n gosub *battle return
dbpl_cal eld3n : if f=1 : continue ; 強戦力外
の部分ですね、f=1(強勢力外)なら攻め込みません。
まあ、もう忘れてるので、何をやってるのか自分でもよく分からなかったりします。