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.
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.
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.
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.
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.
Ispišite trenutnu poziciju robota u labirintu kao znak "x" na tom polju.