2018年 9月12日
なんと更新が 1ヶ月以上も伸びてしまいました。
とにかく暑くてダウンしてました、冷房あっても暑い時はダメですね、赤外線とかなんでしょうか?
運動もできなくて体がなまりますしね。
さて、ようやく CPUヒーロー勢力のアルゴリズムが一応形になりました。
これだけじゃ何やってるのか分からないと思うけど、まず右上の緑が左下に攻め込んで負け、下真ん中の紫が隣に攻め込んで勝ち、左下の赤が攻め込んで勝ち。
HEX内の mp=その国の戦力、hdは現在処理中の勢力の隣接国の脅威値、真ん中の赤いのはマップNo.。
HEXの枠に色の付いてるのがヒーロー勢力で、無いのは中立国でジッとしてるだけで攻め込まない。
問題なのは自国と隣国の戦力評価と残戦力比較、攻め込んだ後の再配置とか、今回も結構大変だった。
では CPU勢力のアルゴリズムソースを。
*strategy ; 英雄勢力の人材とアイテムの発見と配置、戦略
repeat plb : pn=hap(cnt)
if pn=0 : continue ; 順列に無い
if hf(pn)=0 : continue ; 勢力が滅んでる
; 人材とアイテムの発見
repeat 25,1 : m=cnt
if mpl(m)!pn : continue ; 勢力国では無い
un_fd m ; 人材発見
if un>0 : hper_set pn,un ; 順列セット
it_fd m ; アイテムの発見
if in>0 : hiper_set pn,in ; 順列セット
loop
if hf(pn)=1 : gosub *map_main : continue ; プレイヤー
; 隣接国脅威値を算出
repeat 25 : hdp(cnt)=0 : hdn(cnt)=0 : loop; 脅威値をリセット
repeat 25,1 : m=cnt ; その国の脅威値を評価
if mpl(m)!pn : continue ; 勢力国では無い
repeat 6,1
n=hmv(m,cnt) ; 隣接する国があるか
if n=0 : continue ; 地形が無い
if mpl(n)=pn : continue ; 勢力国
if hdn(m)<mp(n) : hdn(m)=mp(n) ; 一番大きな値
loop
pn1=m
repeat 25 ; 脅威国順列のソート
if hdp(cnt)=0 : hdp(cnt)=pn1 : break ; 空白なら入れて終わり
if hdn(pn1)<=hdn(hdp(cnt)) : continue ; 値比較
pn2=hdp(cnt) : hdp(cnt)=pn1 : pn1=pn2 ; 入れ替え
loop
loop
pmu_rst pn ; ユニット配置解除
peq_rst pn ; 装備解除
hrs_copy ; 英雄のユニット操作順列コピー
his_copy ; 英雄のアイテム操作順列コピー
; 領主の配置
hrs5c=0
repeat 25,1 : m=cnt ; 領主配置
if mpl(m)!pn : continue ; 勢力国では無い
repeat hub
if hrs5c=hub : break
un=hrs5(hrs5c) : hrs5c+
if un=0 : continue
mu(m*10)=un : hrs_del un : break ; 領主配置
loop
loop
; 装備と列の順列のセット
repeat hub ; 列の順列をリセット
hrt1(cnt)=0 : hrt2(cnt)=0 : hrt3(cnt)=0
loop
hrt1c=0 : hrt2c=0 : hrt3c=0 ; 現在の列の順番をリセット
mp1=0 ; 総戦力値リセット
repeat hub,1 ; 装備
if cnt\2=2 : hrs_eq 2 : if un=0 : hrs_eq 1 : if un=0 : break ; 2回目
hrs_eq 1 : if un=0 : hrs_eq 2 : if un=0 : break ; 1と3回目
loop
; 国への配置
repeat 25,1
if mpl(cnt)!pn : continue ; 勢力国では無い
mp(cnt)=0 ; 戦力値リセット
loop
hrt1c=0 : hrt2c=0 : hrt3c=0 ; 現在の列の順番をリセット
repeat 3 : cnt3=cnt ; 配備
repeat 25 : m=hdp(cnt)
if m=0 : break ; 1順終わり
if mp(m)>=hdn(m) : continue ; 必要戦力有る
knc=m*10+cnt3*3
repeat 3,1
if cnt=1 { ; 1列目
un=hrt1(hrt1c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt1c+ : mp(m)+=ud(un*udb+27) : continue
un=hrt2(hrt2c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt2c+ : mp(m)+=ud(un*udb+27) : continue
un=hrt3(hrt3c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt3c+ : mp(m)+=ud(un*udb+27) : continue
}
if cnt=2 { ; 3列目
un=hrt3(hrt3c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt3c+ : mp(m)+=ud(un*udb+27) : continue
un=hrt2(hrt2c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt2c+ : mp(m)+=ud(un*udb+27) : continue
un=hrt1(hrt1c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt1c+ : mp(m)+=ud(un*udb+27) : continue
}
if cnt=3 { ; 2列目
un=hrt2(hrt2c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt2c+ : mp(m)+=ud(un*udb+27) : continue
un=hrt1(hrt1c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt1c+ : mp(m)+=ud(un*udb+27) : continue
un=hrt3(hrt3c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt3c+ : mp(m)+=ud(un*udb+27) : continue
}
loop
if hrt1(hrt1c)=0 and hrt2(hrt2c)=0 and hrt3(hrt3c)=0 : break ; 全員使った
loop
loop
; 戦力評価
mp2=0
repeat 25,1 : m=cnt
if mpl(m)!pn : continue ; 勢力国では無い
mpck m : mp2+=mp(cnt) ; 戦力値計測
loop
mp3=mp1-mp2 ; 残戦力値
; 隣接する弱小国の順列
repeat 25 : hda(cnt)=0 : loop ; 弱小国の順列をリセット
repeat 25,1 : m=cnt
if mpl(m)!pn : continue ; 自領で無い
repeat 6,1
n=hmv(m,cnt) ; 隣接する国があるか
if n=0 or map(n)=0 or mpl(n)=pn : continue ; 敵領で無い
f=0
repeat 25
if hda(cnt)=0 : break ; 最後
if hda(cnt)=n : f=1 : break ; 既にある
loop
if f=1 : continue ; 既に順列にある
pn1=n
repeat 25 ; 弱小国順列のソート
if hda(cnt)=0 : hda(cnt)=pn1 : break ; 空白なら入れて終わり
if mp(pn1)>=mp(hda(cnt)) : continue ; 値比較
pn2=hda(cnt) : hda(cnt)=pn1 : pn1=pn2 ; 入れ替え
loop
loop
loop
; 攻め込む
repeat 25 : hde(cnt)=0 : loop ; 既に攻め込むのに使ったかリセット
repeat 25 : m=hda(cnt) ; 攻め込む隣国の弱順列
if m=0 : break ; 終わり
repeat 6 : hdk(cnt)=0 : loop ; 隣接する自領の強順列のリセット
repeat 6,1
pn1=hmv(m,cnt) ; 隣接する国があるか
if pn1=0 or mpl(pn1)!pn : continue ; 敵領で無い
repeat 6 ; 隣接する自領の強順列のソート
if hdk(cnt)=0 : hdk(cnt)=pn1 : break ; 空白なら入れて終わり
if mp(pn1)<=mp(hdk(cnt)) : continue ; 値比較
pn2=hdk(cnt) : hdk(cnt)=pn1 : pn1=pn2 ; 入れ替え
loop
loop
repeat 6 : am=hdk(cnt) ; 攻め込む
if am=0 : break ; 攻め込める国が無い
if mp(am)<=mp(m) : continue ; 戦力が足りない
if mp3<=hdn(am) : continue ; 攻め込む自国の脅威値が残戦力以上なので攻め込めない
f=0 ; 既に攻め込むのに使った国かフラグ
repeat 25
if hde(cnt)=0 : hde(cnt)=am : break ; 使用済みに登録
if hde(cnt)=am : f=1 : break ; 使ってる
loop
if f=1 : continue
kn1=am ; 攻撃側
kn2=m ; 防衛側
gosub *battle ; 戦闘
if btvf<=0 : continue ; 敗北
; 勝利
mpl(kn2)=pn
clrf=1
repeat 25,1
if hf(mpl(cnt))=1 : clrf=0 : break ; プレイヤーが残ってる
loop
if clrf=1 : mainf=6 : break ; GAME OVER
repeat 9,1 ; 部隊の移動
mu(kn2*10+cnt)=mu(kn1*10+cnt)
mu(kn1*10+cnt)=0
un=mu(kn2*10+cnt) : ud(un*udb+13)=kn2
loop
mu(kn2*10)=0 ; 領主の解除
mp(kn1)=0 ; 戦力値のリセット
repeat 3 : cnt3=cnt ; 配備
if mp(kn1)>=hdn(kn1) : break ; 必要戦力有る
knc=kn1*10+cnt3*3
repeat 3,1
if cnt=1 { ; 1列目
un=hrt1(hrt1c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt1c+ : continue
un=hrt2(hrt2c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt2c+ : continue
un=hrt3(hrt3c) : if un>0 : mu(knc+1)=un : ud(un*udb+13)=knc+1 : hrt3c+ : continue
}
if cnt=2 { ; 3列目
un=hrt3(hrt3c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt3c+ : continue
un=hrt2(hrt2c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt2c+ : continue
un=hrt1(hrt1c) : if un>0 : mu(knc+3)=un : ud(un*udb+13)=knc+3 : hrt1c+ : continue
}
if cnt=3 { ; 2列目
un=hrt2(hrt2c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt2c+ : continue
un=hrt1(hrt1c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt1c+ : continue
un=hrt3(hrt3c) : if un>0 : mu(knc+2)=un : ud(un*udb+13)=knc+2 : hrt3c+ : continue
}
loop
mpck kn1 ; 戦力値計測
if hrt1(hrt1c)=0 and hrt2(hrt2c)=0 and hrt3(hrt3c)=0 : break ; 全員使った
loop
break ; 攻め取った
loop
if mainf!5 : break
loop
if mainf!5 : break
loop
trn+ ; ターン+
return
hap=ヒーロー勢力の戦力値の弱順列だと思う、弱い順かな。
人材とアイテムを HEXごとに発見処理。
自勢力、各 HEX事の隣接国の脅威値を算出。
装備とユニット配置を一度全解除。
装備とユニットの順列を操作順列にコピー。
まず領主を配置。
ユニットに装備をする。
その HEXの脅威値に達するまで 3体ずつユニット配置。
配置してない残戦力を算出 =mp3。
攻め込めるか、まず隣接する弱小国の順列を作り、弱い所へ攻める。
攻め込む国の周りに自勢力がいくつあるか調べ、強順列にし、強い国から攻めるようにする。
一度攻め込んだ国はそのターンはもう攻め込まない。
残戦力が脅威値以上有る場合に攻め込む。
戦闘処理をし、負けた場合は変化無し、買ったら部隊を攻め込んだ国に移し、攻め込んだ元の国に残戦力から部隊を再配置する。
以上。
国の戦略アルゴリズムも思っていた以上に複雑で難しいと思った。
という訳で、これでメインのプログラムは一通りできた、ここからはデバッグと調整、OP、EDとかその他の要素をつける。
でもまだ最後まで完成できるのかどうか自信がないなあ。