Respostas labirinto 1 e 2 - PedroCarvalho000/Trabalhos-de-Paradigmas-de-linguagem GitHub Wiki
Jogo do Labirinto 1
Atividade 01
- Implemente o programa Labirinto, de acordo com a versão mostrada, só para apresentar o tabuleiro vazio. Tente não copiar o código mostrado, mas fazer sem olhar o material da aula. Relate o que você fez de diferente em termos de implementação ou se a sua implementação ficou igual à mostrada na aula.
Resposta: Eu inicializei a matriz inteira com espaços vazios antes de desenhar o tabuleiro utilizando um loop for com a função "Arrays.fill". O desenho do tabuleiro foi praticamente igual, mudando apenas uma linha no final onde eu corrijo o canto inferior esquerdo do tabuleiro. Também não utilizei constantes globais para os símbolos usados para desenhar o tabuleiro pois em códigos simples prefiro repeti-los pois ter que subir o código para verificar qual constante representa qual símbolo toma muito tempo.
public static void inicializarMatriz() {
for(char[] arr1 : tabuleiro){
Arrays.fill(arr1, ' ');
}
int i;
for (i = 0; i < TAMANHO; i++) {
tabuleiro[i][0] = '|';
tabuleiro[i][TAMANHO - 1] = '|';
tabuleiro[0][i] = '-';
tabuleiro[TAMANHO - 1][i] = '-';
}
tabuleiro[TAMANHO - 1][0] = '-';
}
- Altere o valor da constante que representa o tamanho do tabuleiro. Relate o que houve com o tabuleiro mostrado pelo programa e explique como a alteração dessa constante afetou o resto do programa.
Resposta: Ao aumentar o valor da constante que representa o tamanho do tabuleiro o tabuleiro aumenta, ao diminui-la o tabuleiro diminui. O tabuleiro é um quadrado onde cada lado é formado por um número X de símbolos onde X é a variável de tamanho. Alterar o valor da constante de tamanho altera o número de repetições dos loops de desenhar o tabuleiro de imprimir o tabuleiro e de preencher o tabuleiro com espaços vazios.
Atividade 02
- Altere sua implementação do programa Labirinto para apresentar o tabuleiro com as paredes internas (obstáculos), como mostrado nessa segunda parte da aula. Tente não copiar o código mostrado, mas fazer sem olhar o material da aula. Relate o que você fez de diferente em termos de implementação ou se a sua implementação ficou igual à mostrada na aula.
Resposta: Eu já tinha lido o código de gerar o labirinto e achei a solução muito boa. Mantive tudo igual porém criei um método para a criação do labirinto que recebe uma matriz de caracteres de argumento e retorna uma matriz de caractere. Para as paredes do labirinto utilizei um símbolo do unicode de um quadrado.
public static char[][] CriarLabirinto(char[][] tabuleiro) {
int i, j;
for (i = 1; i < TAMANHO - 1; i++) {
for (j = 1; j < TAMANHO - 1; j++) {
if (Math.random() > PROBABILIDADE) {
tabuleiro[i][j] = '\u0001';
}
}
}
return tabuleiro;
}
- Execute várias vezes o programa Labirinto e relate se houve mudanças na posição e quantidade de obstáculos que formam as paredes internas do labirinto.
Resposta: A posição e quantidade de obstáculos muda
- Teste o uso de outros caracteres para as constantes usadas no programa e indique se você encontrou valores mais adequados que os mostrados na aula (deixam o tabuleiro mais bonito, são mais simples de serem visualizados etc.).
Resposta:O uso do símbolo de quadrado do unicode mostrou-se muito bom para as paredes internas
- Altere o valor da constante PROBABILIDADE e relate o que acontece quando aumentamos ou diminuímos o seu valor.
Resposta: Quando a constante PROBABILIDADE aumenta o número de obstáculos diminui e quando a constante PROBABILIDADE diminui o número de obstáculos aumenta. A probabilidade de inserir um obstáculo da matriz é sempre igual a 1 - PROBABILIDADE.
Autoavaliação
- Qual a estrutura de dados que se pode utilizar para representar o tabuleiro do jogo de labirinto?
Resposta:Uma Matriz.
- Como podemos preencher os obstáculos (paredes internas) no tabuleiro do jogo, de forma que toda vez que se jogue, um novo tabuleiro seja mostrado?
Resposta: Percorrendo a Matriz e utilizando uma função aleatória para determinar a probabilidade de inserir obstáculos nos espaços vazios do labirinto.
Jogo do Labirinto 2
Atividade 01
- Altere sua implementação do programa Labirinto para apresentar o tabuleiro com as posições de início e destino, como mostrado nesta parte da aula. Tente não copiar o código mostrado, mas fazer sem olhar o material da aula. Relate se você conseguiu fazer a implementação sem copiar, se você fez algo de diferente em termos de implementação ou se a sua implementação ficou igual à mostrada na aula.
Resposta: Utilizei o mesmo algoritmo mas mudei os parâmetros. A linha de início está em um intervalo de 1 a 4, a linha de destino está em um intervalo de 5 a 8. As colunas de ambos podem ir de 1 a 8. Modifiquei também os símbolos de início e destino.
linhaInicio = gerarNumero(1, TAMANHO / 2 - 1);
colunaInicio = gerarNumero(1, TAMANHO-2);
tabuleiro[linhaInicio][colunaInicio] = '\u00A9';
int linhaDestino = gerarNumero(TAMANHO / 2, TAMANHO - 2);
int colunaDestino = gerarNumero(1, TAMANHO - 2);
tabuleiro[linhaDestino][colunaDestino] = '\u00D7';
public static int gerarNumero(int minimo, int maximo) {
int valor = (int) Math.round(Math.random() * (maximo - minimo));
return minimo + valor;
}
- Execute várias vezes o programa Labirinto e relate se houve mudanças na posição dos pontos de início e destino do labirinto.
Resposta: A cada execução os pontos de início e destino mudam.
- Teste o uso de outros caracteres para as constantes de INICIO e DESTINO usadas no programa e indique se você encontrou valores mais adequados (para deixar o tabuleiro mais bonito, mais simples de ser visualizado etc. que os mostrados na aula).
Resposta: Para o ponto de Inicio usei o símbolo de Copyright para representar o personagem que deseja sair do labirinto. 'C' significando 'Character'. Para o ponto de destino usei a marca de X do unicode.
- Altere a função "inicializarMatriz()" para posicionar o caractere de início na parte inferior à esquerda do tabuleiro, e para posicionar o caractere de destino na parte superior à direita do tabuleiro. Execute e confira se sua implementação está correta.
Resposta: A linha de início e a coluna de destino está em um intervalo de 5 a 8, a linha de destino e a coluna de início está em um intervalo de 1 a 4.
Atividade 02
- Altere sua implementação do programa Labirinto para ele procurar e mostrar um caminho válido, como mostrado nesta última parte da aula. Tente não copiar o código mostrado, mas fazer sem olhar o material da aula. Relate se você conseguiu fazer a implementação sem copiar, se você fez algo de diferente em termos de implementação ou se a sua implementação ficou igual à mostrada na aula.
Resposta: A solução dessa parte do código ficou igual pois não conseguiria responder adequadamente as próximas questões com as soluções diferentes que encontrei. Porém modifiquei os símbolos de beco sem saída pelo símbolo '_' pois forma um beco sem saída entre os quadrados
- Execute várias vezes o programa Labirinto e relate se houve mudanças na posição dos pontos de início e destino e nos caminhos encontrados. Eles foram os menores caminhos possíveis dentro do tabuleiro? Sempre foi possível encontrar caminhos válidos?
Resposta: Nem sempre o caminho mais curto é tomado. Algumas vezes não foi possível encontrar o caminho. Quanto menor a constante de PROBABILIDADE mais difícil é encontrar um caminho.
- Teste o uso de outros caracteres para as constantes de CAMINHO e SEM_SAIDA usadas no programa e indique se você encontrou valores mais adequados (para deixar o tabuleiro mais bonito, mais simples de ser visualizado etc.) que os mostrados na aula.
Resposta: Mudei apenas o símbolo de SEM_SAIDA para '_' pois entre os quadrados parece ser um beco sem saída.
- Altere o tempo em "milissegundo"s do comando "Thread.sleep()" para mais e para menos. Relate o que acontece com essas mudanças, e qual seria o melhor valor para você poder acompanhar a execução do algoritmo de busca.
Resposta: Ao diminuir o valor a velocidade de impressões fica mais rápida. Ao aumentar o valor a velocidade fica mais lenta. O valor de 400 foi o mais adequado para mim pois consigo identificar o caminho sendo feito mesmo quando ele é curto.
Autoavaliação
- Qual a ideia do uso da recursão utilizada na programação do programa Labirinto.
Resposta: A ideia do uso da recursão é receber uma posição na matriz e tentar andar nas direções, encontrando uma direção valida, preenche o caminho com um ponto atualiza a posição e tenta andar novamente a partir desta nova direção. A recursão repete o processo de buscar caminho e marcar ele a partir da nova posição na matriz.
- Na sua opinião, códigos que utilizam recursão são intuitivos? Você conseguiu entender facilmente o código recursivo do programa Labirinto?
__Resposta: Eu diria que recursão é uma das partes mais complicadas da programação para começar a entender. Uma vez que você entende que uma função recursiva tem sempre uma condição de parada, basta entender como a parte recursiva da função funciona com o auxílio de papel e caneta. Uma vez que você entende o comportamento recursivo você sabe que ele se repete até a condição de parada e o código foi desvendado. Mesmo durante que durante a recursão sejam utilizados 3 métodos por serem métodos simples foi bem fácil de entender o que estava acontecendo. Os comentários ajudaram bastante também.