さまざまなゲームMemory Fight。 Google AIチャレンジまたはHabraWarsに似たもの。
機能とルール
1.ゲームは2つ以上のボットのターンベースの戦略です
2.各プレーヤーは、ゲームエンジンから特別なコマンドを受け取り、アクションを返すことができる独自のWeb Workerを作成します
3.ボットには各ターンに4つのアクションポイントがあり、それらをアクションに分配できます。
4.ボットの視野は限られています(ロゴの例は青で強調表示されています)。
-視野に入るすべてのオブジェクトはコールバックアクションに転送され、計算で使用できます
5.ボットは2つのアクションを実行できますが、
-移動1セル左、右、上、下、1 ODのコスト
-最大5セルの距離で狙撃(ケージに当たる)、2 MPのコスト、敵または自分から2ポイントのライフまたはシールドを削除
さらに詳細なルール、ワーカーとデモの例。
6.ボットがODを使い果たすまで、エンジンはボットにアクションを要求します。
-ボットがアクションリクエストの2秒後に応答しなかった場合、そのコースは終了し、ODが焼けます
-アクションに十分なAPがない場合、アクションは実行されず、ボットの進行は完了し、ODは燃え尽きます
-アクションが完了するとすぐに、一定量のMLがボットから削除されます
-ボットが存在しないコマンドを送信した場合、1 ODが削除されます
-ボットは壁や他のプレイヤーの上を歩くことができません
-各アクションの後、ボットは任意の方向に向きを変えることができます
7.最初に行くウォーカーは、最初に初期化されたウォーカーです。
-将来的には、やり直しが予定されています。最小ボリュームワーカーが最初に実行されます。
8.各ボットには10個のライフポイントと2個のシールドポイントがあります
-シールドは各フェーズの終了時(全員が去ったとき)に+1で再生成されますが、2を超えることはできません
9.競技場のサイズは、フィールド壁-壁の10 x 10セルです(実際には、フィールドは8 x 8です)。
10.開始時に、ボットはコーナーに配置されます。セル1.1の最初のボット、2番目-8.8
11.ゲームには500の動きの制限があります(すべてのボットで2000 OD)
12.各ボットは異なるイベントを取ることができます:(onDamage、onHit、onAfterMove ...)
-その数は限られていますが
ゲームが試用モードの場合、ルールは変更される場合があります。
労働者の例
その論理は単純です:ワーカーはランダムに歩き、ランダムに向きを変えて敵を探します。敵が視界に入るとすぐに、彼は最後まで射撃を開始します(記事の例からほとんどすべてのコメントが削除され、フルバージョンはデモまたはアーカイブにあります)。
/**#nocode+*/ (function (global) { /**#nocode-*/ /** * Callbacks * * @namespace Callbacks */ var Callbacks = { callback: function (state) { // its own id var id = state.player.name, target, i, c, ok = false, fow = []; // looking for enemy in fow for (i = 0, c = state.fow.length; i < c; i += 1) { // push fow elements to 2d array, required for movements if (!fow[state.fow[i].y]) { fow[state.fow[i].y] = []; } fow[state.fow[i].y][state.fow[i].x] = state.fow[i].object; if (typeof state.fow[i].object === 'object' && state.fow[i].object.name !== id) { // found! target = { x: state.fow[i].x, y: state.fow[i].y }; } } if (target) { // target - shoot! Player.post({ action: 'shoot', // shoot action options: target, // enemy xy direction: state.player.direction // do not change direction }); } else { // no target - seeking for target // make random moves if (Math.random() > 0.5) { // move to x while (!ok) { // check if cell not occupied target = { x: state.player.x + (~~(Math.random() * 3) - 1), y: state.player.y }; if (typeof fow[target.y] === 'undefined' || typeof fow[target.y][target.x] === 'undefined' ) { ok = true; // cell is free } } } else { // or move to y while (!ok) { // check if cell not occupied target = { x: state.player.x, y: state.player.y + (~~(Math.random() * 3) - 1) }; if (typeof fow[target.y] === 'undefined' || typeof fow[target.y][target.x] === 'undefined' ) { ok = true; // cell is free } } } Player.post({ action: 'move', // move action options: target, direction: ~~(Math.random() * 5) // random direction }); } }, onHit: function (param) { }, onDamage: function (param) { }, onKill: function (param) { }, onDead: function () { } }; /** * Player * @namespace Player */ var Player = { post: function (data) { global.postMessage(JSON.stringify(data)); } }; /** * Message listener */ global.onmessage = function (e) { var data = JSON.parse(e.data); if (data.call && typeof Callbacks[data.call] === 'function') { Callbacks[data.call](data.arguments); } }; /**#nocode+*/ }(this)); /**#nocode-*/
バトルイニシャライザー : azproduction.ru/web_worker_wars
デモ2ボット: azproduction.ru/web_worker_wars/arena.html#ZRV1vYGY&ZRV1vYGY
4ボットazproduction.ru/web_worker_wars/arena.html#ZRV1vYGY&ZRV1vYGY&ZRV1vYGY&ZRV1vYGY
デモでの視覚化-以前の労働者の戦いの記録、つまり リアルタイムではありません。
すべてのファイルを含むアーカイブ(旧バージョン): narod.ru/disk/1947680001/web_worker_wars.rar.html
Google プロジェクトcode.google.com/p/web-worker-wars
ゲームについてのあなたの意見、改善のための提案は興味深いです。
UPDこれで、ボットをpastebin.comにアップロードし、 pastebin (http://pastebin.com/ZRV1vYGY)のスクリプトIDを使用して、バトル初期化プログラムazproduction.ru/web_worker_warsでボットを起動できます。