// FILE: maze.h -- A two-dimensional text-based maze object
// BY: John Zelle
// A Maze is an abstraction of a two-dimensional table of characters, where
// '*' and '.' have special meaning. '*' indicates a wall in the maze, and
// '.' indicates an open cell. Open cells may be filled with any character
// Walls are not over-writable. Rows and columns in the maze are indexed
// starting at 1.
// NOTATION: VALID_POS(r,c) == ( 1 <= r <= max_row()
// && 1 <= c <= max_col() )
const int MAX_MAZE_DIM = 25; // Largest maze may have this many rows and cols.
class Maze
{
public: //===================> Public <==========================
//================> constructors <=================================
Maze();
// POST: This 7 x 7 maze has been created
Maze(int rows, int cols);
// POST: this rows x cols maze has been created.
//================> member functions <============================
int max_row() const;
// POST: FCTVAL == maximum valid row index in this maze
int max_col() const;
// POST: FCTVAL == maximum valid column index in this maze
int is_open(int row, int col) const;
// PRE: VALID_POS(row, col)
// POST: FCTVAL == position (row,col) of this maze is open
void mark(int row, int col, char marker);
// PRE: VALID_POS(row, col)
// && is_open(row, col)
// && ASSIGNED(marker)
// POST: position (row, col) contains marker
void unmark(int row, int col);
// PRE: VALID_POS(row, col) &&
// _map[row][col] != '*'
// POST: is_open(row, col)
//=======================> friend functions <=======================
friend ostream& operator<<(ostream& stream, Maze m);
// POST: this maze has been written to stream
friend istream& operator>>(istream& stream, Maze& m);
// POST: this maze has been read from stream
private: //=======================> Private <================================
int _max_row;
int _max_col;
char _map[MAX_MAZE_DIM+1][MAX_MAZE_DIM+1];
};