Hrvatsko društvo za robotiku - Uvod u robotiku - vježbe

Inicijalizacija i dodavanje pločice

Cilj

Kako inicijalizirati strukturu u koje se sprema labirint.

Konstruktor

Tile::Tile(int8_t xNow, int8_t yNow, Direction breadcrumbNow) {
...
}
Pronađite dio koda u "mrm-robot-maze.cpp" koji počinje s "Tile::Tile". To je konstruktor, dio koda koji će se automatski izvršiti za svaki novostvoreni objekt te klase. U njemu ćemo inicijalizirati što želimo.

U zagradi su 3 argumenta, 3 podatka koje predajemo objektu prilikom kreiranje.

"xNow" i "yNow" su x i y koordinate pločice.

"breadcrumbNow" je smjer u kojem se vraćamo na prethodno polje.

Pridruživanje

Tile::Tile(int8_t xNow, int8_t yNow, Direction breadcrumbNow) {
	x = xNow;
	y = yNow;
	breadcrumb = breadcrumbNow;
...
}
Prve 3 naredbe spremaju vrijednosti, dobivene iz parametara s kojima je pozvano kreiranje pločice, u interne varijable, koje ima svaka pločica.

Prva pločica

Tile::Tile(int8_t xNow, int8_t yNow, Direction breadcrumbNow) {
	x = xNow;
	y = yNow;
	breadcrumb = breadcrumbNow;
	if (breadcrumb != NOWHERE) { // Otherwise it is the ...
		...
	}

}
Ako smo pozvali kreiranje pločice bez puta do prethodne pločice, onda znači da je to prva pločica, jer ta jedina nema prethodnika.

U tom slučaju ne trebamo tražiti prethodnu - jer je nema.

Kraj lanca

Tile::Tile(int8_t xNow, int8_t yNow, Direction breadcrumbNow) {
	x = xNow;
	y = yNow;
	breadcrumb = breadcrumbNow;
	if (breadcrumb != NOWHERE) { // Otherwise it is the ...
		// Iterate all the tiles in order to find the last one.
		Tile* tile = NULL;
		for (tile = first; tile->_chain != NULL; tile = tile->_chain)
			;
		if (tile != NULL)
			tile->_chain = this; // Set last tile's link to this, newly created, tile.
	}
}
Ako smo, za razliku od prošlog slučaja, upisali iz kojeg smjera se dolazi iz prethodne pločice, moramo naći koja je to u nizu. Podsjetimo se, pločice su nanizane jedna iza druge. Redoslijed je određen vremenom kreiranja.

Tražena pločica je posljednja, ali mi nigdje nemamo varijablu koja to pamti (mogli bismo imati).

Ne preostaje nam ništa drugo, nego krenuti od prve pločice i pratiti veze sve do posljednje.

Kad nađemo posljednju, dodamo novu kariku, pločicu koja se upravo kreira.

Tile* tile = NULL; će kreirati pointer na pločicu i on će pokazivati kasnije redom na sve pločice u lancu. Zasad ne pokazuje na išta.

U foru će pokazivač slijediti veze i napredovati po lancu, sve dok veza na sljedeću pločicu ("_chain") postoji (nije NULL).

Zadnja linija postavlja vezu s nađenog kraja lanca na novokreiranu pločicu (na koju pokazuje "this").

Završno pridruživanje

Tile::Tile(int8_t xNow, int8_t yNow, Direction breadcrumbNow) {
	x = xNow;
	y = yNow;
	breadcrumb = breadcrumbNow;
	if (breadcrumb != NOWHERE) { // Otherwise it is the ...
		// Iterate all the tiles in order to find the last one.
		Tile* tile = NULL;
		for (tile = first; tile->_chain != NULL; tile = tile->_chain)
			;
		if (tile != NULL)
			tile->_chain = this; // Set last tile's link to this, newly created, tile.
	}
	_chain = NULL; // As this is the new end of chain, ..
	_wall = 0b01010101; // Unknown walls, stored in bits.
}
Označimo da "_chain" više ne pokazuje nikamo, jer je to sad novi kraj lanca.

U varijablu, koja označava zidove, spremimo da su sva 4 zida nepoznata.

Zadatak: dvostruko vezana lista.

Zadatak za napredne. Unesite u "Tile" novo polje, koje će pokazivati na prethodnu pločicu.

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.