- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]]
#define left 1
#define right -1
#define BLACK 40
#define GRAY_BLACK 45
#define GRAY_WHITE 52
#define WHITE 60
#define short_brake Wait(1000);
#define go(x) OnRev(OUT_B,30*x); OnRev(OUT_C,-30*x);
#define go_little(x) OnRev(OUT_B,35*(x+1)/2); OnRev(OUT_C,35*(-1*x+1)/2);
#define go_straight OnRev(OUT_BC,35);
sub follow_line(int a)
{
SetSensorLight(S3);
long t0=CurrentTick();
while(CurrentTick()-t0<150) {
if (SENSOR_3 < BLACK) {
go(a);
} else if (SENSOR_3 < GRAY_BLACK) {
go_little(a); t0=CurrentTick();
} else if (SENSOR_3 < GRAY_WHITE) {
go_straight; t0=CurrentTick();
} else if (SENSOR_3 < WHITE) {
go_little(-1*a); t0=CurrentTick();
} else {
go(-1*a); t0=CurrentTick();
}
}
Off(OUT_BC);
}
sub cross_line(int b)
{
go_little(-1*b);
Wait(300);
go_straight;
Wait(300);
Off(OUT_BC);
}
sub turn_left(int c)
{
go_little(left);
Wait(800-100*c);
go(left);
Wait(800-100*c);
Off(OUT_BC);
}
sub turn_right(int d)
{
go_little(right);
Wait(800+100*d);
go(right);
Wait(800+100*d);
Off(OUT_BC);
}
sub change_line(int e)
{
go(-1*e);
Wait(750);
Off(OUT_BC);
}
sub ball_catch()
{
go(left);
Wait(1000);
go_little(left);
Wait(1200);
go_straight;
Wait(800);
Off(OUT_BC);
OnFwd(OUT_A,30);
Wait(600);
Off(OUT_A);
go(left);
Wait(1000);
}
sub shoot()
{
go(left);
Wait(200);
Off(OUT_BC);
Wait(1000);
OnRev(OUT_A,70);
Wait(900);
Off(OUT_A);
}
task main()
{
go_straight; Wait(500); // A->B
follow_line(left); short_brake; cross_line(left); // B->C->D
follow_line(left); short_brake; turn_right(left); change_line(left); // D->E->F->G
repeat(2){follow_line(right); cross_line(right);}; // G->H->I
follow_line(right); turn_right(right); // I->J
follow_line(right); short_brake; // J->K
follow_line(right); // J->K
ball_catch(); // K->L->ボールをつかむ
follow_line(right); cross_line(right); // L->K
follow_line(right); // K->M
shoot(); // シュート
go_straight; Wait(1500); // M->A
}