Olá, sou nova por aqui, então se estiver fazendo algo errado, já peço desculpas!!
Estou fazendo um trabalho para a faculdade, onde preciso criar um programa que gere um Labirinto (a partir da leitura de um arquivo .txt), e percorre ele procurando a saída - ‘D’.
Acredito que a maior parte do meu código esta correto, ele só não encontra o ‘D’.
Se alguém puder me ajudar a corrigir a lógica para o programa encontrar o ‘D’, eu agradeceria demais.
Segue o codigo, o main e o labirinto.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class Labirinto {
private char[][] labirinto;
//inicializa o labirinto vazio
public Labirinto() {
labirinto = null;
}
// Método para criar o labirinto a partir de um arquivo
public void criaLabirinto (String filename) throws IOException {
BufferedReader leitor = new BufferedReader(new FileReader(filename));
String line;
int numLinhas = 0;
int numColunas = 0;
//Determinar o número de linhas e colunas do labirinto
while ((line = leitor.readLine()) != null) {
numLinhas++;
numColunas = Math.max(numColunas, line.length());
}
//Inicializar o labirinto com o tamanho apropriado
labirinto = new char[numLinhas][numColunas];
leitor.close();
//Preencher o labirinto com os dados do arquivo
leitor = new BufferedReader(new FileReader(filename));
int linha = 0;
while ((line = leitor.readLine()) != null) {
for (int col = 0; col < line.length(); col++){
labirinto[linha][col] = line.charAt(col);
}
linha++;
}
leitor.close();
}
//Metodo publico para iniciar a busca no labirinto
public boolean percorreLabirinto() {
return percorreLabirinto(0, 0);
}
//Metodo privado recursivo para buscar a saída do labirinto
private boolean percorreLabirinto(int linha, int coluna) {
//verifica se a posicao atual é valida
if (linha < 0 || linha >= labirinto.length || coluna < 0 || coluna >= labirinto[0].length) {
return false;
}
//marca a posição atual como visitada
labirinto[linha][coluna] = 'V';
//verifica se a posição atual é um obstaculo ou ja foi visitada
if(labirinto[linha][coluna] == 'X' || labirinto[linha][coluna] == 'V') {
return false;
}
//percorre o labirinto
if (labirinto[linha][coluna] == 'D'){
System.out.println("Achei a saida em linha " + linha + " coluna: " + coluna );
return true; // Encontrou a saida, entao retorna verdadeiro
}
//tenta mover para as quatro direções possiveis
if (percorreLabirinto(linha +1, coluna) || // mover para baixo
percorreLabirinto(linha -1, coluna) || // mover para cima
percorreLabirinto(linha, coluna +1) || // mover para direita
percorreLabirinto(linha, coluna -1)) { // mover para esquerda
return true;
}
return false;
}
//metodo para imprimir o labirinto
public void imprimirLabirinto() {
for(int linha = 0; linha < labirinto.length; linha ++) {
for(int coluna = 0; coluna < labirinto[0].length; coluna++) {
System.out.print(labirinto[linha][coluna]);
}
System.out.println();
}
}
}
//Main
import java.io.IOException;
public class Main {
public static void main(String[] args) {
Labirinto labirinto = new Labirinto();
try {
labirinto.criaLabirinto("labirintoexemplo.txt");
System.out.println("Labirinto Original: ");
labirinto.imprimirLabirinto();
if (labirinto.percorreLabirinto()) {
System.out.println("Caminho encontrado!");
System.out.println("Labirinto com o caminho: ");
labirinto.imprimirLabirinto();
} else {
System.out.println("Nenhum caminho encontrado.");
}
} catch (IOException e) {
System.out.println("Erro ao ler o arquivo do labirinto.");
}
}
}
//Labirinto
Talvez o labirinto apareça errado na formatação, mas ele tem 8 linhas x 20 colunas
XXXXXXXXX XXXXXX
X XXXXXXXXX X XXXX
X XXXXXXX XXX XXXX
XXX XXXXXX XXX XXXX
XXX XX XXXX
XXX XX X XXXXX XXX
XXXXXX X XXXXXX X
XXXXXX XXXXXX XXXD