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

Crtanje labirinta

Cilj

Na ekranu nacrtati labirint.

Ekstremi

void RobotMaze::mazePrint() {
	// First find minimum and maximum for both coordinates.
	int8_t minX = 127;
	int8_t maxX = -128;
	int8_t minY = 127;
	int8_t maxY = -128;
	for (Tile* tile = Tile::first; tile != NULL; tile = tile->next()) {
		if (tile->x > maxX)
			maxX = tile->x;
		if (tile->x < minX)
			minX = tile->x;
		if (tile->y > maxY)
			maxY = tile->y;
		if (tile->y < minY)
			minY = tile->y;
	}
	print("(%i, %i) - (%i, %i)\n\r", minX, maxX, minY, maxY);
	...
}

Pronađimo najveće i najmanje x i y koordinate.

Na kraju ih ispišemo na ekran.

Gornji rub

void RobotMaze::mazePrint() {
	...

	// Print the maze line by line, starting with its top (max. y). 
		The only way beacuse of the scrolling nature of a terminal 
		(text) screen.
	for (int16_t y = maxY; y >= minY; y--) {
		// Upper border. When on the top (max. y), first display 
			the top border. Afterwards display in each step 
			only bottom walls.
		if (y == maxY) {
			print("┌"); // UTF-8 sign. Note that You must have an 
				UTF-8 capable terminal. Otherwise, this sign will not show.
			for (int16_t x = minX; x <= maxX; x++) {
				wallDisplay(wallGet(x, y, Direction::UP), Direction::UP); 
				print(x == maxX ? "┐" : "┬"); // Always print crosses 
					between corner of the tiles.
			}
			print("\n\r"); // Upper border printed, end the line.
		}
	}
	...
}

"for" ide od maksimalne do minimalne y koordinate.

Prvi "if" izdvaja maksimalni y, gornji red labirinta.

Prvi "print()" ispisuje gornji, lijevi kut labirinta. Izabrali smo takav Unicode znak.

Nakon toga idemo po x koordinati od minimuma (najljevija pločica) do maksimuma (najdesnija).

Kako se krećemo redom po pločicama, uvijek ispisujemo samo njihov gornji rub.

Sam ispis radi funkcija "wallDisplay()". Prvi argument je status zida (ima ga, nema,...). Drugi njen argument je "UP", znači da ispisujemo gornji rub.

Status zida se dobije funkcijom "wallGet()". Možete provjeriti u kodu kako izgledaju ove 2 funkcije.

Nakon svakog zida ispišemo još jedan znak, spojnicu između 2 polja. Znači, zid se ispisuje: kut, zid, spojnica, zid, spojnica,..., kut.

Lijevi rub

void RobotMaze::mazePrint() {
	...

	for (int16_t y = maxY; y >= minY; y--) {
		...

		// Left border. For each row, first print its left wall. 
			Then for, each tile, its right wall.
		wallDisplay(wallGet(minX, y, Direction::LEFT), Direction::LEFT);

		...
	}
}

Ispisali smo gornji rub pločice, idemo sad prvi bočni zid, lijevi rub labirinta.

"wallGet()" gleda lijevi zid, "wallDisplay()" dobije iz prošle funkcije status tog, lijevog zida i drugi argument daje funkciji "wallDisplay()" informaciju da ispisujemo lijevi zid.

Ostali bočni zidovi

void RobotMaze::mazePrint() {
	...
	for (int16_t y = maxY; y >= minY; y--) {
		...

		// Right walls of each tile
		for (int16_t x = minX; x <= maxX; x++) {
			print(" ");
			wallDisplay(wallGet(x, y, Direction::RIGHT), Direction::RIGHT);
		}
		print("\n\r"); // This completes vertical middle for this row. 
			The next are bottom walls.

		...
	}
}

Na sličan način ispisujemo desni rub svake pločice, s tim da se sredina ispisuje kao praznina.

Donji zidovi

void RobotMaze::mazePrint() {
	...
	for (int16_t y = maxY; y >= minY; y--) {
		...

		// Bottom walls
		print(y == minY ? "└" : "├");
		for (int16_t x = minX; x <= maxX; x++) {
			wallDisplay(wallGet(x, y, Direction::DOWN), Direction::DOWN);
			print(x == maxX ? (y == minY ? "┘" : "┤") : 
				(y == minY ? "┴" : "┼"));
		}
		print("\n\r");
	}
}

Na kraju ispišemo i donje zidove.

Zadatak: pozicija

Ispišite trenutnu poziciju robota u labirintu kao znak "x" na tom polju.

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.