Zaprogramuj własnego robota sprzątającego w javascript!
Poniżej, po lewej stronie znajduje się ekran symulacji robota sprzątającego. Symulacje włączamy zielonym przyciskiem. Po prawej stronie znajduje się edytor javascript, w którym za pomocą 5 funkcji możecie robota zaprogramować. Dokładny opis jak to zrobić znajduje się w komentarzach do kodu. Obecny przykładowy kod wstępnie działa i możesz z nim eksperymentować. Ciemny obszar to przepaść, która kończy symulację. Powinieneś zebrać jak najwięcej flag. Uważaj na rozładowującą się baterię. Reszty się domyślisz bo to bardzo proste :). Edytor javscript możesz powiększyć przeciągając separator pomiędzy widokiem kodu i symulacji.
szybkowolno
poziom:
Oczekiwanie na start
Kod zapisuje się w local storage Twojej przeglądarki
//Funkcja wywola sie jeden raz przy rozpoczeciu symulacji.
//Kazda funkcja wywoluje sie z referencja do obiektu robot, ktorym sterujemy robotem.
function onStarted(robot) {
//funkcja powoduje wypisanie podanego tekstu na konsoli
robot.shout("Start!!!");
//ustawienie koloru lampki na robocie
robot.color("green");
//jesli ustawimy setRadarAlert to radar robota bedzie caly czas mierzyl ogleglosc
//gdy odleglosc ta bedzie mniejsza niz ta, ktora zadeklarowales
//wywola sie zdarzenie onRadarAlert, ktore mozesz obsluzyc
robot.setRadarAlert(10);
//tutaj kazemy robotowi wykonac ruch
//przekazujemy tabele z sekwencja ruchow do wykonania
//zdarzenie np. onCollision przerwie sekwencje!
//obiekt sklada sie z pol:
// l - moc lewego silnika (od -100 do 100)
// r - moc prawego silnika (od -100 do 100)
// t - czas pracy (podany w nieokreslonych krotkich niepodzielnych jednostkach czasu)
// (w zaleznosci od wydajnosci kompa ok 1/30 sekundy)
robot.go([
{l: 100, r: 95, t: 50}, //jazda lekko po luku bo jeden silnik ma mniej mocy
{l: 100, r: -100, t: 4}, //obrot dookola wlasnej osi bo jeden silnik kreci sie odwrotnie
{l: 100, r: 100, t: 10}, //jazda prosto do przodu
]);
//nic nie stoi na przeszkodzie by wprowadzic jakas swoja zmienna
//mozna z niej bedzie korzystac w innych funkcjach
//w tym przypadku ustawilem sobie licznik
robot.myPrivateCounter = 0;
}
//Wywolowana gdy robot dotknie sciany.
//Wywoluje sie z parametrem angle
//parametr angle oznacza kat (w radianach) wzgledem robota w ktorym miejscu dotkanal sciany.
function onCollision(robot,angle) {
//tak wyglada konwersja z radianow na stopnie, ale wygodniej stosowac radiany
robot.shout("Dotknieta sciana! Kat uderzenia "+(angle/Math.PI)*180+" stopni");
robot.color("red");
//uzywamy tutaj naszej zmiennej, ktora sami wprowadzilismy
//ja uzywam licznika aby robot zachowywal sie inaczej co kilka cykli
robot.myPrivateCounter+=1;
if (robot.myPrivateCounter>7) {
robot.go([
{l: -100, r: -100, t: 14}, //cofamy sie bo silniki kreca sie odwrotnie
{l: -100, r: 100, t: 6} //obracamy sie nieco w lewo
]);
robot.myPrivateCounter = 0;
} else {
robot.go([
{l: -100, r: -100, t: 7},
{l: 50, r: -50, t: 3}
]);
}
//pamietaj, ze nie mozna obrocic sie o jakis doklany kat, np 90 stopni
//to dlatego ze w prawdziwym swiecie roboty tez nie potrafia sie obrocic idelanie o zadany kat
//mozesz regulowac tylko moc silnikow, wiec sam sprobuj dobrac parametry
}
//Wywolywana gdy czujniki robota wykryja ze znajduje sie nad przepascia.
//Radzilbym wtedy szybko sie wycofac.
function onFallDetection(robot) {
robot.shout("Uwaga! Wykryto przepasc! Wracam!!");
robot.color("orange");
robot.go([
{l: -100, r: -100, t: 9}, //cofam sie
{l: -100, r: 100, t: 4} //odwracam sie
]);
}
//Funkcja wywolana zostaje gdy robot zakonczy sekwencje ruchow bez przeszkod
//czyli zadna przeszkoda lub przepasc nie wystapi.
//W praktyce bedzie potrzebna bardzo czesto bo ona decyduje co robimy dalej.
//
//Otrzymujesz w niej dwie informacje:
//collision (true/false) - czy robot dotyka w tym momencie sciany
//radarDist - odczyt obecnej odleglosci z radaru
//
//Uwaga! Radar to promien lasera badajacy odleglosc tylko w kierunku gdzie skierowane jest czolo robota
//czyli radar nie patrzy dookola! wazne jest tez, ze jego maksymalny zasieg to 200.
//Jesli radar zwraca false to oznacza ze zadna sciana nie jest w jego zasiegu.
function onTaskFinished(robot,collision,radarDist) {
robot.shout("Sekwencja skonczona. czy mamy kolizje: "+collision+", odleglosc radaru "+radarDist);
robot.color("green");
robot.go([
{l: 100, r: 90, t: 30},
{l: 90, r: 100, t: 30}
]);
}
//To zdarzenie wywolane zostanie tylko kiedy uprzednio ustawiles odleglosc alertu radaru
//za pomoca funkcji robot.setRadarAlert().
//Kiedy radar bedzie mial mniejszy odczyt,odpali to zdarzenie.
//Zdarzenie zostanie wywolane drugi i koljeny raz dopiero gdy przeszkoda zniknie z zasiegu
//radau i pojawi sie w nim kolejny raz.
function onRadarAlert(robot, distance) {
robot.shout("Alarm radaru! Dystans: "+distance);
robot.color("yellow");
//w tym przykladzie nie podejmuje zadnej akcji gdy nastapi alert radaru
}