2019年6月15日土曜日

プログラミングゲーム、Gladiabots


久しぶりにオンラインの対戦ゲームを始めた。FEZDOTAもくそぬーぶ。今までに人並みの成績をとれたのはWoTだけ。そんな私でも、このゲームは平均くらいの成績はとれそうな気がする。

というわけで、レートがやっと1400になったばかりの初心者ではあるけども、もっと初心者向けにいくつかの基本的な解説をしておこうと思う。

ただ、私は攻略情報を調べずにやっているため、もっといい、正確な情報が他にあるかも知れないので、その辺りは差し引いて読んでほしい。


ブール(真偽値)変数の使い方


このゲームはロボットの行動パターンを設定して、自動行動で戦わせる。行動パターンの設定は、インターフェースが非常に分かりやすく、プログラミングの未経験者でも問題はないだろう。だが、やはりプログラムの経験を活かすことが出来る。

たとえば、「対象が孤立しているかどうか」を知りたくなったとする。そういう場面は多いかも知れない。そういうときに、毎回孤立状態かどうかを判断する設定を作っていたら手間がかかる。だから、サブルーチンを一回呼び出すだけで、自動的に判断してくれるような処理がほしくなるだろう。

そういうときは、孤立状態を判断するプログラムを一つ作っておき、孤立していたら何かにタグを与えるようにしておけばいい。

私の場合は、そのプログラムの開始時に自機タグ5を破棄し、孤立しているかどうかを判定したあと、孤立していたら自機タグ5を付与することになっている。よって、その判定の呼び出し元では、この判定のすぐあとで自機タグ5が存在するかどうかで、孤立判定が真を返したか偽を返したかが分かる。

ちなみに、何故自機タグ5を使うかと言えば、自機タグはそれほどたくさん使わなくても大丈夫そうなのと、常に存在することが保証されているからだ。

最初は味方ベースタグ5を使っていた。しかし、味方ベースというのはエリミネーションタイプの対戦の場合は、存在しないのではないかと思う。すると、判定の結果がどうであれ、味方ベースタグ5が存在できないことになり、それではブール変数として使うことが出来ない。

というわけで、存在が保証され、一番使用頻度が少なそうな自機タグを使うことにしたわけだ。このように、手間を惜しむとタグを一つ消費してしまうので、それが嫌なら毎回孤立チェックを作るという手もあると思う。

私としては、出来ればそういうのはやりたくないが。何というか、プログラム経験者の意地というか、矜恃というか、なんか、そういうのやだ。

意外とうまく行っているような気がする重み付け判定


ショットガンなんかは、とくに柔軟な行動が要求されるような気がしている。今自分がどういう状況にあり、次に何をするべきなのか。ショットガンが一番判断させるのが難しいと思う。

最初は私も、最初はといっても私はまだこのゲームを始めて一週間なわけだが、普通に条件分岐で行動を制御していた。こういう条件だったら、こういう条件の時よりもこの行動を優先させる。そうやって、普通に作った。

だが、どうしてもかゆいところに手が届かない。そこで、重み付けによる行動制御に切り替えた。状況に対してポイントを与え、複数の行動候補の中から、最も優先順位の高かったものを選択する。

たとえば、マップ上にあるどのリソースを取りに行くべきなのかは、とても難しい問題だ。そういうときは、あるリソースにどの程度の重要さがあるのかを計算させる。自分からの距離、味方からの距離、敵からの距離、ベースからの距離・・・などなど。

そして、一番優先度の高いリソースを取りに行かせるようにしたところ、今までよりも柔軟に、そこそこ満足のいく選択をしてくれるようになったと感じている。もちろん、常にベストな選択をしてくれるわけではない。いつか、重み付けのポイント割り振りさえ改善されれば、ベストに行き着くのかも知れないが、今はまだまぁこれならいいか、くらいになっている。

どういう状況に対して何点を割り振るかは設計者次第なので、何度も調整を続けていけばきっとよくなっていくだろう。

