Vytvoření vlastních příkazů (metod) a použití proměnných.
step
, který nahradí příkaz move
(jeden krok) a dále v programu příkaz move nepoužívejte
doSteps
s parametrem, kolik kroků má provést
void doSteps(int numberOfSteps)
step
rotateLeft
, který “nahradí” turnLeft
. V těchto příkazech pak bude i kód změny souřadnic.
Vytvoření proměnné typu int
:
// typ názevProměnné int stepCounter;
int stepCounter
. Rozhodně NE např. int aaa
!!! Funkce programu se sice nezmění, ale program přestává být čitelný a do budoucna je těžko srozumitelný a rozšiřitelný.
Pro pojmenování proměnných, funkcí atd. volte jako jazyk angličtinu. Česky pište maximálně v komentářích a i tam se tomu snažte vyhnout.
Celý program s použitím proměnných:
package cz.cvut.fel; import kareltherobot.FelKarel; public class Lab03Karel extends FelKarel { int stepCounter = 0; // proměnná, která patří robotovi a je přístupná ze všech našich metod (příkazů) // Definice nového příkazu, který provede dva kroky a aktualizuje počítadlo void twoSteps() { move(); move(); stepCounter = stepCounter + 2; // Aktuzalizace počtu provedených kroků } @Override public void execute() { int repeats = 2; // proměnná, která je přístupná pouze uvnitř "execute" (tzv. lokální proměnná) // V příkazu "for" můžeme číslo nahradit proměnnou for (int i = 0; i < repeats; i++) { twoSteps(); } } }
Robot bude procházet bludiště pomocí pravidla pravé ruky, dokud nenajde první beeper, ten pak sebere, a vrátí se na startovní pozici, kde beeper položí. Poté se robot vypne.
Pravidlo pravé ruky v tomto kontextu znamená, že robot jde tak, aby měl po pravé ruce vždy stěnu. Jestliže ji po pravé ruce nemá, otočí se doprava a udělá krok.
Předpokládejte, že bludiště má řešení.
Program pište do připravené šablony ze cvičení Lab03Karel.java
. Stejně jako v předchozím úkolu, je třeba přepnout svět. Toho docílíte zakomentováním řádku 12 v Lab03Task.java
a odkomentováním řádků 13 a 14. Změníte tedy obsah z:
World.readWorld("lab.klwd"); //World.readWorld("maze.klwd"); //World.placeBeepers(4, 2, 1);na:
//World.readWorld("lab.klwd"); World.readWorld("maze.klwd"); World.placeBeepers(4, 2, 1);
Doporučení: úlohu vhodně rozdělte na jednotlivé podúlohy - např. příkaz pro otestování přítomnosti zdi po pravé resp. levé ruce (boolean wallOnRight()
resp. boolean wallOnLeft()
). Narozdíl od předchozího domácího úkolu není zadáno, na jaké podúlohy program rozdělit. Je to čistě na vás.
Lab03Karel.java
To, že váš program funguje na vzorovém bludišti neznamená, že funguje obecně. Pokud chcete modifikovat šablonu pro otestování různých pozic robota, případně různých pozic beeperu, můžete tak učinit změnou metody task()
v souboru Lab03Task.java
. Pomocí setDelay
můžete upravit rychlost běhu programu (nižší číslo ⇒ rychlejší běh).
World.placeBeepers(6, 6, 1); World.setDelay(5); UrRobot karel = new UrRobot(3, 1, North, 0);
Pozor na speciální případ, např. kdy robot přišel z východu směrem na západ jak ukazuje šipka a právě sebral beeper. Nyní by se tedy měl otočit a podle pravidla levé ruky dojít zpět stejný počet kroků jako šel tam. Problém je, že když se otočí a rozběhne se podle pravidla levé ruky, tak první co udělá bude, že se otočí doleva, tedy směrem na sever.
singularity1
. Jednoduchá oprava řešení této singularity může vést k zanesení chyby, která způsobí, že neprojde test singularity2
. Dobře si vaše řešení rozmyslete.