Warning
This page is located in archive.

2 - Vlastní příkazy a proměnné

Vytvoření vlastních příkazů (metod) a použití proměnných.

  • pro vyučující: 03

Úkoly

  1. vytvořte příkaz step, který nahradí příkaz move (jeden krok) a dále v programu příkaz move nepoužívejte
  2. dále vytvořte příkaz doSteps s parametrem, kolik kroků má provést
    • nápověda: void doSteps(int numberOfSteps)
  3. rozšiřte robota tak, aby uměl spočítat celkový počet provedených kroků
    • nápověda: využijte vámi vytvořený příkaz step
  4. vyřešte úlohu z domácího úkolu z 1. cvičení (přesun značek od stěn) tak, aby program fungoval pro obecné tvary místností (nikoliv pouze obdélník)

Nápověda

Abyste mohli splnit úkol 4., je potřeba umět zjistit (relativní) pozici robota. K tomu si potřebujete vytvořit vlastní souřadný systém a kdykoliv se robot pohne anebo pootočí, tak měnit příslušné hodnoty. K tomu je dobré použít příkaz step a také si vytvořit příkaz rotateLeft, který “nahradí” turnLeft. V těchto příkazech pak bude i kód změny souřadnic.

Vytvoření a použití proměnné

Proměnné mohou být různého typu. V našich přikladech zatím vystačíme s typem “int”, reprezentující celá čísla. O dalších typech a detailních informacích o proměnných se dozvíte na přednášce a v průběhu semestru na dalších cvičeních.

Vytvoření proměnné typu int:

// typ názevProměnné
int stepCounter;

Název proměnné by měl vystihovat to, k čemu je proměnná použita. Pokud slouží např. k počítání počtu kroků robota, nazveme ji 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();
        }
    }
}

Domácí úkol

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í.

Robot svoji startovní ani aktuální pozici nezná, proto musí počítat ušlé kroky.

Instrukce

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.

Odevzdávejte zazipovaný soubor Lab03Karel.java

Upozornění

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.

Tuto situaci testuje test 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.
courses/a0b36pr1/labs/lab03.txt · Last modified: 2015/10/12 17:17 by hrstkon1