パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

CodinGame Winter Challenge 2024の雑感

2025-01-09 | CodinGame

今回のゲームはふつうにRTS

4種の資源を調達して5種のユニットを操り 相手より領土を保持したら勝ち

これはコンテスト最後の戦いの結果

ステージを宇宙にして表示を俯瞰に奥行きなんかも表現したら大流行してもおかしくない気がする

問題点としてはWood1クリアまでメインゲームが始まらず

Wood1クリアがなかなか大変というところ ある程度の実装力がないと

チュートリアルでつまづいてしまう そのためか面白さのわりに参加者が少なかった

 

Wood2とかもそんなに簡単ではなかった

各Woodの攻略を雰囲気で書いてみる

 

Wood4

まずデータからゲームの盤面を作る能力が必須 作らずにもできそうだけど難易度はかなり高くなりそう

平面のラインデータがないので、初心者には厳しいかも 作れたらパスファインディングでAを通過できればOK

 

Wood3

さらに資源を何度も取るHARVESTERを設置、Aを通過しないようにして領土を広げ続ければクリア

 

Wood2

領土を効率よく広げる必要がある 相手に近い点に動かせればたぶんOK

相手ROOT位置からの距離をパスファインドで作成

次に自分の全ユニットから一手動かした位置がその距離から近いものを選択

 

Wood1

世界全体の参加者の半数ぐらいはここで力尽きている 実装はかなり大変

正解はまず資源の隣の隣にROOTを設置できる位置にSPORERを向け

ROOTを隣の隣に設置、次に資源にHARVESTERを向けて設置できればあとは領土を広げるだけ

 

隣の隣の実装が面倒でした とにかく一手目ROOTから東に東を向けたSPORERを置きます

資源の位置は変わるのですが、いずれでも、資源の隣の隣まで置けます

SPORERからおける位置全部の隣と資源の隣の位置が交わる所に打ち込みます

あとは2手読みで新しいROOTからHARVESTERを設置できて、複数ROOT時の命令分

設定できればクリア

 

ブロンズは外壁のデータがないのでまずその実装をする

盤面のデータに外枠分を追加しないとパスファインドの条件分岐が面倒になります

Wood1の実装は一度外してROOT一つで数日漂っていました

 

今回は2,3日ごとに休み休み実装を繰り返していました

少し開けたほうがどことなく頭の中が整理されて良さそう

最終日とその前日は7割ぐらい稼働していました

 

いろいろと実装できて楽しかったです いくつか作ってはみたけど取り込めなかった機能もあります

 

集合型を使ってパスファインディングを軽減させてみました

1ターン目で各座標から4、3、2、1動かせる範囲をそれぞれ開始位置をキーに動かせられる座標を集合型で持たせ

あと相手の座標とか資源の座標も集合型でもたせAND条件等で、その位置の周り3マスに相手のユニットがいるとかしてました

 

タイムアウトは数回発生していました 全体的に時間管理は運営側で多めにみてもらえていたような...

50msは厳しいです

さらに無駄読みを減らす高速化もいくつか実装してみましたが、

バグを取るのが大変でできなかったものもありました

 

順位について、今回思ったこと

序盤同じぐらいの順位でもお互い何もしていなくても、中盤で大きな差になっていくこと

細かい実装ミスの修正をしても、その局面の発生条件が少ないのでひとつふたつ直しても順位が悪くすれば下がる

それでもいくつか重ねていくと上がる

50位ぐらいは対戦相手の運で変わる 250位ぐらいのとき

 

RTSのAI作ってみたかったんだという方にお薦めです


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。