単位
最初に、ユニットについて説明します。
- 時間はティックで測定され、これは1移動に相当します。 プロセッサの能力に依存し、ゲームの最初の開始時またはユーザーの要求時に計算される、制限された量のリアルタイムがターンごとに与えられます。 指定された時間内にロボットが次の移動のためのコマンドを発行しない場合、この移動は「スキップ」されます(ただし、コマンド「Drive Forward 100 Pixels」を以前に発行した場合、ロボットは指定された距離に達するまで移動します)。
- 距離は、特定の任意の単位で測定されます。 ただし、戦場の寸法が画面に完全に収まる場合、これらの単位は1ピクセルに等しくなります。 (!!!)ロボットに「ピクセル」を書くと、彼らはあなた自身のために同じことを伝えますが、彼らはあなたを正しく理解するので、以下のピクセルという用語を使用します。 距離の値は浮動小数点数です。
- 速度は、ストロークごとのピクセルで測定されます。
- 一般に、加速式はa = v /(t ^ 2)ですが、 ゲーム内の1手は時間の原子単位であり、加速はやや単純化されており、1手あたりのピクセル数でも測定されます(後で詳しく説明します)。
- 角度はラジアンで測定されます。 また、APIを使用すると、学位を使用できます。自分で何かを選択し、この値をどこでも使用することを強くお勧めします。 すべての三角法はラジアンで機能するため、選択することをお勧めします。
- エネルギー、弾丸、損傷は特定の任意の単位で測定されます。 「エネルギーの単位」と呼びます。
- 銃の温度は記述されていない単位で測定され、抽象度(以下、単に「度」)を使用します。
起源は、伝統的に、左下隅にありますが、角度は異常です。 0ラジアンは北を指し、次に時計回り:Pi / 2-東、Pi-南、(Pi * 3)/ 2-西、2 * Pi-北。
タンクの性能特性
ロボットは、ボディ、タワー、レーダーの3つの部分で構成されています。これらの回転は互いに依存しています(ただし、自動圧縮のフラグを設定できます)。 ロボットの性能特性は次のとおりです。
- 100ユニットの初期エネルギー。
- 0.1から3ユニットのエネルギーでパワーショット。
- 弾丸の飛行速度はパワーに依存し、式20-(3 * <ショットパワー>)で計算されます
- 最大速度8ピクセル/両方向のストローク。
- 最大加速度は1ピクセル/ストロークです。
- 最大ブレーキ2ピクセル/ストローク。
- 最大船体旋回速度はタンクの速度に依存し、式(10-0.75 * <速度モジュール>)度/ストロークによって計算されます。
- 最大砲塔旋回速度は20度/回転です。
- レーダーの最大速度は1回転あたり45度です。
- 当初、銃にはいくらかの熱があります(現時点では3度ですが、実装ではこの定数の代わりに最初のターンで熱を取る方が良いです)。これは、戦闘時に設定された強度(公式で現在使用されているデフォルト値競争、1動きあたり0.1度に等しい)。 また、発射されると、銃は次の値で加熱されます:1 + <発砲力> / 5.銃が冷えているときのみ加熱できます(加熱は0)。
- レーダーアーチの半径は1200ピクセルです(タンクはレーダーアーチにあるロボットのみを見ることができます)。
TTXでは、3つのトリックに注意する必要があります。
- ゼロを通過する場合、特別な規則が適用されます。 まず、コースの必要な部分であるタンクの速度が低下し、次に残りが加速されます。 したがって、タンクの速度が0.8で、彼が後退するコマンドを与えた場合、結果の速度は-0.6(または反対方向では0.6)になります。 ブレーキ時間はストロークの0.8 / 2 = 0.4、加速する残り時間は(1-0.4)= 0.6、速度は1 * 0.6 = 0.6です。
- 速度がゼロで、3つのコンポーネントすべてが同じ方向に回転する条件では、レーダーは45 + 20 + 10 = 75度回転できます。 レーダーが船体とタワーから反対方向に回転する場合、ターンごとに45-20-10 = 15度しか回転しません。
- タンクの部品の回転の自動補正は、回転の最大角度に影響しません。 たとえば、タンクにすべてのパーツのターンの自動補正のフラグが設定されている場合、レーダーの方向は90度で、機体を右に10度回転するコマンドが与えられた場合、レーダーの方向は90度のままになります。 体を回すことに加えて、レーダーを左に45度回転させるコマンドも与えられた場合、レーダーの方向は90-(45-10)= 65度になります。
衝突
ゲームでは次の衝突が発生する可能性があります。
- ロボットとロボット。 ゲームモデルでは、ロボットは回転しない長方形(現在は正方形)で表されます(動きの方向に依存しません)。 交差点で衝突が発生し、各ロボットは0.6エネルギー単位のダメージを受けます。 また、(!!!)ロボットには、「ロボットが衝突から遠ざかっている場合、停止しません。」(ロボットが衝突と反対方向に移動した場合、停止しません)と私は率直に言って、 「衝突とは反対の方向」の意味がわかりません。大体は重要ではないので、ゲームのソースからこれを差し引くのは最も好奇心の強い読者に任せます。 「衝突の方向」に移動したロボットも1.2ポイントです。
- 壁のあるロボット。 壁はセグメントで表され、壁セグメントがロボットの境界ボックスと交差すると衝突が発生します。 この場合、ロボットは<speed module> * 0.5-1の量のダメージを受けます。 (ただし、ゼロ以上)。 このルールの例外は後で説明します
- 弾丸のあるロボット。 弾丸は、現在のターンと前のターンの弾丸の位置の間のセグメントによって表されます。 境界の四角形とセグメントの交差点で衝突が発生しますが、被害者は4 * <弾丸の力>のダメージを受け、弾丸が1より大きい場合、プラス2 *(力-1)で、攻撃者は3 *のボーナスエネルギーを与えます弾丸の力>および多くのポイント。
- 弾丸で弾丸。 衝突は弾丸のセグメントの交差点で発生し、誰も何も失いません。
計算ループ(Robocode処理ループ)
ゲームの計算サイクルは次のとおりです。
- ゲームのプレゼンテーションを再描画します。
- すべてのロボットは、独自のスレッドでコマンドが発行されるまでコードを実行し、その後スレッドは一時停止します。
- 時間は更新されます(時間=時間+ 1)
- すべての弾丸が移動され、衝突が計算されます。 これには、新しい弾丸のショットが含まれます。
- すべてのロボットは、タワー、レーダー、車体、加速度、速度、位置の順に移動します。
- すべてのロボットがスキャンします。
- ロボットスレッドの実行が再開します。
- イベント処理は、ロボットのスレッドで発生します。
ここでは、よくある間違いに注意する必要があります-銃が回転する前に弾丸が発射されます(手順4および5を参照)。 したがって、ショット時に銃を回転させるのではなく、その前にティックを回転させる必要があります。
これについて(記事「Robocodeの最初のステップ」を含む)、Robocodeに関する基本的な知識は終わり、原則として、あなたは最初のロボットのプログラミングを始める準備ができています。 引き続きロボットで読むことができます。PMで質問したり、Robocodeの一連の記事を続けることに興味があることをコメントで確認することもできます。