Symulator odkurzacza
Wyzwanie dla programistów

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 }