za
Fork of m3pi by
Resources.h
- Committer:
- s4stevo
- Date:
- 2013-11-16
- Revision:
- 14:4739a7ef4251
- Parent:
- 13:f55ec972be61
File content as of revision 14:4739a7ef4251:
enum WALLS { EMPTY = 0x00, RIGHT = 0x01, LEFT = 0x02, BOTTOM = 0x04, TOP = 0x08, NTOP = 0x07, NBOTTOM = 0x0B, NLEFT = 0x0D, NRIGHT = 0x0E, FULL = 0x0F }; enum DIRECTION { NORTH = 0, EAST = 1, SOUTH = 2, WEST = 3, }; enum OPERATION { HALT = 0x00, FORWARD = 0x01, TURN_RIGHT = 0x02, TURN_LEFT = 0x03, TURN_AROUND = 0x04, SENSE_RIGHT = 0x05, SENSE_LEFT = 0x06, SENSE_FRONT = 0x07, }; int orientation = 0; void updateOrientation(signed int change) { orientation += change; orientation %= 4; }; const int size = 16; unsigned char maze1s[16][16] = { // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {0xA, 0xC, 0xC, 0xD, 0xE, 0xC, 0x9, 0xF, 0xA, 0xC, 0xC, 0xD, 0xE, 0x8, 0xC, 0xD}, // 1 {0x3, 0xB, 0xA, 0xD, 0xA, 0xD, 0x2, 0x8, 0x4, 0xC, 0xC, 0xC, 0xC, 0x4, 0xC, 0xD}, // 2 {0x3, 0x2, 0x5, 0xE, 0x4, 0xC, 0x5, 0x3, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 3 {0x3, 0x3, 0xB, 0xA, 0xC, 0xC, 0x8, 0x1, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 4 {0x3, 0x3, 0x3, 0x6, 0xC, 0x9, 0x3, 0x3, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 5 {0x6, 0x4, 0x4, 0xC, 0xC, 0x1, 0x3, 0x3, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 6 {0xA, 0xC, 0xC, 0xC, 0x9, 0x3, 0x2, 0x4, 0xC, 0x9, 0xA, 0xC, 0xC, 0xC, 0xC, 0x9}, // 7 {0x6, 0xC, 0x8, 0x9, 0x3, 0x3, 0x3, 0xA, 0x9, 0x3, 0x2, 0xC, 0xC, 0xC, 0xD, 0x3}, // 8 {0xB, 0xB, 0x3, 0x3, 0x3, 0x2, 0x1, 0x6, 0x4, 0x1, 0x2, 0xC, 0xC, 0xD, 0xB, 0x3}, // 9 {0x2, 0x5, 0x3, 0x3, 0x3, 0x3, 0x6, 0xC, 0xC, 0x4, 0x4, 0x9, 0xA, 0x9, 0x3, 0x3}, // 10 {0x3, 0xB, 0x7, 0x3, 0x3, 0x7, 0xA, 0xC, 0xC, 0xC, 0x8, 0x5, 0x2, 0x4, 0x4, 0x1}, // 11 {0x3, 0x2, 0x8, 0x1, 0x6, 0xD, 0x2, 0xC, 0xC, 0x9, 0x6, 0xC, 0x4, 0xC, 0x9, 0x3}, // 12 {0x3, 0x3, 0x3, 0x3, 0xA, 0xC, 0x4, 0xC, 0x9, 0x6, 0xC, 0xC, 0xC, 0x9, 0x3, 0x3}, // 13 {0x3, 0x3, 0x3, 0x3, 0x2, 0xC, 0xC, 0xC, 0x4, 0x8, 0xC, 0xC, 0xD, 0x3, 0x3, 0x3}, // 14 {0x6, 0x5, 0x3, 0x6, 0x0, 0xC, 0xC, 0xC, 0xD, 0x3, 0xE, 0xC, 0xC, 0x1, 0x7, 0x7}, // 15 {0xE, 0xC, 0x4, 0xC, 0x4, 0xC, 0xC, 0xC, 0xD, 0x6, 0xC, 0xC, 0xC, 0x4, 0xC, 0xD} // 16 }; unsigned char maze1[16][16] = { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 0 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 1 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 2 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 3 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 4 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF}, // 5 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xD, 0x8, 0xC, 0x8, 0x9, 0xA, 0x9}, // 6 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xD, 0x0, 0x9, 0x3, 0x3, 0x3, 0x3}, // 7 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0x3, 0x2, 0x1, 0x3, 0x3, 0x3}, // 8 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xE, 0x1, 0x7, 0x2, 0x1, 0x3, 0x3}, // 9 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xA, 0x5, 0xE, 0x5, 0x6, 0x1, 0x3}, // 10 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0x3, 0xA, 0x1, 0xA, 0x9, 0x3, 0x3}, // 11 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3}, // 12 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3}, // 13 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0x6, 0x5, 0x2, 0x5, 0x3, 0x3, 0x3}, // 14 {0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xF, 0xD, 0xC, 0x4, 0xD, 0x6, 0x5, 0x7}, // 15 }; signed int maze1F[16][16] = { // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //1 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //3 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //5 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //7 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, //10 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 12 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, // 14 {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}, {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1} // 16 }; // Visual Functions void printmaze(); void printflood(); // important Functions void floodStep(); void findPath(); void createDirections(); // CELL[i][j] <---> BYTE unsigned char cellToByte(int i, int j) { unsigned char byteVal = 0; int newi = i; int newj = j; if(newi >= 8) { byteVal += 0x80; newi-=8; } if(newi >= 4) { byteVal += 0x40; newi-=4; } if(newi >= 2) { byteVal += 0x20; newi-=2; } if(newi >= 1) { byteVal += 0x10; newi--; } if(newj >= 8) { byteVal += 0x8; newj-=8; } if(newj >= 4) { byteVal += 0x4; newj-=4; } if(newj >= 2) { byteVal += 0x2; newj-=2; } if(newj >= 1) { byteVal += 0x1; newj--; } return byteVal; } unsigned int colFromByte(unsigned char byte) { return (byte & 0x0F); } unsigned int rowFromByte(unsigned char byte) { return colFromByte((byte >> 4)); } int highestSurrounding(int r, int c) { int top = -1; if(r > 0 && !(maze1[r][c] & TOP)) top = maze1F[r-1][c]; int bottom = -1; if(r < size-1 && !(maze1[r][c] & BOTTOM)) bottom = maze1F[r+1][c]; int left = -1; if(c > 0 && !(maze1[r][c] & LEFT)) left = maze1F[r][c-1]; int right = -1; if(c < size-1 && !(maze1[r][c] & RIGHT) ) right = maze1F[r][c+1]; int max = top; if(bottom > max) max = bottom; if(left > max) max = left; if(right > max) max = right; return max; } // Global Vars int startRow = 15; // Start loc int startCol = 15; int destRow = 9; // Destination loc int destCol = 9; int currRow = startRow; // Current Loc int currCol = startCol; unsigned int Movements[5000]; int moveCounter = 0; int currentDistance = 0; // Flooding unsigned char* directions; void floodStep() { currentDistance++; int changed = 0; unsigned char changes[256]; for(int i = 0; i < size; i++) { for(int j = 0; j < size; j++) { if(maze1F[i][j] != -1) { continue; } else { if(highestSurrounding(i,j) != -1) { changes[changed] = cellToByte(i, j); changed++; } } } } for(int k = 0; k < changed; k++) { maze1F[rowFromByte(changes[k])][colFromByte(changes[k])] = currentDistance; } } void findPath() { int i = destRow; int j = destCol; int di = 0; int dj = 0; int counter = 0; directions = new unsigned char[currentDistance]; while((i != startRow) || (j != startCol)) { int min = maze1F[i][j]; if(i > 0 && !(maze1[i][j] & TOP)) { if(maze1F[i-1][j] < min && maze1F[i-1][j] != -1) { min = maze1F[i-1][j]; di = -1; dj = 0; } } if(i < size-1 && !(maze1[i][j] & BOTTOM)) { if(maze1F[i+1][j] < min && maze1F[i+1][j] != -1) { min = maze1F[i+1][j]; di = 1; dj = 0; } } if(j > 0 && !(maze1[i][j] & LEFT)) { if(maze1F[i][j-1] < min && maze1F[i][j-1] != -1) { min = maze1F[i][j-1]; di = 0; dj = -1; } } if(j < size-1 && !(maze1[i][j] & RIGHT)) { if(maze1F[i][j+1] < min && maze1F[i][j+1] != -1) { min = maze1F[i][j+1]; di = 0; dj = 1; } } i += di; j += dj; counter++; unsigned char byteVal = cellToByte(i, j); directions[currentDistance - counter] = byteVal; } } void turnRight() { updateOrientation(1); } void turnLeft() { updateOrientation(3); } void createDirections() { int prevRow = rowFromByte(directions[0]); int prevCol = colFromByte(directions[0]); unsigned char prevByte = directions[0]; directions[currentDistance] = cellToByte(destRow, destCol); for(int d = 1; d <= currentDistance; d++) { int row = rowFromByte(directions[d]); int col = colFromByte(directions[d]); unsigned char byte = directions[d]; switch(orientation) { case NORTH: switch((prevByte-byte)) { case -1: // GO RIGHT ONE CELL Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; case 1: // GO LEFT Movements[moveCounter++] = TURN_LEFT; turnLeft(); Movements[moveCounter++] = FORWARD; break; case 16: // GO UP Movements[moveCounter++] = FORWARD; break; case -16:// GO DOWN Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; } break; case EAST: switch((prevByte-byte)) { case -1: Movements[moveCounter++] = FORWARD; break; case 1: Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; case 16: Movements[moveCounter++] = TURN_LEFT; turnLeft(); Movements[moveCounter++] = FORWARD; break; case -16: Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; } break; case SOUTH: switch((prevByte-byte)) { case -1: Movements[moveCounter++] = TURN_LEFT; turnLeft(); Movements[moveCounter++] = FORWARD; break; case 1: Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; case 16: Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; case -16: //DOWN Movements[moveCounter++] = FORWARD; break; } break; case WEST: switch((prevByte-byte)) { case -1: Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; case 1: Movements[moveCounter++] = FORWARD; break; case 16: Movements[moveCounter++] = TURN_RIGHT; turnRight(); Movements[moveCounter++] = FORWARD; break; case -16: Movements[moveCounter++] = TURN_LEFT; turnLeft(); Movements[moveCounter++] = FORWARD; break; } break; } prevRow = row; prevCol = col; prevByte = byte; } Movements[moveCounter++] = HALT; } void calcFlood() { //THIS IS WHERE WE SET THE DESTINATION AND START VALUES; //OR IN THE HEADER... WHO CARES? // IF this cond is true, then the mouse begins with the REST of the maze on its right and is facing north if(false) // if pin != 1 { orientation = 0; startRow = 15; startCol = 0; } else { orientation = 0; startRow = 15; startCol = 15; } maze1F[startRow][startCol] = 0; while(maze1F[destRow][destCol] == -1) { floodStep(); } findPath(); createDirections(); }