/* Project B (Robot Control) */ /* Computer Fundamentals B (433-142) */ /* Name: Colin Cheong */ /* Student ID: 134835 */ /* Email: colche@pcpostal.com */ #include #include #define MAXROWS 40 #define MAXCOLS 80 /*max map size is 40 by 80 as noted on project sheet*/ /*function prototype*/ void get_map (char map[][MAXCOLS], int nrows, int *plines ); void print_map (char map[][MAXCOLS], int lines); void movementfunction( char map[][MAXCOLS], int lines); int checkpackagefwd( char map[][MAXCOLS], char, int); int movepackagefwd( char map[][MAXCOLS], char, int); int checkpackagedown( char map[][MAXCOLS], char, int); int movepackagedown( char map[][MAXCOLS], char, int); int checkpackageright( char map[][MAXCOLS], char, int); int movepackageright( char map[][MAXCOLS], char, int); int checkpackageleft( char map[][MAXCOLS], char, int); int movepackageleft( char map[][MAXCOLS], char, int); int definepackage (char); /*main function begin*/ /*========================================*/ int main (void) { char map[MAXROWS][MAXCOLS]; int lines; get_map( map, MAXROWS, &lines); movementfunction(map, lines); return 0; } /*main function end*/ /*========================================*/ /*function to get initial map input stored into array*/ /*========================================*/ void get_map (char map[][MAXCOLS], int nrows, int *plines ) { int row = 0, col = 0; char keyinput; while ((keyinput=getchar() ) != '(' ) { if (keyinput == '\n') { map[row][col] = '\n'; row++; col = 0; } else { map[row][col] = keyinput; col++; } } *plines = (row - 2); /*save row size of map*/ return; } /*function to print map onto screen*/ /*========================================*/ void print_map (char map[][MAXCOLS], int lines) { int row = 0, col = 0; while (row<=lines){ if ((map[row][col]) == '\n'){ printf( "%c", map[row][col]); col = 0; row++; } else if (col==MAXCOLS) { printf( "%c", map[row][col]); col = 0; row++; } else { printf( "%c", map[row][col]); col++; } } printf("\n"); return; } /*function to get robot to move around map*/ /*========================================*/ void movementfunction (char map[][MAXCOLS], int lines) { int col, row; char keyinput; while ((keyinput=getchar()) != ')') { /*instruction set L is given, rotate robot left*/ if (keyinput == 'L') { for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if ((map[row][col]) == '^') map[row][col] = '<'; else if ((map[row][col]) == '<') map[row][col] = 'v'; else if ((map[row][col]) == 'v') map[row][col] = '>'; else if ((map[row][col]) == '>') map[row][col] = '^'; } } } /*instruction set R is given, rotate robot left*/ if (keyinput == 'R') { for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if ((map[row][col]) == '^') map[row][col] = '>'; else if ((map[row][col]) == '>') map[row][col] = 'v'; else if ((map[row][col]) == 'v') map[row][col] = '<'; else if ((map[row][col]) == '<') map[row][col] = '^'; } } } /*instruction set F is given, move robot forward*/ if (keyinput == 'F') { for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if ((map[row][col]) == '^'){ if ((map[row-1][col]) == '*'){ map[row][col]= '^'; } else if (map[row-1][col] == ' ') { map[(row-1)][col] = '^'; map[row][col] = '.'; } else if (map[row-1][col] == '.') { map[(row-1)][col] = '^'; map[row][col] = '.'; } /*else if ((definepackage(map[row-1][col])) == 0){ /*if target area is package? if ((checkpackagefwd(map, map[(row-1)][col], lines)) != 0 ) { movepackagefwd(map, map[(row-1)][col], lines); map[row][col] = '.'; map[row-1][col] = '^'; } }*/ } else if ((map[row][col]) == '>'){ if (map[row][col+1] == '*'){ /*if target is wall*/ map[row][col] = '>'; } else if (map[row][col+1] == ' ') { map[row][(col+1)] = '>'; map[row][col] = '.'; col += 2; /* needed to skip count*/ } else if (map[row-1][col] == '.' ){ map[row][(col+1)] = '>'; map[row][col] = '.'; col += 2; } /*else if ((checkpackageright(map, map[(row)][col+1], lines)) != 0 ) { movepackageright(map, map[row][col+1], lines); map[row][col] = '.'; map[row][col+1] = '>'; col += 2; }*/ } if ((map[row][col]) == 'v'){ if ((map[row+1][col]) == '*'){ map[row][col] = 'v'; } else if(map[row+1][col] == ' ') { map[(row+1)][col] = 'v'; map[row][col] = '.'; col = 0; row += 2; } else if(map[row+1][col] == '.') { map[(row+1)][col] = 'v'; map[row][col] = '.'; col = 0; row += 2; } else if ((definepackage(map[row+1][col])) == 0){ /*if target area is package?*/ if ((checkpackagedown(map, map[row+1][col], lines)) != 0 ) { movepackagedown(map, map[row+1][col], lines); } } } if ((map[row][col]) == '<'){ if ((map[row][col-1]) == '*'){ map[row][col] = '<'; } else if (map[row][col-1] == ' ') { map[(row)][col-1] = '<'; map[row][col] = '.'; } else if (map[row][col-1] == '.') { map[(row)][col-1] = '<'; map[row][col] = '.'; } else if ((definepackage(map[row][col-1])) == 0){ /*if target area is package?*/ if ((checkpackageleft(map, map[(row)][col-1], lines)) != 0 ) { movepackageleft(map, map[(row)][col-1], lines); } } } } } } /*instruction set P is given, print out map on screen*/ if (keyinput == 'P') print_map( map, lines); } return; } /*function to check if package can move forward up*/ /*========================================*/ int checkpackagefwd (char map[][MAXCOLS], char package, int lines){ /*variable definitions*/ int row, col, indicator = 1; /*for all instances of package in map, check the movement above is not blocked off by a wall, if it is, return 0 to the indicator variable to indicate move forward cannot be made*/ for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if ((map[row][col]) == package) { /*check for all intances of package*/ if (map[row-1][col] == '*') /*if area ahead is wall*/ indicator *= 0; else if (map[row-1][col] == '.') /*if area ahead is trail*/ indicator = (indicator * 1); else if (map[row-1][col] == ' ') /*if area ahead is empty*/ indicator = (indicator * 1); else if (map[row-1][col] != package){ /*must have hit another package*/ if (definepackage(map[row-1][col]) == 0) { if ((checkpackagefwd (map, map[row-1][col], lines)) == 0) indicator = (indicator * 0); else indicator = (indicator * 1); } } } } } return indicator; } /*function to move a whole package and any connected packages forward up*/ /*========================================*/ int movepackagefwd (char map[][MAXCOLS], char package, int lines){ int row, col; for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if (map[row][col] == package) { if (map[row-1][col] == ' '){ map[row-1][col] = map[row][col]; map[row][col] = ' '; } else if ((map[row-1][col]) == '.') { map[row-1][col] = map[row][col]; map[row][col] = ' '; } else if ((map[row-1][col]) != package) { movepackagefwd (map, map[row-1][col], lines); map[row-1][col] = package; } } } } return 0; } /*function to see if package is defined*/ /*========================================*/ int definepackage (char package){ if (package == 'A') return 0; if (package == 'B') return 0; if (package == 'C') return 0; if (package == 'D') return 0; if (package == 'E') return 0; if (package == 'F') return 0; if (package == 'G') return 0; else if (package == 'H') return 0; else if (package == 'I') return 0; else if (package == 'J') return 0; else if (package == 'K') return 0; else if (package == 'L') return 0; else if (package == 'M') return 0; else if (package == 'N') return 0; else if (package == 'O') return 0; else if (package == 'P') return 0; else if (package == 'Q') return 0; else if (package == 'R') return 0; else if (package == 'S') return 0; else if (package == 'T') return 0; else if (package == 'U') return 0; else if (package == 'V') return 0; else if (package == 'W') return 0; else if (package == 'X') return 0; else if (package == 'Y') return 0; else if (package == 'Z') return 0; return 1; } /*function to check if package can move forward left*/ /*========================================*/ int checkpackageleft (char map[][MAXCOLS], char package, int lines){ /*variable definitions*/ int row, col, indicator = 1; /*for all instances of package in map, check the movement above is not blocked off by a wall, if it is, return 0 to the indicator variable to indicate move forward cannot be made*/ for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if ((map[row][col]) == package) { /*check for all intances of package*/ if (map[row][col-1] == '*') /*if area ahead is wall*/ indicator = (indicator * 0); else if (map[row][col-1] == '.') /*if area ahead is trail*/ indicator = (indicator * 1); else if (map[row][col-1] == ' ') /*if area ahead is empty*/ indicator = (indicator * 1); else if (map[row][col-1] != package){ /*must have hit another package*/ if ((checkpackageleft (map, map[row][col-1], lines)) == 0) indicator = (indicator * 0); else indicator = (indicator * 1); } } } } return indicator; } /*function to move a whole package and any connected packages forward left*/ /*========================================*/ int movepackageleft (char map[][MAXCOLS], char package, int lines){ int row, col; for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if (map[row][col] == package) { if (map[row][col-1] == ' '){ map[row][col-1] = map[row][col]; map[row][col] = ' '; } else if (map[row][col-1] == '.') { map[row][col-1] = map[row][col]; map[row][col] = ' '; } else if (map[row][col-1] != package) { movepackageleft (map, map[row][col-1], lines); map[row][col-1] = package; } } } } for (row = 0; row < lines; row++){ for (col = 0; col < MAXCOLS; col++) { if (map[row][col] == '<') { map[row][col-1] = '<'; map[row][col] = '.'; } } } return 0; } /*todo list i. 'F' for right ii. 'F'for down remember, to use negative counter to stop catch repititions */ /*function to check if package can move forward right*/ /*========================================*/ int checkpackageright (char map[][MAXCOLS], char package, int lines){ /*variable definitions*/ int row = lines, col = MAXCOLS, indicator = 1; if (row >= 0) { if (col >= 0) { if ((map[row][col]) == package) { /*check for all intances of package*/ if (map[row][col+1] == '*') /*if area ahead is wall*/ indicator *= 0; else if (map[row][col+1] == '.') /*if area ahead is trail*/ indicator *= 1; else if (map[row][col+1] == ' ') /*if area ahead is empty*/ indicator *= 1; else if (map[row][col+1] == package) indicator *= 1; else col--; } else row --; } } /* else if (map[row][col+1] != package){ if ((checkpackageright (map, map[row][col+1], lines)) == 0) indicator *= 0; else indicator *= 1; }*/ return indicator; } /*function to move a whole package and any connected packages forward right*/ /*========================================*/ int movepackageright (char map[][MAXCOLS], char package, int lines){ int row, col; for (row = lines; row >= 0; row--){ for (col = MAXCOLS; col >= 0; col--) { if (map[row][col] == package) { if (map[row][col+1] == ' '){ map[row][col+1] = map[row][col]; map[row][col] = ' '; } else if (map[row][col+1] == '.') { map[row][col+1] = map[row][col]; map[row][col] = ' '; } else if (map[row][col+1] != package) { movepackageright (map, map[row][col+1], lines); map[row][col+1] = package; } } } } return 0; } /*function to check if package can move forward down*/ /*========================================*/ int checkpackagedown (char map[][MAXCOLS], char package, int lines){ /*variable definitions*/ int row, col, indicator = 1; for (row = lines; row >= 0; row--){ for (col = MAXCOLS; col >= 0; col--) { if ((map[row][col]) == package) { /*check for all intances of package*/ if (map[row+1][col] == '*') /*if area ahead is wall*/ indicator = (indicator * 0); else if (map[row+1][col] == '.') /*if area ahead is trail*/ indicator = (indicator * 1); else if (map[row+1][col] == ' ') /*if area ahead is empty*/ indicator = (indicator * 1); else if (map[row+1][col] != package){ /*must have hit another package*/ if ((checkpackagedown (map, map[row][col+1], lines)) == 0) indicator = (indicator * 0); else indicator = (indicator * 1); } } } } return indicator; } /*function to move a whole package and any connected packages forward down*/ /*========================================*/ int movepackagedown (char map[][MAXCOLS], char package, int lines){ int row, col; for (row = lines; row >= 0; row--){ for (col = MAXCOLS; col >= 0; col--) { if (map[row][col] == package) { if (map[row+1][col] == ' '){ map[row+1][col] = map[row][col]; map[row][col] = ' '; } else if (map[row+1][col] == '.') { map[row+1][col] = map[row][col]; map[row][col] = ' '; } else if (map[row+1][col] != package) { movepackagedown (map, map[row+1][col], lines); map[row+1][col] = package; } } } } for (row =lines; row >= 0; row--){ for (col = MAXCOLS; col >= 0; col--) { if (map[row][col] == 'v') { map[row+1][col] = 'v'; map[row][col] = '.'; } } } return 0; }