しかし、この方法には致命的な欠点がある。ものすごく複雑だ。判定件数がとても多い。しかも、複数回同じような処理を繰り返さなければならない。1フレーム(正確にはtick)の間に、同じ処理を複数回使うことは出来ないようだ。使いたいなら、使う度にその処理をおかなければならない。

このため、リソース選択のような複雑な判定を何度も行うと、100件くらいはすぐに突破してしまう。上限が500件であることを考えると、これが辛い。リソース選択、攻撃目標選択、退却判断、攻撃開始判断で四つも重み付け判断を行っているショットガンは、現在498件となっており、もうこれ以上拡張できない状態だ。

重み付けに頼りすぎるとこうなるので、ほどほどにしておいた方がいい。私も、これからどうしようか悩みながらこの記事を書いている。解決策が思いつかないから、逃避しているとも言う。

また、それに付随する問題がある。

重み付け判定を何度も繰り返すわけには行かないとはいえ、何回かは繰り返さざるを得ない。さもなければ、重み付けをする意味がない。どれが一番重要かを比較することに意味があるのだから、一回しか判定しないなら、やるだけ無駄だ。いや、重要度がある値以上かどうかで判断するなら、一回でもいい。退却判断なんかはそれでもいいが、どのリソースを取るかの判断はそうはいかない。

すると、判定に回せるリソースの数も限られてくる。私は全部で三つ。一番近くにあるリソース、味方ベースに一番近いリソース、敵ベースに一番近いリソース。これしか判定してない。本当は、一番敵から遠いリソースとか、そういうのもチェックしたいのだが、500件の壁がそれを許してくれない。

よく出来たゲームだ。

火力の基礎情報


ちょっと計算すれば分かる程度のデータだが、一応載せておこう。各クラスのDPS(秒間ダメージ)の基本値だ。

アサルト   1425 825 225
ショットガン 2250 750  0
マシンガン 2122 1326 265
スナイパー 666

左から、近距離、中距離、遠距離となっている。スナイパーはどの距離でも一緒。これは照準時間と攻撃持続時間から求めた、ごく単純なものでしかない。

次に、各距離の幅について。

アサルト   17 23
ショットガン 10 14
マシンガン 29 42
スナイパー 20 28

左が中距離幅で、右が遠距離幅だ。近距離の幅ははかり方が分からないのと、測っても使い道が分からないので測ってない。

これは、ぎりぎり遠距離の所に立っていたアサルトが、直進して敵を短距離に捕らえるの必要なフレームが17フレームだったことを表している。射程外とのぎりぎりのところでぶっ放しているマシンガンが、敵を中距離に捕らえるには10秒以上かかる事が分かる。一方、マシンガンなら6秒で到達する。

なるほど。アサルトの突撃が怖いわけだ。

基本戦術


正直なところ、私もまだどうやったら勝ちやすいのかが分かっていない。

なんとなく感じているのは、中央を制した側が有利になるケースが多いということ。必ずしもそうではなく、中央とは遠い側の折衝で勝敗が決することもあるが、中央を制圧してそのまま押し切るパターンをよく見かける。

これはたぶん勝ちパターンの一つなのだろう。特にベースが密集しているときにその傾向が強い。ベースが分散すればするほど、中央の価値が下がるようだ。

自陣に敵ベースがないような場合、自陣側に取りにくいリソースがない場合などは、中間ポイントにあるリソースの取り合いで勝敗が決しやすいとも感じている。リソースとベースの配置が素直で、妨害を受けにくければ受けにくいほど、逆転が起こりづらい。そういう場合は中間リソースを取ったあと、ひたすら守り切れば勝てる。

比較的マップに左右されづらい安定した戦力配分は、中間リソースに3体、他に1体ではないか。よく分かってないが、たぶんそのくらいの割り振りが、オーソドックスだと思う。あとは、それにちょっとずつ味付けをしていく感じでいいんじゃないかと思うが、まぁ、よく分からない。

この辺りは、そのうちまた詳しく書ける機会があるといい。




0 件のコメント:

コメントを投稿