戦車戦争をしましょう!
目的
あなたの仕事は戦車を制御することです。2D戦場で動き回り、他の戦車や障害物を撃ちます。最後の戦車が勝者になります!
マップ形式
あなたの戦車は、単位正方形のn
by n
グリッドに基づく2Dフィールドにあります。n
提出物の数に基づいて何を決定します。各正方形には、次のうち1つのみを含めることができます。
- タンク
- 木
- 岩石
- 壁
- なし
すべての障害物と戦車はそのスペースを完全に埋め、それらが命中したすべてのショットがさらに物事にダメージを与えないようにします。
#
= tank を使用したフィールドの例を次に示します。T
= tree; R
=ロック; W
=壁; .
== n
10で何もない
.....#....
..T....R..
WWW...WWWW
W......T..
T...R...Ww
W...W.....
W....W...T
WWWWWW...R
W.........
WWWWWWRT..
座標は、左から右に増加し、下から上x, y
にx
増加する形式ですy
。左下のスペースには座標があり0, 0
ます。各タンクは空いているスペースに移動して、あらゆる方向に射撃できます。
マップダイナミクス
あなたの戦車は他の戦車を撃つだけではありません!マップ上で何かを撮影すると、事態が発生する可能性があります。
- 壁が撃たれた場合、1から4の範囲のいくつかのショットの後、壁は破壊されます。
- 木が撃たれた場合、すぐに破壊されます
- 岩が撃たれた場合、そのショットはそれを通り過ぎ、次に当たるものにダメージを与えます
何かが破壊されると、それはもはやマップ上にありません(何も置き換えられません)。ショットが障害物を破壊した場合、それはブロックされ、そのパスに沿ってそれ以上の損傷はありません。
タンクダイナミクス
各タンクはlife
= 100で始まります。タンクでの各ショットは、life
距離に基づいて20〜30減少します。これはdelta_life=-30+(shot_distance*10/diagonal_map_length)
(diagonal_map_length
が(n-1)*sqrt(2)
)で計算できます。さらに、各戦車はlife
1ターンにつき1回再生します。
ターン
いくつかのラウンドが実行されます(提出したら決定します)。すべてのラウンドの開始時に、マップがランダムに生成され、タンクがランダムな空の場所に配置されます。すべてのラウンドで、各タンクには任意の順序でターンが与えられます。すべての戦車にターンが与えられた後、同じ順番で再びターンが与えられます。ラウンドは、タンクが1つだけになるまで続きます。その戦車が勝者となり、1ポイントを獲得します。その後、ゲームは次のラウンドに進みます。
すべてのラウンドが実行されたら、この質問のスコアを投稿します。
戦車のターン中、次のいずれかを実行できます
- 水平または垂直のいずれかの方向に最大3スペース移動します。タンクが障害物または別のタンクによってブロックされている場合、障害物またはタンクを通過せずに可能な限り移動されます。
- 浮動小数点の角度(度単位)で表されるある方向で撮影します。戦車のローカルスペース(水平に左から右、別名東または
TurnAction.Direction.EAST
)のx軸は0度で、角度は反時計回りに増加します。ショットは不正確であり、ショットの実際の角度は、選択した角度より5度大きい場合も小さい場合もあります。 - 何もしない。
ターンは時間に制限はありませんが、これはすべてを掛けるために意図的に時間を浪費できるという意味ではありません。
提出/プロトコル
提出された各プログラムは、フィールド上の1つのタンクを制御します。制御プログラムはJavaであるため、現時点ではプログラムはJavaである必要があります(おそらく他の言語のラッパーを何らかの時点で作成するか、独自の言語を作成することもできます)。
プログラムTank
は、次のメソッドを持つインターフェイスを実装します。
public interface Tank {
// Called when the tank is placed on the battlefield.
public void onSpawn(Battlefield field, MapPoint position);
// Called to get an action for the tank on each turn.
public TurnAction onTurn(Battlefield field, MapPoint position, float health);
// Called with feedback after a turn is executed.
// newPosition and hit will be populated if applicable.
public void turnFeedback(MapPoint newPosition, FieldObjectType hit);
// Called when the tank is destroyed, either by another tank,
// or because the tank won. The won parameter indicates this.
public void onDestroyed(Battlefield field, boolean won);
// Return a unique name for your tank here.
public String getName();
}
Battlefield
クラス(オブジェクトの2Dアレイ含まBattlefield.FIELD_SIZE
によってBattlefield.FIELD_SIZE
戦場でのものを表します)。Battlefield.getObjectTypeAt(...)
与えるFieldObjectType
指定された座標(のいずれかで目的のためにFieldObjectType.ROCK
、FieldObjectType.TREE
、FieldObjectType.TANK
、FieldObjectType.WALL
、またはFieldObjectType.NOTHING
)。マップの範囲外のオブジェクト(座標<0または> = Battlefield.FIELD_SIZE
)を取得しようとすると、IllegalArgumentException
がスローされます。
MapPoint
マップ上のポイントを指定するためのクラスです。使用MapPoint.getX()
してMapPoint.getY()
座標にアクセスします。
編集:いくつかのユーティリティメソッドが追加されましたMapPoint.distanceTo(MapPoint)
、MapPoint.angleBetween(MapPoint)
、Battlefield.find(FieldObjectType)
、およびTurnAction.createShootActionRadians(double)
によって示唆されているようにWasmoo。
詳細については、javadocsを参照してください。以下のセクションを参照してください。
すべての(パブリックAPI)クラスはパッケージの下にありますzove.ppcg.tankwar
。
制御プログラム
制御プログラムとタンクAPIの完全なソースとjavadocは、私のGitHubリポジトリで見つけることができます:https : //github.com/Hungary-Dude/TankWarControl
バグが見つかった場合や改善が必要な場合は、プルリクエストやコメントを送信してください。
私は2つのサンプルタンクプログラムを作成RandomMoveTank
しましたRandomShootTank
(その名前がすべてを物語っています)。
タンクを実行するには、完全修飾(パッケージ名+クラス名)タンククラスをtanks.list
(行ごとに1つのクラス)に追加し、必要に応じて設定を編集しますzove.ppcg.tankwar.Control
(遅延を有効にする、フィールドのGUI表現を表示するかどうかなど)。実行しzove.ppcg.tankwar.Control
ます。リストに少なくとも2つのタンクがあることを確認してください。そうでない場合、結果は未定義です。(必要に応じてサンプルタンクを使用します)。
あなたのプログラムは、この制御プログラムの下で私のマシンで実行されます。ソースを作成したら、ソースへのリンクを含めます。ソースの編集を自由に提案してください。
ルール
- 投稿は上記のガイドラインに従う必要があります
- あなたのプログラムがファイルシステム、ネットワークにアクセスしたり、私のマシンを攻撃したりすることは決してありません
- あなたのプログラムは、私の制御プログラムを悪用して不正行為を試みることはできません。
- トローリングなし(プログラムを意図的にすべての電話を切るのに時間を浪費させるなど)
- 複数の提出がある場合があります
- 投稿で創造的になってみてください!
- 私はプログラムをallow意的に許可または許可しない権利を留保します
幸運を!
更新:壁のテレポーテーションのバグを修正し、再生成を実装した後、現在の提出を100ラウンド実行しました。Battlefield.FIELD_SIZE = 30
更新2: Groovyを少しだまして、新しいサブミッションRunTankを追加しました...
更新された結果:
+-----------------+----+
| RandomMoveTank | 0 |
| RandomShootTank | 0 |
| Bouncing Tank | 4 |
| Richard-A Tank | 9 |
| Shoot Closest | 19 |
| HunterKiller 2 | 22 |
| RunTank | 23 |
| Dodge Tank | 24 |
+-----------------+----+
現在、戦車は1ターンにつき1ライフ回復します。それを増やすべきですか?
MapPoint
さんx
とy
floats
?彼らはそうではありませんints
か?