Skill Building Exercises

 < Day Day Up > 



RobotRat Source Code

This section presents the complete source code listing for the robot rat project discussed in this chapter.

abstractposition.h

abstractposition.h

start example
#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
end example

abstractmarker.h

abstractmarker.h

start example
#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
end example

abstractcontrolledobject.h

abstractcontrolledobject.h

start example
#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
end example

position.h

position.h

start example
#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
end example

marker.h

marker.h

start example
#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
end example

remotecontrolledobject.h

remotecontrolledobject.h

start example
#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
end example

abstractcontrolledrodent.h

abstractcontrolledrodent.h

start example
#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
end example

robotrat.h

robotrat.h

start example
#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
end example

rodentworld.h

rodentworld.h

start example
#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
end example

userinterface.h

userinterface.h

start example
#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
end example

controller.h

controller.h

start example
#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
end example

position.cpp

position.cpp

start example
#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;  }
end example

marker.cpp

marker.cpp

start example
#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; }
end example

remotecontrolledobject.cpp

remotecontrolledobject.cpp

start example
#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();  }
end example

robotrat.cpp

robotrat.cpp

start example
#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";  }
end example

rodentworld.cpp

rodentworld.cpp

start example
#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();  } 
end example

userinterface.cpp

userinterface.cpp

start example
#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; } 
end example

controller.cpp

controller.cpp

start example
#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);          } }
end example

main.cpp

main.cpp

start example
#include <iostream> using namespace std; #include "controller.h" #include "robotrat.h" int main (){      Controller controller;      controller.run(); }
end example



 < Day Day Up > 



C++ for Artists. The Art, Philosophy, and Science of Object-Oriented Programming
C++ For Artists: The Art, Philosophy, And Science Of Object-Oriented Programming
ISBN: 1932504028
EAN: 2147483647
Year: 2003
Pages: 340
Authors: Rick Miller

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net