[RESOLVIDO] Inteligencia Artificial

,

Pessoal estou estudando inteligencia artificial pelo canal zarunbabel, ja implementei o codigo do aspirador de po, mais nao consigo fazer algo diferente como/:
No codigo dele toda vez que o aspirador passar troca a letra S sujo por Limpo L, pois toda a matriz é de L, ele so vai trocando,…

minha duvida é o seguinte, eu sortiei varias letras pela classe random, e quero que ele so troque por L onde tiver S de sujo…

o codigo esta assim…

`public void movimentar() {
	if (this.pilhaMovimentos >= 4) {
		return;
	}
	PosicaoXY proximoMovimento = retornarMovimento();
	char valor = this.labirinto.retornarValorPosicaoLabirinto(proximoMovimento);
	
	if (valor == 'L' || valor == 'R') {
                    
		proximoMovimento();
		aumentarPilha();//
		movimentar();
                   
                

                
            }else{
		this.labirinto.limpar();
		this.posXY = proximoMovimento;
            }
}`

o R é o robo ou seja o aspirador ai ele compara as duas letras ai, se nao for ela ele entra no metodo limpar que ai ele troca trodas as letras, mais no meu caso sao varias letras e ele continua trocando todas por L, preciso trocar somente o S,
o metodo limpar esta esse…

`    public void limpar() {
  
  PosicaoXY posicao = this.agente.getPosicao();
  labirinto[posicao.getPosX()][posicao.getPosY()] = 'L';
}`

alguma dica como modificar?

PosicaoXY posicao = this.agente.getPosicao();
int x = posicao.getPosX();
int y = posicao.getPosY();
if (labirinto[x][y] == 'S') {
    labirinto[x][y] = 'L';
}

beleza @staroski, so pensei nesse metodo entendir sua logica ta filé, porem agora ele troca todas as letras pelo #, ou seja ele atualiza a posicao por #, esta trocando todas por #, deve ser meu metodo atualizaposicao,

`private void atualizarPosicaoAgente() {
    if (this.agente != null) {
        PosicaoXY posAgente = this.agente.getPosicao();
        labirinto[posAgente.getPosX()][posAgente.getPosY()] = '#';
    }
}`

todas as vezes que ele exibe o labirinto ele atualiza a posicao nesse caso ele ja troca por #

O seu método atualizarPosicaoAgente põe um # na posição atual do agente.
O que você gostaria que o método fizesse?

Dúvida:
Porque você tem um if (this.agente != null)?
Em que situação o agente estaria null?

o que eu gostaria de fazer era nao atualizar na vdd, eu queria que o # fosse pulando de casa so para verificar e simular um robo andando ai se ele encontrar o S ai trocaria por L, ele tem que passar e nao mudar o valor.

ele verifica se ja tem um agente ou nao, retirando ele poe um erro
@staroski

olha @staroski toda vez que vou exibir o ambiente ele atualiza a posicao, segue o codigo…

`public void exibirAmbiente() {
    atualizarPosicaoAgente();
    //this.getLabirinto();
    for (int i = 0; i < tamanhoLabirinto; i++) {
        for (int j = 0; j < tamanhoLabirinto; j++) {

            if (this.labirinto[i][j] == '#') {
                System.out.print("|" + labirinto[i][j] + "|");
            } else {
                System.out.print("|" + labirinto[i][j] + "|");
            }

        }
        System.out.println("");
    }
    System.out.println("");
}`

Não entendi essa lógica.

certo, foi uma logica aki mais nao interfere em nada acabei de retirar,

` public void exibirLabirinto() {
    atualizarPosicaoAgente();
     for (int i = 0; i < tamanhoLabirinto; i++) {
        for (int j = 0; j < tamanhoLabirinto; j++) {
         System.out.print("|" + labirinto[i][j] + "|");
            //} else {
               // System.out.print("|" + labirinto[i][j] + "|");
           // }

        }
        System.out.println("");
    }
    System.out.println("");
}

`

@staroski eu so preciso de uma ajuda como mover em cima da matriz sem alterar o valor

