回収ロボットゲーム in JavaScript

オレンジ回収ロボットゲーム

部屋中に散らかったオレンジ色の物体を真ん中に集めてくるロボットを作るゲームです。
ロボットは物体を一度に一つしか持てないので、何度も往復する必要があります。

座標

中央が原点 (0, 0) です。画面全体で-50~50です。(壁があるので動ける範囲は-45~45です。

向きと角度

x軸を起点に、左回り(反時計回り)に角度を測ります。範囲は-180°~180°です

網掛けエリア

中央の網掛けエリアにオブジェクトを移動させると得点になります。網掛けエリアは10<x<10-10 < x < 10, 10<y<10-10 < y < 10 の正方形です。

時刻

time

シミュレーションを開始してから経過した秒数。実際の時刻ではなく、シミュレーション上での時刻です(倍速の影響を受けます。)

センサーデータ

robot.nearWalls

例

ロボットのセンサーが感知した壁のデータです。ロボットは、一定距離以内にある壁を感知することができます。robot.nearWallsにより、ロボットが検知したすべての壁を配列としてアクセスできます。

let distance = robot.nearWalls[0].distance;
let direction = robot.nearWalls[0].direction;
distance
壁とロボットの距離です。ロボットが壁にぶつかっている場合、距離は0です。
direction
ロボットの進行方向を0°としたとき、壁のある方向が-180°~180°で表されています。壁がロボットの左にあるときにはプラスの値が、右にある時にはマイナスの値が入ります。

robot.nearTargets

ロボットのセンサーが感知した物体のデータです。壁センサーと同様に、距離と向きにアクセスできます。

robot.position

ロボットの位置です。

let x = robot.position.x;

robot.direction

ロボットの向きです。右方向が0°です。

ロボット操作

robot.onTick

一定時間ごとに実行される関数です。onTickに関数を代入することで、ロボットをプログラミングすることができます。

robot.onTick = function() {
  if (time < 1) {
    robot.v = 10;
    robot.w = 0;
  } else {
    robot.v = 0;
    robot.w = 10;
  }
}

robot.v

例

前に進む速度を設定します。0~10に設定できます。

robot.v = 3

robot.w

例

ロボットの回転速度を設定します。-15~15に設定できます。プラスが左回り(反時計回り)で、マイナスが右回り(時計回り))です。

robot.pick()

物体を拾います。拾える物体がないときは、何もしません。

robot.dump()

物体を下ろします。物体を持っていないときは、何もしません。

関数

direction(x1, y1, x2, y2)

点(x2, y2)からみたときの、点(x1, y1)の方向を計算します。

let a = direction(10, 10, 0, 0);
// a = 45

distance(x1, y1, x2, y2)

点(x1, y1)と点(x2, y2)の距離を計算します。

デバッグ用

watch

変数を表示します。以下は、速度を表示する例です。

watch("速度", robot.v);

シミュレーションと得点

「実行」を押すと、あなたのロボットが実行されます。

「シード値」を変更すると、乱数が変わります。(部屋の配置が換わります。)

「採点」を押すと、あなたのロボットが100種類の部屋でテストされます。しばらく時間がたったあと、平均得点が表示されます。


作者: ゆりは (@yuriha@misskey-square.net)