オレンジ回収ロボットゲーム
部屋中に散らかったオレンジ色の物体を真ん中に集めてくるロボットを作るゲームです。
ロボットは物体を一度に一つしか持てないので、何度も往復する必要があります。
座標
中央が原点 (0, 0) です。画面全体で-50~50です。(壁があるので動ける範囲は-45~45です。
向きと角度
x軸を起点に、左回り(反時計回り)に角度を測ります。範囲は-180°~180°です
網掛けエリア
中央の網掛けエリアにオブジェクトを移動させると得点になります。網掛けエリアは, の正方形です。
時刻
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)