// File: main4.cpp // // Last update: 03/19/2007 // // See Project 2 description for documentation. // This is the one used for grading. // #include #include #include #include #include "proj2.h" #include "Car.h" #include "RaceCourse.h" using namespace std ; // This function initializes the obstacle vector. // The "input" is almost WYSIWYG. // // Warning! Does not check for size compatibility // with RaceCourse constructor. // // Make sure all the rows are the same length. void SetObstacles(vector& obs) { vector V ; // WYSIWYG Obstacle Constructor?? // // 0123456789012345678901 V.push_back("######################") ; V.push_back("# #################") ; V.push_back("# # #") ; V.push_back("# ############ # #") ; V.push_back("# ## # #") ; V.push_back("# ########## ## # #") ; V.push_back("# ## ## # #") ; V.push_back("# ######## ## ## # #") ; V.push_back("# ### ## ## # #") ; V.push_back("###### ### ## ## #####") ; V.push_back("# # # #") ; V.push_back("# #### ##### ### #") ; V.push_back("# # # #") ; V.push_back("# ### #########") ; V.push_back("##### # #") ; V.push_back("# ######### #") ; V.push_back("##### # # #") ; V.push_back("# # ## #####") ; V.push_back("# ###### # #") ; V.push_back("### # # ###### #") ; V.push_back("# #") ; V.push_back("######################") ; // Set obstacles // No need to set outside perimeter unsigned int i, j, rows, cols ; Position X ; rows = V.size() ; assert(rows > 0) ; cols = V.at(0).length() ; for (i=1 ; i < rows-1 ; i++) { assert( cols == V.at(i).length() ); for (j = 1 ; j < cols-1 ; j++) { if (V.at(i).at(j) == '#') { X.row = i ; X.col = j ; obs.push_back(X) ; } } } } void SetObstacles2(vector& obs) { vector V ; // WYSIWYG Obstacle Constructor?? // // 0123456789012345678901 V.push_back("####################") ; // 0 V.push_back("# # #") ; V.push_back("# #") ; V.push_back("# #") ; V.push_back("# #") ; V.push_back("# #") ; // 5 V.push_back("# ##################") ; V.push_back("# # #") ; V.push_back("# #") ; V.push_back("# #") ; V.push_back("# #") ; V.push_back("####################") ; // 10 V.push_back("# #") ; V.push_back("# #") ; V.push_back("# #") ; // 13 V.push_back("####################") ; // Set obstacles // No need to set outside perimeter unsigned int i, j, rows, cols ; Position X ; rows = V.size() ; assert(rows > 0) ; cols = V.at(0).length() ; for (i=1 ; i < rows-1 ; i++) { assert( cols == V.at(i).length() ); for (j = 1 ; j < cols-1 ; j++) { if (V.at(i).at(j) == '#') { X.row = i ; X.col = j ; obs.push_back(X) ; } } } } // Make car zoom in given direction // void DoZoom(Car *Cptr, char dir) { switch(dir) { case 'u' : Cptr->ZoomUp() ; break ; case 'd' : Cptr->ZoomDown() ; break ; case 'l' : Cptr->ZoomLeft() ; break ; case 'r' : Cptr->ZoomRight() ; break ; default: cerr << "Someone messed up!\n" ; exit(1) ; } ; } void CerrPrintStatus(RaceStatus s) { switch(s) { case WAITING : cerr << "Status: WAITING\n" ; break ; case STARTED : cerr << "Status: STARTED\n" ; break ; case FINISHED : cerr << "Status: FINISHED\n" ; break ; case STALEMATE : cerr << "Status: STALEMATE\n" ; break ; default: cout << "Status: UNKNOWN (Bad)\n" ; } return ; } bool CheckAnswer(RaceCourse *Rptr, Car *Cptr, int i, Position AnswerPos[], unsigned int AnswerFuel[], RaceStatus AnswerStatus[] ) { // return true ; Position p ; unsigned int f ; RaceStatus s ; bool pass = true ; p = Cptr->GetPosition() ; f = Cptr->GetFuelLevel() ; s = Rptr->GetRaceStatus() ; if (p.row != AnswerPos[i].row || p.col != AnswerPos[i].col) { pass = false ; cerr << "Error in move " << i << ": " ; cerr << " Position should be: (" << AnswerPos[i].row << "," << AnswerPos[i].col << ")\n" ; cerr << " Position reported: (" << p.row << "," << p.col << ")\n" ; } if (f != AnswerFuel[i]) { pass = false ; cerr << "Error in move " << i << ": " ; cerr << " Fuel level should be: " << AnswerFuel[i] << "\n" ; cerr << " Fuel level reported: " << f << "\n" ; } if (s != AnswerStatus[i]) { pass = false ; cerr << "Error in move " << i << ": " ; cerr << " Status should be: " ; CerrPrintStatus(AnswerStatus[i]) ; cerr << " Status reported: " ; CerrPrintStatus(s) ; } return pass ; } int main() { int errors1 = 0 , errors2 = 0 ; // ------------------------------------------------------------------- { // BEGIN local scope for TEST 1 vector obs ; Car *CarPtr1, *CarPtr2, *CarPtr3, *CarPtr4 ; Position AnswerPos[] = { {8,1}, {6,2}, {4,3}, {2,4}, {8,6}, {6,10}, {4,13}, {2,16}, {10,6}, {10,10}, {10,13}, {10,16}, {10,1}, {10,8}, {10,14}, {10,20}, {13,1}, {12,8}, {12,14}, {12,20}, {13,6}, {12,5}, {12,10}, {12,11}, {15,6}, {17,5}, {14,10}, {14,11}, {15,1}, {17,1}, {14,10}, {14,20}, {15,8}, {18,1}, {14,19}, {16,20}, {17,8}, {18,3}, {16,19}, {16,20}, {17,1}, {20,3}, {16,10}, {16,11}, {18,1}, {20,1}, {16,10}, {16,11} } ; unsigned int AnswerFuel[] = { 63, 65, 67, 69, 58, 57, 57, 57, 56, 53, 51, 49, 51, 51, 50, 45, 48, 49, 48, 43, 43, 46, 44, 34, 41, 41, 42, 32, 36, 37, 42, 23, 29, 36, 33, 21, 27, 34, 31, 21, 20, 32, 22, 12, 19, 30, 22, 12 } ; RaceStatus AnswerStatus[] = { STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, FINISHED, FINISHED, FINISHED } ; SetObstacles(obs) ; RaceCourse R(20, 20, 4, obs) ; // Get Car pointers // CarPtr1 = R.GetCar(1) ; CarPtr2 = R.GetCar(2) ; CarPtr3 = R.GetCar(3) ; CarPtr4 = R.GetCar(4) ; // Scripted paths for each car to follow // Make them equal length or else ... // // 012345678901234 char script1[] = "drdldrdlrdld" ; char script2[] = "drdldldldrdl" ; char script3[] = "drdrdldrrdld" ; char script4[] = "drdrdldrdlll" ; int len1 = strlen(script1) ; int len2 = strlen(script2) ; int len3 = strlen(script3) ; int len4 = strlen(script4) ; // Print out starting line up // cout << "\n\nTest Race Course #1, Start Position: \n" ; R.PrettyPrintCourse() ; cout << "#Cars=" << R.GetNumOfCars() << endl ; cout << "#Rows=" << R.GetNumOfRows() << endl ; cout << "#Cols=" << R.GetNumOfCols() << endl ; R.StartRace() ; // Compute length of longest script int maxlen = len1 ; if (maxlen < len2) maxlen = len2 ; if (maxlen < len3) maxlen = len3 ; if (maxlen < len4) maxlen = len4 ; unsigned int move = 0 ; int i ; for (int k=0 ; k < maxlen ; k++) { i = (k % len1) ; // script wraps around if too short DoZoom(CarPtr1, script1[i]) ; /* cout << "\nCar 1 Step #" << k << endl ; R.PrettyPrintCourse() ; cout << "Car 1 is at (" << CarPtr1->GetPosition().row << "," << CarPtr1->GetPosition().col << ") with fuel level=" << CarPtr1->GetFuelLevel() << "\n" ; cout << "{" << CarPtr1->GetPosition().row << "," << CarPtr1->GetPosition().col << "}\n" ; cout << "Fuel: " << CarPtr1->GetFuelLevel() << "\n" ; R.PrintRaceStatus() ; */ if (!CheckAnswer(&R, CarPtr1, move++, AnswerPos, AnswerFuel, AnswerStatus)) { errors1++ ; } i = (k % len2) ; DoZoom(CarPtr2, script2[i]) ; /* cout << "\nCar 2 Step #" << k << endl ; R.PrettyPrintCourse() ; cout << "Car 2 is at (" << CarPtr2->GetPosition().row << "," << CarPtr2->GetPosition().col << ") with fuel level=" << CarPtr2->GetFuelLevel() << "\n" ; cout << "{" << CarPtr2->GetPosition().row << "," << CarPtr2->GetPosition().col << "}\n" ; cout << "Fuel: " << CarPtr2->GetFuelLevel() << "\n" ; R.PrintRaceStatus() ; */ if (!CheckAnswer(&R, CarPtr2, move++, AnswerPos, AnswerFuel, AnswerStatus)) { errors1++ ; } i = (k % len3) ; DoZoom(CarPtr3, script3[i]) ; /* cout << "\nCar 3 Step #" << k << endl ; R.PrettyPrintCourse() ; cout << "Car 3 is at (" << CarPtr3->GetPosition().row << "," << CarPtr3->GetPosition().col << ") with fuel level=" << CarPtr3->GetFuelLevel() << "\n" ; cout << "{" << CarPtr3->GetPosition().row << "," << CarPtr3->GetPosition().col << "}\n" ; cout << "Fuel: " << CarPtr3->GetFuelLevel() << "\n" ; R.PrintRaceStatus() ; */ if (!CheckAnswer(&R, CarPtr3, move++, AnswerPos, AnswerFuel, AnswerStatus)) { cout << "\nCar 3 Step #" << k << endl ; errors1++ ; } i = (k % len4) ; DoZoom(CarPtr4, script4[i]) ; /* cout << "\nCar 4 Step #" << k << endl ; R.PrettyPrintCourse() ; cout << "Car 4 is at (" << CarPtr4->GetPosition().row << "," << CarPtr4->GetPosition().col << ") with fuel level=" << CarPtr4->GetFuelLevel() << "\n" ; cout << "{" << CarPtr4->GetPosition().row << "," << CarPtr4->GetPosition().col << "}\n" ; cout << "Fuel: " << CarPtr4->GetFuelLevel() << "\n" ; R.PrintRaceStatus() ; */ if (!CheckAnswer(&R, CarPtr4, move++, AnswerPos, AnswerFuel, AnswerStatus)) { errors1++ ; } } // cout << "\n\n\nTHE WINNER IS: Car " << R.GetWinner() << endl ; unsigned int w = R.GetWinner() ; if (w != 2) { cerr << "Winner should be 2, reported winner is " << w << "\n" ; errors1++ ; } cout << "\n\nTest Race Course #1, End Position: \n" ; R.PrettyPrintCourse() ; } // END local scope for TEST 1 // ------------------------------------------------------------------- { // BEGIN local scope for TEST 2 vector obs ; Car *CarPtr1, *CarPtr2 ; Position AnswerPos[] = { {10,1}, {5,2}, {10,18}, {5,18}, {7,18}, {1,18}, {7,4}, {1,7}, {10,4}, {5,7}, {10,18}, {5,18}, {7,18}, {1,18}, {7,11}, {1,7}, {7,11}, {5,7}, {7,11}, {5,8}, {7,11}, {5,8} } ; unsigned int AnswerFuel[] = { 61, 66, 44, 50, 41, 46, 27, 35, 24, 31, 10, 20, 7, 16, 0, 5, 0, 1, 0, 0, 0, 0 } ; RaceStatus AnswerStatus[] = { STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STARTED, STALEMATE, STALEMATE, STALEMATE } ; SetObstacles2(obs) ; RaceCourse R(13, 18, 2, obs) ; // Get Car pointers // CarPtr1 = R.GetCar(1) ; CarPtr2 = R.GetCar(2) ; // Scripted paths for each car to follow // Make them equal length or else ... // // 012345678901234567890 char script1[] = "druldruldru" ; char script2[] = "druldruldru" ; int len1 = strlen(script1) ; int len2 = strlen(script2) ; // Print out starting line up // cout << "\n\nTest Race Course #2, Start Position: \n" ; R.PrettyPrintCourse() ; cout << "#Cars=" << R.GetNumOfCars() << endl ; cout << "#Rows=" << R.GetNumOfRows() << endl ; cout << "#Cols=" << R.GetNumOfCols() << endl ; R.StartRace() ; // Compute length of longest script int maxlen = len1 ; if (maxlen < len2) maxlen = len2 ; unsigned int move = 0 ; int i ; for (int k=0 ; k < maxlen ; k++) { i = (k % len1) ; // script wraps around if too short DoZoom(CarPtr1, script1[i]) ; /* cout << "\nCar 1 Step #" << k << endl ; R.PrettyPrintCourse() ; cout << "Car 1 is at (" << CarPtr1->GetPosition().row << "," << CarPtr1->GetPosition().col << ") with fuel level=" << CarPtr1->GetFuelLevel() << "\n" ; cout << "{" << CarPtr1->GetPosition().row << "," << CarPtr1->GetPosition().col << "}\n" ; cout << "Fuel: " << CarPtr1->GetFuelLevel() << "\n" ; R.PrintRaceStatus() ; */ if (!CheckAnswer(&R, CarPtr1, move++, AnswerPos, AnswerFuel, AnswerStatus)) { errors2++ ; } i = (k % len2) ; DoZoom(CarPtr2, script2[i]) ; /* cout << "\nCar 2 Step #" << k << endl ; R.PrettyPrintCourse() ; cout << "Car 2 is at (" << CarPtr2->GetPosition().row << "," << CarPtr2->GetPosition().col << ") with fuel level=" << CarPtr2->GetFuelLevel() << "\n" ; cout << "{" << CarPtr2->GetPosition().row << "," << CarPtr2->GetPosition().col << "}\n" ; cout << "Fuel: " << CarPtr2->GetFuelLevel() << "\n" ; R.PrintRaceStatus() ; */ if (!CheckAnswer(&R, CarPtr2, move++, AnswerPos, AnswerFuel, AnswerStatus)) { errors2++ ; } } cout << "\n\nTest Race Course #2, End Position: \n" ; R.PrettyPrintCourse() ; } // END local scope for TEST 2 cerr << "\n***Test 1 Total # of errors: " << errors1 << "\n" ; cerr << "\n***Test 2 Total # of errors: " << errors2 << "\n" ; }