Hextrategy マップ戦略要素がやっとプログラムになってきた


2018年 5月18日
 
 
 やっと少し形になってきたので、途中だがいったん報告する。
 
 
 その前に、やっぱり始めから複雑なゲームを作りすぎたと後悔してる。

 戦闘要素と戦略要素とでは全く別のゲームをそれぞれ作るようなものなのだと分かったので、やはり初心者は 1ジャンルゲーム要素のシンプルなものを作るように心がけた方が良いと思う。

 例えば戦略ゲームにしても、もっと 1マップボードゲームのような単純なものから練習した方が良かったろう。
 始めから複雑なものを作り過ぎたか。

 戦闘も戦略もそれぞれ 1マップゲームから作って、両方慣れたら合わせて複雑なもの、という手順が良いだろう。

 今の自分の状況で 1年以上も 1作に費やすのは時間的にもちょっと厳しい。
 
 

 まずマップ戦略として何をするかだが

1、持ってる国のユニットの配備を全解除、全ユニットの持ってる装備を解除

2、ユニットの筋力と魔力と総力の順列を作る、各種アイテムの能力の順列を作る

3、隣接する国の勢力値を評価

4、それを基にユニットを配置、合わせてアイテムを装備

 これらをどうプログラムでやるか。

 そしてサラッと書いてるが、これだけのアルゴリズムを考えるだけでも結構時間がかかった。
 
 
 やり方としては、ユニットもアイテムも出現時に適当に配置して後は変えない、ないし最小限に配置換えだけする、というようなものにすれば時間もメモリも短縮できると思うが、ゲームとしてはぬるい。
 
 
 まず解除のプログラム

 このまま動くかどうか自信が無いから、後で検証しながら調整するようかな。
 どうやってもバグはまずある。
 
 
 次に能力事の順列だが、その前にそれらの配列変数をどう用意してどう使うか、それを思考錯誤してたのでその説明から。

 まずデータの設定は今の所次のようになった。

 pubk 1国の養える最大人数 × 25最大国数 + pubc首都城の養える人数 + pubs建設で建てられる人材府の人数 × pubsb建てられる最大の数。

 10 × 25 + 20 + 20 × 5 = 370

 だから、今の所ヒーロー 1勢力の最大数は 370人としている。

 中立は攻め込まず国を増やさないので、配置最大数の 10人で良い。

 10 × 25国 = 250人だけ全部で用意する。

 ユニットの最大データ数 = ヒーローの数 × 370 + 中立 250だ。

 今の所 7ヒーローでテストしてるから、それなら 2840人がユニットデータ数、もし 25ヒーロー数なら中立+250も足して 9500人が最大数だ。

 これに 1ユニットのデータ数 60がかかるから、変数の量は 570000、前回やったバイト数はこの 4倍だから 2280000バイト、2.3MBほどかな。
 う~ん 2.3MBならたいした事ないか・・・。

 これもやり方としては、データの取得だけ 2000人とかだけにして、そこから処理毎に各ヒーローや中立のユニットを拾って処理する、という風にすればメモリの使用量を少なく出来ると思う。

 ただその場合速さが犠牲になるので、なぜ全部使用すると思えない 370固定にするのかと言うと、専用の変数を持つ事によって処理を早くする狙いから。

 さて 2000くらいの計算なら今のコンピューターならさして問題ないのかもしれないけど、1ターンに 1国〃毎に処理して、しかも順列の要素事だったりだとするとさすがに遅くなるのではないか、と考えた。

 この辺は本当は実際にやってみないと分からないので、あるいは無駄な考えであった可能性もある。

 それとこの方が変数の扱いの構造を単純にできるので、単純化してプログラムをなるべく簡単にしないと作れるかどうか自信が無い。

 例えば登録総数で 2000を超えたとして、どの勢力のどのユニットから何の優先順位で消していけば良いのか?

 これだと始めに多くユニットを作った勢力が有利という事になるし、あとから勢力が縮んだりしたら数の調整はどうするのか?

 とにかくも 1つ 370固定で専用の領域を持っていた方が単純で扱いやすいと考えた訳だ。
 
 
 それから次の工夫が、筋力や魔力、総力(筋力、魔力、知力、魅力の総計)の順列だ。

 これまた 1ターンに各国それぞれ再計算していたのでは時間がかかる。
 特にソート(順列)計算は難しいプログラム理論を知らないと時間のかかるものだと思う。

 そこで、こちらはあらかじめ専用の配列変数を用意しておき、ユニットの出現時にソート配置を済ませてしまう、という手法を考えた。

 そのための配列変数がこれになる

 dim hr1,plb*hub+1 ; ヒーローの筋力順列
 dim hr2,plb*hub+1 ; ヒーローの魔力順列
 dim hr5,plb*25+1 ; ヒーローの総力順列

 dim nr1,25*nub+1 ; 中立の筋力順列
 dim nr2,25*nub+1 ; 中立の魔力順列
 dim nr5,25*nub+1 ; 中立の総力順列

 数 hub = 225だが、これは 1国の部隊配置最大 9人 × 25国分あれば足りるからだ。

 中立の場合は 10人で良い、どうせ 10人以上増やさない。

 この時のソート配置プログラムはこれ

 中立の分は割愛。

 その勢力の人数が何人であろうと、配置する分の順列があれば良い。

 (例えば、そんなのも一つのひらめきと発明だった)
 
 
 次はアイテムだが、これまた随分と悩んだ。

 とりあえずまずデータ数から。

 pib = 1ヒーローの所持総数だが、これはユニット数と同じような形で、総数 800になってるが、後でゲームバランス的に調整するようかもしれない。

 20000 + 2000 × 40データなので、880000個 × 4 = 3520000バイトだから、3.5MBくらいかな。
 
 
 アイテム要素で問題なのが、どの隊列のユニットに何の装備をさせるのか、これは非常に頭の痛い問題だ。

 これについてまだこれから調整がいるだろうが、とりあえず各キャラクラーの装備タイプという項目を足して、そのタイプ事に装備をしていかせる事にした。


 
 
 そのプログラムはまだこれから作るのだが、それに対応する順列を作った。

 順列総数 hub = 800というのは倉庫総数に合わせた数で、これはアイテム種類の所持割合総数を合わせるため。

 つまり今の所、各種類の所持割合は 8の倍数で調整がつくようにしている。

 たぶんユニット登録と違って、アイテムの登録はこの順列に乗らないものは登録されない、あるいは押し出し廃棄という運びとなると思う。

 ザックリした所持方法だが、これ以上は処理時間的にもメモリ的にも自分の頭脳的にも(笑)過大だと今の所判断した。

 いや、いらないアイテムをどの優先順位で廃棄するかだけでもサッパリ分からない難しい問題だと思う。
 
 
 それではアイテムの順列のソースはこちら

 中立は割愛。

 これだけでも自分にはややこしくてもう、バグつぶしながら奇跡的に動いた、という感じのプログラム。

 試験的な確認表示、上から順に値の大きいものになってる


 
 
 今の所、作り上げたのはここまで。

 この次は勢力の評価をどう算出するか、ユニットの配置と装備プログラム。
 
 
 と、そんな感じなので、長い間なぜ報告が無かったのか分かってもらえると思う。

 特にプログラムに時間がかかるというよりは、その構造論をどうするかを考えないといけないので、それで時間がかかる、やった事の無い要素だとね。

 という訳で毎日散歩しながら考える日々だったので、引きニートのくせに日焼けして黒くなってるという(笑)

コメントを残す

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