2012-03-19 3 views
1

Я работаю над программой, которая будет читать файл, содержащий информацию о лабиринте, и использовать эту информацию, чтобы найти путь через лабиринт. Проблема, с которой я сталкиваюсь, представляет лабиринт в массиве. Я не уверен, как превратить X в целые числа, чтобы представить их как стены в массиве. В конструкторе одного аргумента я использую цикл for для прохождения через файл и помещаю каждый символ в соответствующий индекс массива. То, как я это делал, явно не работает, и если кто-нибудь может дать некоторые советы о том, как правильно представлять лабиринт в массиве, я был бы признателен.Чтение текстового файла и создание лабиринта

/**@file Maze.h*/ 

    #include <iostream> 
    #include <string> 
    #include <fstream> 
    using namespace std; 

    const int MAX_ROW = 60; 
    const int MAX_COL = 40; 
    const int WALL = 0; 
    const int CLEAR = 1; 
    const int PATH = 2; 
    const int VISITED = 3; 

    struct Position 
    { 
     int r; 
     int c; 
    }; 
    class Maze 
    { 
    public: 
    Maze(); 

    /*One argument constructor that takes a filename and reads 
    *the contents of a maze file. 
    */ 
    Maze(string filename); 
    void displayMaze(); 
    bool isWall(Position p); 
    bool isPath(Position p); 
    bool isClear(Position p); 
    bool isVisited(Position p); 
    void setWall(Position p); 
    void setPath(Position p); 
    void setClear(Position p); 
    void setVisited(Position p); 
    Position getEntrance(); 
    Position getExit(); 
    private: 
     int row; 
     int col; 
     Position exit; 
     Position entrance; 
     int maze[MAX_ROW][MAX_COL]; 
    }; 

/**@file Maze.cpp*/ 

#include "Maze.h" 

Maze::Maze() 
{} 

Maze::Maze(string filename) 
{ 
    ifstream inStream; 
    inStream.open(filename.c_str()); 
    if(inStream.fail()) 
{ 
    cout << "Input file opening failed.\n"; 
} 
//Get the dimensions of the maze. 
inStream >> col >> row; 
//Get the exit to the maze. 
inStream >> exit.r >> exit.c; 
//Get the entrance to the maze. 
inStream >> entrance.r >> entrance.c; 
//Read maze from the file. 
for(int r = 0; r < row; r++) 
{ 
    for(int c = 0; c < col; c++) 
    { 
     inStream >> maze[r][c]; 
     if(maze[r][c])== 'X') 
      maze[r][c] = WALL; 
     else 
      maze[r][c] = CLEAR; 
    } 
} 
}//end one argument constructor 

void Maze::displayMaze() 
{ 
cout << '\t' << '\t' << "Row" << '\t' << "Column" << endl; 
cout << "Dimensions:" << '\t' << row << '\t' << col << endl; 
cout << "Exit:" << '\t' << '\t' << exit.r << '\t' << exit.c << endl; 
cout << "Entrance: " << '\t' << entrance.r << '\t' << entrance.c << endl; 

for(int r = 0; r < row; r++) 
{ 
    for(int c = 0; c < col; c++) 
    { 
     cout << maze[r][c]; 
    } 
    cout << endl; 
} 
}//end displayMaze() 

bool Maze::isWall(Position p) 
{ 
return maze[p.r][p.c] == WALL; 
}//end isWall() 

bool Maze::isPath(Position p) 
{ 
return maze[p.r][p.c] == PATH; 
}//end isPath() 

bool Maze::isClear(Position p) 
{ 
return maze[p.r][p.c] == CLEAR; 
}//end isClear() 

bool Maze::isVisited(Position p) 
{ 
return maze[p.r][p.c] == VISITED; 
}//end isVisited() 

void Maze::setWall(Position p) 
{ 
maze[p.r][p.c] = WALL; 
}//end setWall() 

void Maze::setPath(Position p) 
{ 
maze[p.r][p.c] = PATH; 
}//end setPath() 

void Maze::setClear(Position p) 
{ 
maze[p.r][p.c] = CLEAR; 
}//end setClear() 

void Maze::setVisited(Position p) 
{ 
maze[p.r][p.c] = VISITED; 
}//end setVisited() 

Position Maze::getEntrance() 
{ 
return entrance; 
}//end getEntrance() 

Position Maze::getExit() 
{ 
return exit; 
}//end getExit() 

Ниже приведен пример того, как будет выглядеть содержимое файла. Первый набор чисел - это размеры лабиринта в столбцах и строках. Второй набор чисел - это позиция строки и столбца выхода, а третий набор чисел - позиция строки и столбца входа.

20 7 
0 18 
6 12 
xxxxxxxxxxxxxxxxxx x 
x  x  xxxx x 
x xxxxx xxxxx xx x 
x xxxxx xxxxxxx xx x 
x x   xx xx x 
x xxxxxxxxxx xx x 
xxxxxxxxxxxx xxxxxxx 
+1

Это не работает ... каким образом? – jrok

+0

В цикле for я пытаюсь прочитать каждую часть лабиринта в массиве. Однако оператор if пропускается и выполняется только оператор else, поэтому все пробелы помечены как CLEAR. Мне интересно, как читать файл, чтобы X были представлены как 0 (ноль) в массиве. – Eric

+0

Попробуйте изменить свой массив, чтобы удерживать 'char'. – jrok

ответ

2

Представлять соединение лабиринта, вы можете связать позицию в лабиринте со списком соседних ячеек, к которым существует путь. Список может быть фактическим списком или более компактным представлением, таким как растровое изображение: например. 1010 может означать, что мы можем идти на север и на юг, но не на восток и на запад.

Вам также может быть полезно использовать массив, который больше, чем лабиринт (т.е. который включает пограничные ячейки вокруг лабиринта в массиве), чтобы можно было ссылаться на соседние ячейки ячейки лабиринта, не беспокоясь о краевые условия.