LoginSignup
0
0

More than 1 year has passed since last update.

Robocode Tank Royale 盤面を動き回る

Last updated at Posted at 2022-06-03

こちらの続き

動きを変える

近場をうろちょろせず、混戦は避けるために
・盤面を動き回る
・敵に衝突したらそこから離れる

止まっている敵にも、意外と弾が命中しない。
・せめて止まっている敵には確実に命中させる

これらをやっていきます。

盤面を動き回る

参考になるのは、Crazy ですね。

setForward(40000) で、とりあえず長距離動く「設定を」します。
set系を使うことで、複数の動作をパラレルにさせることができる、ということで、合わせて setTurnRight(90) も使用しています。set系のメソッドの説明を見ると、IBaseBot.go() を行うまでの設定が使われるということのようなので、下記のように書くと、ぐるぐる回り出します。左に角度を変えながら前に進むので、そんな感じになるわけです。

            setForward(400);
            setTurnLeft(90);
            go();

では、左に曲がったり右に曲がったりさせようと思って、こう書いてもうまくはいきません。

            setForward(400);
            setTurnLeft(90);
            go();
            setForward(400);
            setTurnRight(90);
            go();

ほぼ真っ直ぐ進もうとします。左にちょっと向きを変えて進もうとしたら、すぐ次のコマンドで右に曲がれと言われるからですね。
そこで、Crazy では、回転し切るまでwaitするようです。そのための情報として、getTurnRemaining が可能ということですね。

ただ、そのまま真似しても面白くないので、基本は左回転するけど、敵を見つけたら右回転するということにしてみました。

public void run()
        while (isRunning()) {
            setForward(400);
            setTurnLeft(90);
            go();

        }
public void onScannedBot(ScannedBotEvent e)
        fire(1);
        setForward(100);
        setTurnRight(90);
        go();

これはなかなか面白い。そして強い。
反時計回りに円弧を描きながら敵の後ろに回り込んで、見つけたら、左右に揺れながら前に進み撃ちまくります。
めった撃ちにしてやりますw

ただ、撃って点を稼ぐので勝率は良いですが、割と早めに退場になることが多いです。
そして、混戦を避けようと思ったのに、めちゃくちゃ自分から突っ込んでいってるのが、戦いの美学的によろしくないです。

そこで、次は、敵に衝突したらそこから離れる、ヒットアンドアウェイを考えてみようと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0