English
ヘルプ(英)
JSロボッツ
JavaScript が必要です。
アリーナ
プレーヤー
CPU
1
ダメージ
スピード
軸受け
スキャン
1
ダメージ
スピード
軸受け
スキャン
2
ダメージ
スピード
軸受け
スキャン
2
ダメージ
スピード
軸受け
スキャン
3
ダメージ
スピード
軸受け
スキャン
3
ダメージ
スピード
軸受け
スキャン
4
ダメージ
スピード
軸受け
スキャン
4
ダメージ
スピード
軸受け
スキャン
CPU
1
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
2
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
3
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
4
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
プレーヤー
1 ベース
空
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
2 ベース
空
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
3 ベース
空
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
4 ベース
空
普通の矢倉
防衛的な矢倉
攻撃的な矢倉
隠れる狙撃兵
追跡する狙撃兵
周辺警備隊
半径警備隊
蚊
色
水色
黒
青
ピンク
灰色
緑
ライム
ワインレッド
ネイビー
オリブ
紫
赤
シルバー
ターコイズ
白
黄色
//NORMAL TOWER // //Scan constantly and shoot at most recently found target // if(!this.scanAngle) //One-off initialisation { this.scanAngle = rand(360); this.currentTargetAngle = 0; this.currentTargetRange = 0; this.gotFirstTarget = false; } var range = this.scan(this.scanAngle, 5); if(range) //Update shooting angle if new target found { this.gotFirstTarget = true; this.currentTargetAngle = this.scanAngle; this.currentTargetRange = range; } //Fire at current angle and range if(this.gotFirstTarget) { this.cannon(this.currentTargetAngle, this.currentTargetRange); } this.scanAngle += 10;
//DEFENSIVE TOWER // //Scan constantly and shoot at most recently found target //IF we have taken damage // if(!this.scanAngle) //One-off initialisation { this.scanAngle = rand(360); this.currentTargetAngle = 0; this.currentTargetRange = 0; this.gotFirstTarget = false; this.currentDamage = 0; } var range = this.scan(this.scanAngle, 5); if(range) //Update shooting angle if new target found { this.gotFirstTarget = true; this.currentTargetAngle = this.scanAngle; this.currentTargetRange = range; } //Fire at current angle and range IF we've taken a hit if(this.gotFirstTarget && (this.damage() != this.currentDamage)) { this.cannon(this.currentTargetAngle, this.currentTargetRange); } this.scanAngle += 10; this.currentDamage = this.damage();
//AGGRESSIVE TOWER // //Scan constantly and shoot at target if found //ELSE lob a random missile for the sake of it! // if(!this.scanAngle) //One-off initialisation { this.scanAngle = rand(360); } var range = this.scan(this.scanAngle, 10); if(range) { this.cannon(this.scanAngle, range); } //Go wild! else { //Add 50 so we don't hit ourself! this.cannon(rand(360), rand(300) + 50); } this.scanAngle += 20;
//CAMPING SNIPER // //Hide in a random corner for easier scanning // // //Helper method this.closeToWall = function() { var x = this.loc_x(); var y = this.loc_y(); if(x < 10 || x > 490) { return true; } if(y < 10 || y > 490) { return true; } return false; }; this.getRandomCorner = function() { var decider = rand(1000); var x = 499; if(decider < 500) { x = 0; } decider = rand(1000); var y = 499; if(decider < 500) { y = 0; } return {x:x, y:y}; //Object literal }; this.getScanAnglesForCorner = function(corner) { if(corner.x == 0 && corner.y == 0) { return {min:90, max:180}; } if(corner.x == 499 && corner.y == 0) { return {min:180, max:270}; } if(corner.x == 499 && corner.y == 499) { return {min:270, max:359}; } if(corner.x == 0 && corner.y == 499) { return {min:0, max:90}; } }; this.getHeadingToXY = function(x, y) { var heading; var curx = this.loc_x(); var cury = this.loc_y(); var dx = curx - x; var dy = cury - y; //atan() only returns -90 to +90, so figure out how to use //the atan() value if(dx == 0) //x is zero, we either move due north or south { if(y > cury) { heading = 180; //South } else { heading = 0; //North } } else { if(y < cury) { if(x > curx) { heading = atan(dy / dx); //NORTH EAST } else { heading = 180 + atan(dy / dx); //NORTH WEST } } else { if(x > curx) { heading = 360 + atan(dy / dx); //SOUTH EAST } else { heading = 180 + atan(dy / dx); //SOUTH WEST } } } return heading; }; //Init if(!this.corner) { this.corner = this.getRandomCorner(); this.heading = this.getHeadingToXY(this.corner.x, this.corner.y); var scanAngles = this.getScanAnglesForCorner(this.corner); this.scanMin = scanAngles.min; this.scanMax = scanAngles.max; this.scanAngle = this.scanMin; this.currentDamage = 0; } //Almost in that corner? Then stop! if(this.closeToWall()) { this.drive(this.heading, 0); var range = this.scan(this.scanAngle, 5); if(range && range < 350) { this.cannon(this.scanAngle, range); } this.scanAngle += 10; if(this.scanAngle > this.scanMax) { this.scanAngle = this.scanMin; } } else { this.drive(this.heading, 50); } //Change corner if got damage (from explosion or collision) if(this.currentDamage != this.damage()) { this.corner = this.getRandomCorner(); this.heading = this.getHeadingToXY(this.corner.x, this.corner.y); this.drive(this.heading, 50); //For quick getaway bug } this.currentDamage = this.damage();
//HUNTING SNIPER // //Scans only if lost/no target. //Chases target and backs off if too close. //No collision detection to speak of. //Why not add some as a user exercise? ;-) // //Init if(!this.scanAngle) { this.scanAngle = 0; } var range = this.scan(this.scanAngle, 5); //Have target if(range) { this.cannon(this.scanAngle, range); if(range > 300) //Move closer { this.drive(this.scanAngle, 75); } else if(range < 200) //Back off { this.drive(this.scanAngle, 0); this.drive(this.scanAngle - 180, 100); } } else //Only change scanning angle if we've lost the target { this.scanAngle += 10; }
//RADIUS GUARD // //Walk around a circle protecting what's inside //the circle by shooting outwards if there's a target. //Change drive direction if hit a robot or wall // //Helper method this.closeToWall = function() { var x = this.loc_x(); var y = this.loc_y(); if(x < 10 || x > 490) { return true; } if(y < 10 || y > 490) { return true; } return false; }; //Init if(!this.walkAngle) { this.walkAngle = 0; this.angleInc = 3; this.affector = 1; } //Scan current tangent (ie. drive angle minus 90) from centre of circle //[We need to *add* 90 when angleInc is negative (ie. moving anti-clockwise)] this.scanAngle = this.walkAngle + (90 * -this.affector); this.drive(this.walkAngle, 50); var range = this.scan(this.scanAngle, 10); //Have target if(range) { this.cannon(this.scanAngle, range); } this.walkAngle += (this.angleInc * this.affector); if(this.speed() == 0 || this.closeToWall()) //Hit wall or robot { //this.angleInc = -this.angleInc; this.affector = -this.affector; this.walkAngle -= 180; } if(this.speed() == 0) //For quick getaway bug { this.drive(this.walkAngle, 50); }
//PERIMETER GUARD // //Walk back and forth across the same line //shooting anything more-or-less in front //and backtracking if hit another robots // //Helper method this.closeToWall = function() { var x = this.loc_x(); var y = this.loc_y(); if(x < 10 || x > 490) { return true; } if(y < 10 || y > 490) { return true; } return false; }; //Reverse driving angle by 180 degrees this.toggleAngle = function() { if(this.currentAngle == this.startAngle) { this.currentAngle = this.returnAngle; } else { this.currentAngle = this.startAngle; } }; //Init if(!this.startAngle) { this.startAngle = rand(360); this.returnAngle = this.startAngle - 180; this.currentAngle = this.startAngle; } this.drive(this.currentAngle, 50); var range = this.scan(this.currentAngle, 10); //Have target if(range) { this.cannon(this.currentAngle, range); } if(this.speed() == 0 || this.closeToWall()) //Hit wall or robot { this.toggleAngle(); } if(this.speed() == 0) //For quick getaway bug { this.drive(this.currentAngle, 50); }
//MOSQUITO // //A non-offensive robot that flies around randomly //like a lunatic // //Helper this.closeToCoord = function(coord) { return (Math.abs(coord.x - this.loc_x()) < 20) && (Math.abs(coord.y - this.loc_y()) < 20); }; this.getRandomCoord = function() { return {x:rand(500), y:rand(500)}; //Object literal }; this.getHeadingToXY = function(x, y) { var heading; var curx = this.loc_x(); var cury = this.loc_y(); var dx = curx - x; var dy = cury - y; //atan() only returns -90 to +90, so figure out how to use //the atan() value if(dx == 0) //x is zero, we either move due north or south { if(y > cury) { heading = 180; //South } else { heading = 0; //North } } else { if(y < cury) { if(x > curx) { heading = atan(dy / dx); //NORTH EAST } else { heading = 180 + atan(dy / dx); //NORTH WEST } } else { if(x > curx) { heading = 360 + atan(dy / dx); //SOUTH EAST } else { heading = 180 + atan(dy / dx); //SOUTH WEST } } } return heading; }; this.getCoordAndHeading = function() { this.coord = this.getRandomCoord(); this.heading = this.getHeadingToXY(this.coord.x, this.coord.y); }; //Init if(!this.coord) { this.getCoordAndHeading(); } this.drive(this.heading, 100); //Stop (and change coord) if close enough to desired coord //OR if we've hit another robot if(this.closeToCoord(this.coord) || this.speed() == 0) { this.drive(this.heading, 0); //Stop this.getCoordAndHeading(); this.drive(this.heading, 100); //For quick getaway bug }