Чтение текстового файла и создание лабиринта - PullRequest
1 голос
/ 19 марта 2012

Я работаю над программой, которая будет читать файл, содержащий информацию о лабиринте, и использовать эту информацию, чтобы найти путь через лабиринт.Проблема, которую я имею, представляет лабиринт в массиве.Я не уверен, как превратить 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 Ответ

2 голосов
/ 19 марта 2012

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

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

...