PV178/02 Domaci ukol 1

Robot Karel a jeho mesto

Robot Karel zije ve meste. Jeho mesto se sklada z mnoha policek usporadanych do tvaru obdelniku a je ohraniceno pevnou zdi.

Sam Karel toho moc neumi: ma predstavu, kde ve svem meste je, umi udelat krok dopredu, umi se otocit doleva a pozna zed pred sebou.

Vas ukol

  1. Vytvorte si novou konzolovou aplikaci RoboCity.
  2. Pridejte zdrojove soubory z archivu se zadanim do vaseho projektu.
  3. Vytvorte tridu pro Karlovo mesto, ktera implementuje rozhrani ICity.
    1. Vytvorte konstruktor, pomoci ktereho se bude nastavovat vyska a sirka mesta.
  4. Vytvorte strukturu Coordinates, ktera bude mit dve vlastnosti X a Y typu int.
  5. Vytvorte tridu Robot, ktera implementuje rozhrani IRobot.
    1. Vytvorte metodu void WallFound() ve tride Robot jako abstraktni a s modifikátorem viditelnosti protected.
    2. Metoda Step() se pokusi posunout robota ve smeru do ktereho je aktualne natocen. Sever je ve smeru kladne poloosy Y. Jestlize by robot narazil do zdi (tj. jeho pozice se dostala mimo rozmery mesta), zavola metodu WallFound() jinak se posune na nove policko.
    3. Upravte konstruktor robota tak, aby prijmal jako parametr robotovo mesto. Po vytvoreni necht je robot ve vychozi pozici vlevo dole - na souradnici [0,0] - a bude se divat smerem na sever.
    4. Jestlize dojde k nastaveni robotovi vlastnosti City na nove mesto, presunte robota na vychozi pozici [0,0] otocte ho smerem k severu.
  6. Prepiste metodu ToString() ve vsech vytvorenych tridach, tak aby vracela smysluplny rezetec, u robota pak zvlaste jeho pozici a smer.
  7. Vytvorte tridy SmartRobot a StupidRobot dedici ze tridy Robot a implementujte metodu WallFound(). Chytry robot se pri narazu do zdi otoci doleva, aby mohl pokracovat v ceste. Hloupy robot pouze vypise do konzole hlaseni o zdi pred nim.

Hint

Pokud se pokusite pri implementaci tridy Robot napsat nasledujici kod, nebude vam fungovat, resp. kompilator zahlasi chybu:

public Coordinates Position { get; private set; }
...
Position.X = Position.X - 1;

Muzete to vyresit pouzitim datove polozky misto vlastnosti:

private Coordinates position;
public Coordinates Position { get { return position; } }
... 
position.X = position.X - 1;