public void exibirLabirinto() {
    atualizarPosicaoAgente();
    PosicaoXY posAgente = this.agente.getPosicao();
    int x = posAgente.getPosX();
    int y = posAgente.getPosY();
    for (int i = 0; i < tamanhoLabirinto; i++) {
        for (int j = 0; j < tamanhoLabirinto; j++) {
            if (i == y && j == x) {
                System.out.print("|" + "#" + "|");  // exibe a posicao do agente
            } else {
                System.out.print("|" + labirinto[i][j] + "|");  // exibe o valor da posicao
            }
        }
        System.out.println("");
    }
    System.out.println("");
}

@staroski dessa forma ele dar um erro no metodo

Exception in thread “main” java.lang.NullPointerException
at Ambiente.Labirinto.exibirLabirinto(Labirinto.java:55)
at Principal.InteligenciaArtificial.main(InteligenciaArtificial.java:25)
Java Result: 1

ele consta o erro nessa linha

`PosicaoXY posAgente = this.agente.getPosicao();`

olhe por onde ele passa ele atualiza, o que vc mandou ele dar erro no metodo

Se aconteceu NullPointerException é porque faltou você inicializar a variável agente.

@staroski a variavel agente ja esta inicializada

no codigo nao dar erro @staroski

Então não aconteceria NullPointerException na linha que você postou.

Posta o Stack Trace e o código completo das classes

@staroski blzvou posta todas as classes

essa é a classe agente aspirador

`public class AgenteAspirador {

private Ambiente ambiente;
private Movimentos movimento;


private PosicaoXY posXY;

private int pilhaMovimentos;
//private int pontuacaoAspirador = 0;

public AgenteAspirador(Ambiente ambiente) {
    this.ambiente = ambiente;
    ambiente.setAgente(this);
    this.posXY = new PosicaoXY();
    this.movimento = Movimentos.CIMA;
    //this.pontuacaoAspirador++;
    
}
//se ele ja tiver feito os 4 movimentos ele vai saber 
//que nao vai ter nenhum outro movimento ai irá parar.

public void movimentar() {
    if (this.pilhaMovimentos >= 4) {
        return;
    }
    PosicaoXY proximoMovimento = retornarMovimento();
    char valor = this.ambiente.retornarValorPosicaoAmbiente(proximoMovimento);
  

    if (valor == '#' || valor == 'L') {
        proximoMovimento();
        aumentarPilha();//
        movimentar();
   
        
    
    } else {
        this.ambiente.limpar();
        this.posXY = proximoMovimento;
     

    }
}

//ele fica sabendo o tamnho dele, ele nao vai conseguir encontrar nenhuma sujeira e ira parar
private void aumentarPilha() {
    this.pilhaMovimentos++;
}

private void proximoMovimento() {
    switch (this.movimento) {
        case CIMA:
            this.movimento = Movimentos.BAIXO;
            break;
        case BAIXO:
            this.movimento = Movimentos.ESQUERDA;
            break;
        case ESQUERDA:
            this.movimento = Movimentos.DIREITA;
            break;
        case DIREITA:
            this.movimento = Movimentos.CIMA;
            break;
    }
}

public PosicaoXY retornarMovimento() {
    int retornoPosX = this.posXY.getPosX();
    int retornoPosY = this.posXY.getPosY();
    switch (movimento) {
        case CIMA:
            if (retornoPosX > 0) {
                retornoPosX -= 1;
            }
            break;
        case BAIXO:
            if (retornoPosX < this.ambiente.getTamanhoAmbiente() - 1) {
                retornoPosX += 1;
            }
            break;
        case ESQUERDA:
            if (retornoPosY > 0) {
                retornoPosY -= 1;
            }
            break;
        case DIREITA:
            if (retornoPosY < this.ambiente.getTamanhoAmbiente() - 1) {
                retornoPosY += 1;
            }
            break;
    }
    return new PosicaoXY(retornoPosX, retornoPosY);
}

public PosicaoXY getPosicao() {
    return this.posXY;
}

public boolean isAindaLimpando() {
    return pilhaMovimentos < 4;
}

public void zerarPilha() {
    this.pilhaMovimentos = 0;
}

}
`