Spacewarを プレイしたことがあるなら!、あなたはそれが楽しいゲームだったことを知っています。まだ知らない場合は、これを知ってください。これは、非常に最初で最も重要なコンピューターゲームの1つでした(現在もそうです)。そして、それはまだ楽しいです!私が育ったクローンはこれで、明らかに残念なことにWindowsのみです。だから私はそれを再作成しました!
KotHはここでホストされています:PPCG-Spacewar!キングオブザヒル。ゲームがどのように機能するかを把握するために、少なくとも1つの他のボットに対して人間としてプレイすることをお勧めします。
ゲーム
- 1フレームは30ミリ秒です(したがって、約33フレーム/秒)。
- フィールドは幅800ピクセル、高さ600ピクセルです。
- フィールドはトロイダルです。つまり、フィールドの外側に移動する宇宙船とミサイルが反対側に再び現れます。
- 赤と青の2つの宇宙船があります。
- 赤はx = 50に配置され、ランダムなyは50(フィールドの高さ-50)ピクセルの間です。
- 青はx =(フィールド幅-50)に配置され、ランダムなyは50(フィールド高さ-50)ピクセルです。
- 両面x =(フィールド幅)/ 2。
- 使用可能なコントロールは次のとおりです。
- 左折-フレームごとに反時計回りに5度。
- 右折-フレームごとに時計回りに5度。
- 発射ミサイル-船の速度に加えて、フレームが10ピクセル余分に、船が指している方向に移動します。
- 消防車-宇宙船が指している方向にフレームあたり0.30ピクセルで宇宙船を加速します。
- ハイパースペースジャンプ-フィールド内のランダムな座標にテレポートし、25%の確率で爆発します。これらのランダムな座標は、太陽の上にある場合があります。
- 船の最高速度は、エンジン出力のもとでフレームあたり15ピクセル、重力ブースト時のフレームあたり40ピクセルです。
- フレームあたり15ピクセルよりも速く移動する場合、エンジンの推力は方向を変えるか、減速するだけです。
- ミサイルについて:
- ミサイルは直線で移動します。
- ミサイルは、0.1秒に1回の割合で発射できます。
- ミサイルの寿命は2.25秒です。
- 船にはそれぞれ最大20個のミサイルがあります。
- ミサイルは内部的に点粒子です。
- あなたの船にとって非常に危険な太陽がまさに中心にあります。わずかな接触は致命的です。この太陽はミサイルも破壊します。
- 太陽には重力があります。結果の加速度は5000 /(距離^ 2)ピクセル/フレーム^ 2で、距離はピクセル単位です。宇宙船とミサイルが影響を受けます。
- どちらの船にも3つのストライクゾーンがあります。機首、左翼、右翼です。
- 鼻に当たると即死します。
- どちらかの翼にヒットすると、宇宙船の回転速度とエンジンの加速が半分に減少します。
- 両方の翼が破壊された場合、宇宙船は操縦できず、ミサイルのみを発射できます。
- 船同士が衝突する場合があります。
- 鼻と鼻の衝突は、両方の船にとって致命的です。
- 鼻翼の衝撃により、翼が破壊されます。
- 翼と翼の衝突により、両方の翼が破壊されます。
- 死んだ船は固く、1秒後に爆発するまで凍結します。
- 少なくとも1隻の船が死亡した後、フィールドは3秒後にリセットされます。それまでは、太陽と残っているミサイルはまだ危険です。
元のゲームには致命的で破壊不可能な小惑星もありますが、それらは含めません。
ルール
- ボットはJavaScriptで作成する必要があります。
- ボットは、その決定を約10ミリ秒に制限する必要があります。ボットが原因で一貫した遅延に気付いた場合は、失格とし、修正できるようお知らせします。
- ボットは次のものにアクセスできます。
- フィールド幅とフィールド高さ
- 太陽の位置と半径
- 両方の船の位置、回転、速度、形状、ミサイルのストック、およびハイパースペース内のステータス
- すべてのミサイルの位置と速度
- プロンプトが表示されたら、ボットは文字列のリストを返します。
- これらの文字列は、次のいずれかでなければなりません:
turn left
、turn right
、fire engine
、fire missile
、hyperspace
。その他の文字列は無視されます。 - 重複がある場合は、最初のもののみが記録されます。
hyperspace
他のすべてよりも優先されます。turn left
そしてturn right
同時に効果がありません。fire engine
船が機首のみを持っているか、死んでいる場合は効果がありません。fire missile
ミサイルがあまりにも最近発射された場合は効果がありません。
- これらの文字列は、次のいずれかでなければなりません:
- 通常からの変更では、ボットは他のボットの動作を悪用できます。メタゲームを奨励したいです。
- ボットは他のボットをエミュレートすることはできません。(つまり、心を読むことはありません。)
- ボットは、ゲームおよび物理コードで使用される変数を設定できません。(つまり、不正行為はありません。)
ボット実装の詳細
ボットをfilenameと共に自動的に含まれる独自のJavaScriptファイルに保存しますbot_<name>.js
。そのため、これに干渉したり、JavaScriptの関数の名前付けに干渉したりするスペースや文字を入れないでください。それはあなたが以下の機能を定義する必要があるためだ。<name>_setup(team)
と<name>_getActions(gameInfo, botVars)
。ページのさらに下には、ユーザーボットのテキストエリアがあり、編集してコードをテストできます。
<name>_setup(team)
この関数は、永続化する変数を定義するためのものです。またはのteam
いずれ"red"
かになります"blue"
。この関数はオブジェクトを返す必要があります。次のように変数を定義します。
var vars = {};
vars['example'] = "example";
return vars;
このvars
オブジェクトは他の関数に渡されます:
<name>_getActions(gameInfo, botVars)
botVars
はによって返されるオブジェクト<name>_setup(team)
です。gameInfo
以下の変数を含むオブジェクトです。
redScore
blueScore
timeLeft
fieldWidth
fieldHeight
sun_x
sun_y
sun_r //sun's radius
gravityStrength //acceleration in pixels/frame^2 at 1 pixel away from the sun's center
engineThrust //acceleration in pixels/frame^2
speedLimit //maximum speed under engine power
maxSpeed //maximum speed from gravity boosts
red_x
red_y
red_rot //rotation in degrees
red_xv //x velocity
red_yv //y velocity
red_shape //one of "full ship", "left wing", "right wing", "nose only"
red_missileStock //the number of missiles red has left
red_inHyperspace //true if red is in hyperspace
red_exploded //until red explodes, it is still solid and hazardous
red_alive
// likewise for blue //
numMissiles
missiles //this is a list of objects, each with the following variables
x
y
xv
yv
ボットはこれらに完全にアクセスできます。アイムかなり確信して、あなたが彼らに書き込み、元の変数に影響を与えることができないことを、とにかくそれをしません。回転に関する注意:船は+ y方向を下向きに指すので、船に合わせたいものはすべて90度オフセットする必要があります。また、正の回転は時計回りです。
この関数は、ボットのアクションを表す文字列のリストを返す必要があります。たとえば、["turn right","thrust"]
。これに関する詳細は、「ルール」セクションにあります。
さらなる詳細
また、次のものを利用することもできます。
LineIntersection(L1, L2)
L1とL2は、2要素配列の2要素配列です。つまり、L1 := [[x1,y1],[x2,y2]]
そしてL2 := [[u1,v1],[u2,v2]]
。この関数は、2つの線の交差を計算し、これを返します[[x,y], [a,b]]
。[x,y]
は交点の座標であり、[a,b]
各線に沿って交点がどれだけ離れているかを表す比率のペアです。以下のように、a = 0.25
交点から道の四分の一であることを意味する[x1,y1]
と[x2,y2]
、同様にのためにb
。交差がない場合、空の配列が返されます。
window["shipShapes"]
var shipShapes = {
'full ship': [[-8,16],[0,-8],[8,16]],
'left wing': [[-8,16],[0,-8],[4,4],[0,8],[0,16]],
'right wing':[[-4,4],[0,-8],[8,16],[0,16],[0,8]],
'nose only': [[-4,4],[0,-8],[4,4],[0,8]]
};
これらは、船のポリゴンの座標です。現在の座標を簡単に取得するために、以下を使用することもできます...
getShipCoords(<color>)
getShipCoords("red")
は、赤の船の頂点の現在の座標を返しgetShipCoords("blue")
ます。同様に、青の船の座標も返します。これらの座標は次のようなリストにあります[[x1,y1],[x2,y2],[x3,y3],...]
。ポリゴンは暗黙的に閉じられているため、最初と最後の座標ペアの間に線があります。
ゲーム/ウェブサイトで使用されている他の変数や機能にアクセスしたり、変更したりすることはできません。また、関数に同じ名前を付けないでください。これが問題になるとは思いませんが、ボットがゲームコードに違反する場合、それは1つの可能性です。例外のロギングまたはキャッチはありません。
勝ち
- ボットのすべてのペアは、両方の方法で少なくとも10回プレイされるものとします。(つまり、合計20ゲーム以上です。)
- 全体で最高の勝敗比を目指します。ボットが他の1つのボットに対して非常に優れているが、他の3つのボットに対して負けている場合、それは2つに対して勝ち、2つに対して負けている(一般的な経験則として)ほど良くはありません。
- すべてのボットについて、比率(wins + 1)/(losses + 1)が計算され、次にこれらの比率の平均と標準偏差が計算されます。平均値が高いほど優先順位が高くなり、平均値が互いに1ユニット以内の場合、分散が低いほど優先順位が高くなります。
- 採点は、今日から1週間以内、または新規提出なしの3日間後に開始されます。これは、ボットのペアリングを繰り返す必要がないためです。
とりわけ、楽しんでください!
リーダーボード(2016-01-08 05:15):
# Name Mean StdDev
1. Helios 13.625 6.852
2. EdgeCase 8.335 8.155
3. OpponentDodger 8.415 8.186
4. OrbitBot 5.110 6.294
5. SunAvoider 5.276 6.772
6. DangitBobby 3.320 4.423
7. SprayAndPray 3.118 4.642
8. Engineer 3.903 6.315
9. RighthandedSpasms 1.805 2.477
10. AttackAndComeBack 2.521 2.921
11. PanicAttack 2.622 3.102
12. FullSpeedAhead 2.058 3.295
13. UhhIDKWhatToCallThisBot 2.555 3.406
14. MissilesPlusScore 0.159 0.228
15. Hyper 0.236 0.332
16. RandUmmm 0.988 1.329
17. Kamikaze 0.781 1.793
注:これは、より多くのゲームを実行するにつれて変更される可能性があります。さらに、ランク9から13の順序付けはわずらわしいので、スコアリング方法を調整して、ランク付け方法の直感をよりよく一致させることができます。
(平均と標準偏差は、三桁に四捨五入しHyper
なければならないHYPER
が、それはハイライトを台無し:P)
LineIntersection
交差しないセグメントを呼び出すと、空の配列が返されるように指定する必要があります。