Opis pločice
Cilj
Upis podataka koji opisuju pločicu.
Opisna polja
class Tile {
uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
...
}
Pogledajmo sad detaljnije kako spremati zidove. Spremaju se u varijeblu "_wall", tipa bajt, koja u sebi ima 8 bitova. Znači, možemo spremiti 8 podataka.
Prva 2 bita ćemo rezervirati za desni zid, druga 2 za donji, itd. Znači, 4 para bitova za 4 zida.
Ove radnje vrše 2 funkcije; "wallGet()" i "wallSet()". Kratke su, ali sadrže relativno komplicirano baratanje bitovima, pa ih nećemo proučavati.
Pogledajmo radije enumaraciju "WallStatus", u dijelu koji slijedi.
Status zida
...
enum WallStatus{ NO_WALL, WALL_UNKNOWN, WALL_WITH_VICTIM, WALL_WITHOUT_VICTIM};
...
Status zida je jedna od mogućnosti koju daje "WallStatus".
"NO_WALL" je kratica za broj 0, "WALL_UNKNOWN" za 1, "WALL_WITH_VICTIM" za 2 i "WALL_WITHOUT_VICTIM" za 3. Zapravo je svejedno pisali u kodu "WALL_WITHOUT_VICTIM" ili "3".
Opet, osnovnoškolska informatika: 0 (u dekadskom sustavu) je u binarnom sustavu 0 (ili 00), 1 je 1 (ili 01), 2 je 10, 3 je 11. Uočimo da su to sve kombinacije koje možemo ostvariti s 2 bita i da na taj način možemo pospremiti gornje statuse za sva 4 zida u 8 bitova (4 para).
Npr, što znači "_wall" "01 11 10 00" (razmaci dodani)? Prvi par je "01", znači i dekadski 1, znači "NO_WALL".
Drugi par je "11", dekadski 3, znači "WALL_WITHOUT_VICTIM".
Itd.
Površina
class Tile {
uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
Tile* _chain; // Pointer to the next tile in chain.
public:
static Tile* first; // Static member variable (one instance for the ...
Direction breadcrumb; // Stores direction of the previous tile, needed for ...
int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
int8_t y; // y coordinate of the tile. Increasing in UP direction.
...
}
"uint8_t _surface;" sprema tip površine. Koriste se samo prva 2 bita, ostatak je slobodan za buduće potrebe.
U ta se 2 bita sprema podatak iz enumeracije "TileSurface", koji može imati vrijednosti: "SURFACE_BLACK", "SURFACE_SILVER", "SURFACE_UNKNOWN" i "SURFACE_WHITE".
Dakle, slično kao i za zidove, imamo 4 mogućnosti, koje spremamo u 2 bita.
Pokazivači (pointeri)
class Tile {
uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
Tile* _chain; // Pointer to the next tile in chain.
public:
static Tile* first; // Static member variable (one instance for the ...
Direction breadcrumb; // Stores direction of the previous tile, needed for ...
int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
int8_t y; // y coordinate of the tile. Increasing in UP direction.
...
}
U strukturi su 2 pointera, koji pokazuje na pločice.
_chain smo opisali. On je veza među karikama lanca.
static Tile* first; označava vezu na prvu kariku lanca, prvu pločicu. Kako ne treba isti podatak spremati u svaku pločicu, na početku je riječ "static", koja označava da će to biti jedna varijabla, zajednička za sve pločice.
Smjer
class Tile {
uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
Tile* _chain; // Pointer to the next tile in chain.
public:
static Tile* first; // Static member variable (one instance for the ...
Direction breadcrumb; // Stores direction of the previous tile, needed for ...
int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
int8_t y; // y coordinate of the tile. Increasing in UP direction.
...
}
"breadcrumb" je tipa "Direction", znači poprima vrijednosti "UP", "LEFT", "DOWN", "RIGHT" i "NOWHERE".
Uočite da ovdje nismo pakirali podatak u bitove, nego smo potrošili cijeli bajt.
Da smo bili štedljiviji, stavili bismo ovu varijablu u slobodnih 6 bitova varijable "_surface".
Koordinate
class Tile {
uint8_t _wall; // 1 byte stores statuses for all 2 walls enclosing ...
uint8_t _surface; // 1 byte stores surface and other data. Bit 7:6 ...
Tile* _chain; // Pointer to the next tile in chain.
public:
static Tile* first; // Static member variable (one instance for the ...
Direction breadcrumb; // Stores direction of the previous tile, needed for ...
int8_t x; // x coordinate of the tile. Increasing in RIGHT direction.
int8_t y; // y coordinate of the tile. Increasing in UP direction.
...
}
Ova su 2 podatka x i y koordinate pločice.
Kako bi brojevi mogli u općem slučaju biti dosta veliki, nismo ih pakirali u bitove.
Zadatak: broj bitova
Koliko je bitova potrebno za spremanje varijable tipa "Direction"?
Primjedbe
Projekt "Uvod u robotiku" sufinanciran je iz Europskog socijalnog fonda, poziv "Jačanje kapaciteta organizacija civilnoga društva za popularizaciju STEM-a".
Relevantne stranice:
Sadržaj vježbe za virtualne radionice isključiva je odgovornost Hrvatskog društva za robotiku.