| < Day Day Up > |
|
This section presents the complete source code listing for the robot rat project discussed in this chapter.
abstractposition.h
#ifndef ABSTRACT_POSITION_H #define ABSTRACT_POSITION_H class AbstractPosition { public: AbstractPosition(){}; virtual ~AbstractPosition(){} virtual void setRow(int row) = 0; virtual void setColumn(int column) = 0; virtual void setPosition(int row, int column) = 0; virtual int getRow() = 0; virtual int getColumn() = 0; virtual void move(int spaces) = 0; virtual void turnLeft() = 0; virtual void turnRight() = 0; virtual void setBoundaries(int rows, int columns) = 0; virtual int getUpperRowBoundary() = 0; virtual int getUpperColumnBoundary() = 0; }; #endif
abstractmarker.h
#ifndef ABSTRACT_MARKER_H #define ABSTRACT_MARKER_H class AbstractMarker { public: AbstractMarker(){} virtual ~AbstractMarker(){} virtual void setMarkerUp() = 0; virtual void setMarkerDown() = 0; virtual void toggleMarker() = 0; virtual bool isMarkerDown() = 0; }; #endif
abstractcontrolledobject.h
#ifndef ABSTRACT_CONTROLLED_OBJECT_H #define ABSTRACT_CONTROLLED_OBJECT_H class AbstractControlledObject { public: AbstractControlledObject(){}; virtual ~AbstractControlledObject(){}; virtual void move(int spaces) = 0; virtual void turnLeft() = 0; virtual void turnRight() = 0; virtual void setRow(int row) = 0; virtual void setColumn(int column) = 0; virtual void setPosition(int row, int column) = 0; virtual int getRow() = 0; virtual int getColumn() = 0; virtual void setBoundaries(int rows, int columns) = 0; virtual int getUpperRowBoundary() = 0; virtual int getUpperColumnBoundary() = 0; virtual void setMarkerUp() = 0; virtual void setMarkerDown() = 0; virtual void toggleMarker() = 0; virtual bool isMarkerDown() = 0; virtual char* getObjectType() = 0; }; #endif
position.h
#ifndef POSITION_H #define POSITION_H #include "abstractposition.h" class Position : public AbstractPosition { public: Position(int row = 0, int column = 0); ~Position(); void setRow(int row); void setColumn(int column); void setPosition(int row, int column); int getRow(); int getColumn(); void move(int spaces); void turnLeft(); void turnRight(); void setBoundaries(int rows, int columns); int getUpperRowBoundary(); int getUpperColumnBoundary(); private: int its_row; int its_column; int upper_row_boundary; int upper_column_boundary; int lower_row_boundary; int lower_column_boundary; enum Direction {NORTH, SOUTH, EAST, WEST}; Direction its_direction; void incrementRow(int val); void incrementColumn(int val); void setLowerRowBoundary(int lower); void setUpperRowBoundary(int upper); void setLowerColumnBoundary(int lower); void setUpperColumnBoundary(int upper); }; #endif
marker.h
#ifndef MARKER_H #define MARKER_H #include "abstractmarker.h" class Marker : public AbstractMarker { public: Marker(); virtual ~Marker(); void setMarkerUp(); void setMarkerDown(); void toggleMarker(); bool isMarkerDown(); private: enum MarkerPosition {UP, DOWN}; MarkerPosition its_marker_position; }; #endif
remotecontrolledobject.h
#ifndef REMOTE_CONTROLLED_OBJECT_H #define REMOTE_CONTROLLED_OBJECT_H #include "AbstractPosition.h" #include "AbstractMarker.h" #include "AbstractControlledObject.h" class RemoteControlledObject : public AbstractControlledObject { public: RemoteControlledObject(); virtual ~RemoteControlledObject(); void move(int spaces); void turnLeft(); void turnRight(); void setBoundaries(int rows, int columns); void setRow(int row); void setColumn(int column); void setPosition(int row, int column); int getRow(); int getColumn(); int getUpperRowBoundary(); int getUpperColumnBoundary(); void setMarkerUp(); void setMarkerDown(); void toggleMarker(); bool isMarkerDown(); private: static int count; AbstractPosition* its_position; AbstractMarker* its_marker; }; #endif
abstractcontrolledrodent.h
#ifndef ABSTRACT_CONTROLLED_RODENT_H #define ABSTRACT_CONTROLLED_RODENT_H #include "remotecontrolledobject.h" class AbstractControlledRodent : public RemoteControlledObject { public: AbstractControlledRodent(){} virtual ~AbstractControlledRodent(){} virtual void setTailUp() = 0; virtual void setTailDown() = 0; }; #endif
robotrat.h
#ifndef ROBOT_RAT_H #define ROBOT_RAT_H #include "abstractcontrolledrodent.h" class RobotRat : public AbstractControlledRodent { public: RobotRat(int row_boundary = 20, int column_boundary = 20); virtual ~RobotRat(); RobotRat(RobotRat& rhs); RobotRat& operator=(RobotRat& rhs); void setTailUp(); void setTailDown(); char* getObjectType(); }; #endif
rodentworld.h
#ifndef RODENT_WORLD_H #define RODENT_WORLD_H #include "abstractcontrolledrodent.h" #include <cstddef> class RodentWorld { public: RodentWorld(int rows = 20, int columns = 20); virtual ~RodentWorld(); void addRodent(); void deleteRodent(); void toggleRodent(); void turnRodentLeft(); void turnRodentRight(); void moveRodent(int spaces); void setRodentTailUp(); void setRodentTailDown(); char* getRodentType(); int getRodentRow(); int getRodentColumn(); bool isRodentTailDown(); private: AbstractControlledRodent **rodent_array; int its_rows; int its_columns; int number_of_rodents; int rodent_number; }; #endif
userinterface.h
#ifndef USER_INTERFACE_H #define USER_INTERFACE_H #include <iostream> using namespace std; class UserInterface { public: UserInterface(); ~UserInterface(); void displayMenu(); int getMenuChoice(); void markFloor(int row, int column); void clearFloor(int row, int column); void displayFloor(); int getRows(); int getColumns(); int getSpaces(); private: bool** floor; int its_rows; int its_columns; int spaces; }; #endif
controller.h
#ifndef CONTROLLER_H #define CONTROLLER_H #include "rodentworld.h" #include "userinterface.h" class Controller { public: Controller(); ~Controller(); void run(); private: UserInterface* its_ui; RodentWorld* its_world; enum MenuActions {ADD = 1, TOGGLE, TURNRIGHT, TURNLEFT, TAILUP, TAILDOWN, MOVE, DISPLAYFLOOR, EXIT}; void move(); }; #endif
position.cpp
#include "position.h" #include <assert.h> Position::Position(int row, int column):its_row(row), its_column(column), lower_row_boundary(0), upper_row_boundary(20), lower_column_boundary(0), upper_column_boundary(20), its_direction(EAST){} Position::~Position(){} void Position::setRow(int row){ its_row = row; } void Position::setColumn(int column){ its_column = column; } void Position::incrementRow(int val){ int new_row = its_row + val; //assert((lower_row_boundary <= new_row) && (new_row < upper_row_boundary)); if(new_row < lower_row_boundary){ its_row = lower_row_boundary; }else if(new_row > (upper_row_boundary-1)){ its_row = (upper_row_boundary-1); }else its_row = new_row; } void Position::incrementColumn(int val){ int new_column = its_column + val; //assert((lower_column_boundary <= new_column) && (new_column < upper_column_boundary)); if(new_column < lower_column_boundary){ its_column = lower_row_boundary; }else if(new_column > (upper_column_boundary-1)){ its_column = (upper_column_boundary-1); }else its_column = new_column; } int Position::getRow(){ return its_row; } int Position::getColumn(){ return its_column; } void Position::setLowerRowBoundary(int lower){ lower_row_boundary = lower; } void Position::setUpperRowBoundary(int upper){ upper_row_boundary = upper; } void Position::setLowerColumnBoundary(int lower){ lower_column_boundary = lower; } void Position::setUpperColumnBoundary(int upper){ upper_column_boundary = upper; } void Position::move(int spaces){ switch(its_direction){ case NORTH: incrementRow(spaces * -1); break; case EAST: incrementColumn(spaces); break; case SOUTH: incrementRow(spaces); break; case WEST: incrementColumn(spaces * -1); break; default: break; } } void Position::turnLeft(){ switch(its_direction){ case NORTH: its_direction = WEST; break; case EAST: its_direction = NORTH; break; case SOUTH: its_direction = EAST; break; case WEST: its_direction = SOUTH; break; default: its_direction = EAST; } } void Position::turnRight(){ switch(its_direction){ case NORTH: its_direction = EAST; break; case EAST: its_direction = SOUTH; break; case SOUTH: its_direction = WEST; break; case WEST: its_direction = NORTH; break; default: its_direction = EAST; } } void Position::setBoundaries(int rows, int columns){ upper_row_boundary = rows, upper_column_boundary = columns; } void Position::setPosition(int row, int column){ its_row = row, its_column = column; } int Position::getUpperRowBoundary(){ return upper_row_boundary; } int Position::getUpperColumnBoundary(){ return upper_column_boundary; }
marker.cpp
#include "marker.h" Marker::Marker():its_marker_position(UP){} Marker::~Marker(){} void Marker::setMarkerUp(){ its_marker_position = UP; } void Marker::setMarkerDown(){ its_marker_position = DOWN; } void Marker::toggleMarker(){ switch(its_marker_position){ case UP: its_marker_position = DOWN; break; case DOWN: its_marker_position = UP; break; default: its_marker_position = UP; } } bool Marker::isMarkerDown(){ return (bool)its_marker_position; }
remotecontrolledobject.cpp
#include "remotecontrolledobject.h" #include "position.h" #include "marker.h" int RemoteControlledObject::count = 0; RemoteControlledObject::RemoteControlledObject(){ its_position = new Position; its_marker = new Marker; count++; } RemoteControlledObject::~RemoteControlledObject(){ count--; delete its_position; delete its_marker; } void RemoteControlledObject::move(int spaces){ its_position->move(spaces); } void RemoteControlledObject::turnLeft(){ its_position->turnLeft(); } void RemoteControlledObject::turnRight(){ its_position->turnRight(); } void RemoteControlledObject::setRow(int row){ its_position->setRow(row); } void RemoteControlledObject::setColumn(int column){ its_position->setColumn(column); } void RemoteControlledObject::setPosition(int row, int column){ its_position->setPosition(row, column); } int RemoteControlledObject::getRow(){ return its_position->getRow(); } int RemoteControlledObject::getColumn(){ return its_position->getColumn(); } void RemoteControlledObject::setBoundaries(int rows, int columns){ its_position->setBoundaries(rows, columns); } int RemoteControlledObject::getUpperRowBoundary(){ return its_position->getUpperRowBoundary(); } int RemoteControlledObject::getUpperColumnBoundary(){ return its_position->getUpperColumnBoundary(); } void RemoteControlledObject::setMarkerUp(){ its_marker->setMarkerUp(); } void RemoteControlledObject::setMarkerDown(){ its_marker->setMarkerDown(); } void RemoteControlledObject::toggleMarker(){ its_marker->toggleMarker(); } bool RemoteControlledObject::isMarkerDown(){ return its_marker->isMarkerDown(); }
robotrat.cpp
#include "robotrat.h" RobotRat::RobotRat(int row_boundary, int column_boundary){ setBoundaries(row_boundary, column_boundary); } RobotRat::~RobotRat(){} RobotRat::RobotRat(RobotRat& rhs){ setBoundaries(rhs.getUpperRowBoundary(), rhs.getUpperColumnBoundary()); if(rhs.isMarkerDown()){ this->setMarkerDown(); }else{ this->setMarkerUp(); } this->setPosition(rhs.getRow(), rhs.getColumn()); } RobotRat& RobotRat::operator=(RobotRat& rhs){ this->setBoundaries(rhs.getUpperRowBoundary(), rhs.getUpperColumnBoundary()); if(rhs.isMarkerDown()){ this->setMarkerDown(); }else{ this->setMarkerUp(); } this->setPosition(rhs.getRow(), rhs.getColumn()); return *this; } void RobotRat::setTailUp(){ setMarkerUp(); } void RobotRat::setTailDown(){ setMarkerDown(); } char* RobotRat::getObjectType(){ return "RobotRat"; }
rodentworld.cpp
#include "rodentworld.h" #include "robotrat.h" RodentWorld::RodentWorld(int rows, int columns):its_rows(rows),its_columns(columns), number_of_rodents(1), rodent_number(0){ rodent_array = new AbstractControlledRodent*[number_of_rodents]; rodent_array[0] = new RobotRat(its_rows, its_columns); } RodentWorld::~RodentWorld(){ for(int i = 0; i<number_of_rodents; i++){ delete rodent_array[i]; } delete[] rodent_array; } void RodentWorld::addRodent(){ //save current number of rodents int old_number_of_rodents = number_of_rodents; //create temp array same size as current array AbstractControlledRodent **temp_array = new AbstractControlledRodent*[number_of_rodents]; //assign rodents to temp array for(int i=0; i<number_of_rodents; i++){ temp_array[i] = rodent_array[i]; } //then delete rodent array delete[] rodent_array; //now, create new rodent array one bigger than old rodent array rodent_array = new AbstractControlledRodent*[++number_of_rodents]; //copy temp rodent objects into new rodent array for(int i=0; i<old_number_of_rodents; i++){ rodent_array[i] = temp_array[i]; } //add new rodent object to the last array element rodent_array[number_of_rodents-1] = new RobotRat(its_rows, its_columns); //delete temp array delete[] temp_array; toggleRodent(); } void RodentWorld::deleteRodent(){ //delete currently selected rodent object delete rodent_array[rodent_number]; //then set pointer to null rodent_array[rodent_number] = NULL; //save previous number of rodents int old_number_of_rodents = number_of_rodents; //create temp array one smaller than rodent aray AbstractControlledRodent **temp_array = new AbstractControlledRodent*[--number_of_rodents]; //copy surviving rodent objects to temp array { int i(0), j(0); while(i < old_number_of_rodents){ if(rodent_array[i] != NULL){ temp_array[j++] = rodent_array[i++]; }else{i++;} } } //delete rodent_array delete[] rodent_array; //create new rodent array one smaller than old array rodent_array = new AbstractControlledRodent*[number_of_rodents]; //Assign rodents from temp array for(int i=0; i<number_of_rodents; i++){ rodent_array[i] = temp_array[i]; } //delete temp array delete[] temp_array; toggleRodent(); } void RodentWorld::toggleRodent(){ if(rodent_number < (number_of_rodents-1)){ rodent_number++; }else{ rodent_number = 0; } } void RodentWorld::turnRodentLeft(){ rodent_array[rodent_number]->turnLeft(); } void RodentWorld::turnRodentRight(){ rodent_array[rodent_number]->turnRight(); } void RodentWorld::moveRodent(int spaces){ rodent_array[rodent_number]->move(spaces); } void RodentWorld::setRodentTailUp(){ rodent_array[rodent_number]->setTailUp(); } void RodentWorld::setRodentTailDown(){ rodent_array[rodent_number]->setTailDown(); } char* RodentWorld::getRodentType(){ return rodent_array[rodent_number]->getObjectType(); } bool RodentWorld::isRodentTailDown(){ return rodent_array[rodent_number]->isMarkerDown(); } int RodentWorld::getRodentRow(){ return rodent_array[rodent_number]->getRow(); } int RodentWorld::getRodentColumn(){ return rodent_array[rodent_number]->getColumn(); }
userinterface.cpp
#include "userinterface.h" #include <stdlib.h> UserInterface::UserInterface():spaces(0){ int rows(0), columns(0); cout<<"Enter Max Rows: "; cin>>rows; cout<<endl<<"Enter Max Columns: "; cin>>columns; its_rows = rows; its_columns = columns; floor = new bool*[rows]; for(int i = 0; i<rows; i++){ floor[i] = new bool[columns]; } for(int i=0; i<rows; i++){ for(int j=0; j<columns; j++){ floor[i][j] = false; } } } UserInterface::~UserInterface(){ for(int i=0; i<its_rows; i++){ delete[] floor[i]; } delete[] floor; } void UserInterface::displayMenu(){ cout<<" 1. Add New Rat"<<endl; cout<<" 2. Toggle Rat"<<endl; cout<<" 3. Turn Right"<<endl; cout<<" 4. Turn Left"<<endl; cout<<" 5. Set Tail Up"<<endl; cout<<" 6. Set Tail Down"<<endl; cout<<" 7. Move"<<endl; cout<<" 8. Display Floor"<<endl; cout<<" 9. Exit"<<endl; cout<<endl; cout<<endl; } int UserInterface::getMenuChoice(){ char c[1]; cin>>c[0]; while((c[0] < '1') || (c[0] > '9')){ cout<<"Please enter a valid menu choice"<<endl; cin>>c; } return atoi(c); } void UserInterface::markFloor(int row, int column){ floor[row][column] = true; } void UserInterface::clearFloor(int row, int column){ floor[row][column] = false; } void UserInterface::displayFloor(){ for(int i = 0; i<its_rows; i++){ for(int j = 0; j<its_columns; j++){ if(floor[i][j]){ cout<<'*'; }else{ cout<<'0'; } } cout<<endl; } } int UserInterface::getRows(){ return its_rows; } int UserInterface::getColumns(){ return its_columns; } int UserInterface::getSpaces(){ cout<<endl<<"Enter spaces to move: "; cin>>spaces; return spaces; }
controller.cpp
#include "controller.h" Controller::Controller(){ its_ui = new UserInterface(); its_world = new RodentWorld(its_ui->getRows(), its_ui->getColumns()); } Controller::~Controller(){ delete its_ui; delete its_world; } void Controller::run(){ while(true){ its_ui->displayMenu(); switch(its_ui->getMenuChoice()){ case ADD: its_world->addRodent(); break; case TOGGLE: its_world->toggleRodent(); break; case TURNRIGHT: its_world->turnRodentRight(); break; case TURNLEFT: its_world->turnRodentLeft(); break; case TAILUP: its_world->setRodentTailUp(); break; case TAILDOWN: its_world->setRodentTailDown(); break; case MOVE: move(); break; case DISPLAYFLOOR: its_ui->displayFloor(); break; case EXIT: exit(0); break; default: break; } } } void Controller::move(){ int spaces = its_ui->getSpaces(); while(spaces--){ if(its_world->isRodentTailDown()){ its_ui->markFloor(its_world->getRodentRow(), its_world->getRodentColumn()); its_world->moveRodent(1); } else its_world->moveRodent(1); } }
main.cpp
#include <iostream> using namespace std; #include "controller.h" #include "robotrat.h" int main (){ Controller controller; controller.run(); }
| < Day Day Up > |
|