Tarefa
2o Exercício Programa: Campo Minado
Condições de conclusão
Aberto: terça-feira, 21 ago. 2007, 10:00
Vencimento: sábado, 8 set. 2007, 23:55
Enunciado do EP2 - Campo Minado [PDF] (versão editada em 21/08 19:00h)
Essa versão editada apenas torna mais claro alguns itens que poderiam causar dúvidas, como um ponto (x,y), que agora virou (lin, col), etc. Nada de mais significativo foi alterado.
Não deixe de seguir as Instruções para entrega de EPs
Dicas:
- Geração de Números Aleatórios
- Algoritmos Recursivos
- Registros e Structs
- Listas ligadas (ou encadeadas)
Outras Dicas:
1 - Faça seu EP por partes, e teste cada parte antes de continuar.
2 - Problema na leitura de caracteres:
4 - Executável Linux
Não deixe de voltar aqui para ver mais dicas...
Essa versão editada apenas torna mais claro alguns itens que poderiam causar dúvidas, como um ponto (x,y), que agora virou (lin, col), etc. Nada de mais significativo foi alterado.
Não deixe de seguir as Instruções para entrega de EPs
Dicas:
- Geração de Números Aleatórios
- Algoritmos Recursivos
- Registros e Structs
- Listas ligadas (ou encadeadas)
Outras Dicas:
1 - Faça seu EP por partes, e teste cada parte antes de continuar.
Por exemplo, implemente a função main só para a leitura dos parâmetros da linha de comando, e os imprima, para se certificar que seu programa lê os parâmetros corretamente. A seguir, implemente a função sorteiaBombas, e imprima a matriz para se certificar que a função funciona corretamente. Faça o mesmo para a função contaBombas, imprimeCampoMinado, etc. Também procure documentar o seu programa a medida que você o implementa, e não apenas ao final.
2 - Problema na leitura de caracteres:
Ao usar caracteres para ler opções do teclado, sempre coloque um espaço antes do
%c, da seguinte forma:
char c;
scanf(" %c", &c); /* existem um branco antes do %c */
Porque?
Em um arquivo, há muitos caracteres que você não vê, e são considerados caracteres em branco. Além do espaço, podemos citar o tab ('\t'), o pula linha ('\n'), etc. Sem o espaço antes do %c, o caractere lido será o 1o caractere depois do último elemento lido, que pode ser um dos caracteres em branco (como o ENTER ou \n), o que certametne causará confusão no seu programa. Você pode interpretar esse espaço antes do %c como sendo uma forma de dizer em C que você espera 0 (zero) ou mais caracteres em branco antes de um caractere não branco.
3 - Possível falta de consistência ao voltar jogadas%c, da seguinte forma:
char c;
scanf(" %c", &c); /* existem um branco antes do %c */
Porque?
Em um arquivo, há muitos caracteres que você não vê, e são considerados caracteres em branco. Além do espaço, podemos citar o tab ('\t'), o pula linha ('\n'), etc. Sem o espaço antes do %c, o caractere lido será o 1o caractere depois do último elemento lido, que pode ser um dos caracteres em branco (como o ENTER ou \n), o que certametne causará confusão no seu programa. Você pode interpretar esse espaço antes do %c como sendo uma forma de dizer em C que você espera 0 (zero) ou mais caracteres em branco antes de um caractere não branco.
Para simplificar a implementação do jogo, utilizamos a função fechaPosição que fecha toda a vizinhança de uma região com zero bombas vizinhas. Se alguma dessas posições vizinhas tiver sido aberta em outras jogadas, isso não precisa ser considerado pela função. Dessa forma, ao voltar alguma jogadas, o número de posições fechadas pode ser zero.
Para exemplificar melhor esta situação, considere a saída abaixo produzida com o executável Linux (veja próximo item) para os parâmetros 4 4 2 0:
..| 0 1 2 3
----------------
0 | * * * *
1 | * * * *
2 | * * * *
3 | * * * *
> a 0 2
..| 0 1 2 3
----------------
0 | * * 1 *
1 | * * * *
2 | * * * *
3 | * * * *
posicoes abertas nesta jogada: 1
total de posicoes abertas: 1
> a 0 0
..| 0 1 2 3
----------------
0 | 0 0 1 *
1 | 0 0 1 *
2 | 0 1 2 *
3 | 0 1 * *
posicoes abertas nesta jogada: 10
total de posicoes abertas: 11
> v
..| 0 1 2 3
----------------
0 | * * * *
1 | * * * *
2 | * * * *
3 | * * * *
posicoes fechadas nesta jogada: 11
total de posicoes abertas: 0
> v
..| 0 1 2 3
----------------
0 | * * * *
1 | * * * *
2 | * * * *
3 | * * * *
posicoes fechadas nesta jogada: 0
total de posicoes abertas: 0
> v
nao ha mais jogadas para voltar.
> f
fim do jogo.
Observe que ao desfazer a última jogada, isto é, a abertura a partir da posição (0, 0), a abertura a partir de (0, 2) também é desfeita. Assim, executar o comando "v" mais uma vez não afeta o estado do campo minado.
Para exemplificar melhor esta situação, considere a saída abaixo produzida com o executável Linux (veja próximo item) para os parâmetros 4 4 2 0:
..| 0 1 2 3
----------------
0 | * * * *
1 | * * * *
2 | * * * *
3 | * * * *
> a 0 2
..| 0 1 2 3
----------------
0 | * * 1 *
1 | * * * *
2 | * * * *
3 | * * * *
posicoes abertas nesta jogada: 1
total de posicoes abertas: 1
> a 0 0
..| 0 1 2 3
----------------
0 | 0 0 1 *
1 | 0 0 1 *
2 | 0 1 2 *
3 | 0 1 * *
posicoes abertas nesta jogada: 10
total de posicoes abertas: 11
> v
..| 0 1 2 3
----------------
0 | * * * *
1 | * * * *
2 | * * * *
3 | * * * *
posicoes fechadas nesta jogada: 11
total de posicoes abertas: 0
> v
..| 0 1 2 3
----------------
0 | * * * *
1 | * * * *
2 | * * * *
3 | * * * *
posicoes fechadas nesta jogada: 0
total de posicoes abertas: 0
> v
nao ha mais jogadas para voltar.
> f
fim do jogo.
Observe que ao desfazer a última jogada, isto é, a abertura a partir da posição (0, 0), a abertura a partir de (0, 2) também é desfeita. Assim, executar o comando "v" mais uma vez não afeta o estado do campo minado.
4 - Executável Linux
Aqui encontra-se um executável para Linux do EP2 que pode ser usado para verificar como deve funcionar o seu programa. Para rodá-lo execute no shell (assumindo que o executável está no diretório atual):
./ep2 nLinhas nColunas nBombas semente
por exemplo:
./ep2 8 8 8 0
Não se esqueça de dar permissão de execução para o arquivo, da seguinte forma (também assumindo que o executável está no diretório atual):
chmod 755 ep2
./ep2 nLinhas nColunas nBombas semente
por exemplo:
./ep2 8 8 8 0
Não se esqueça de dar permissão de execução para o arquivo, da seguinte forma (também assumindo que o executável está no diretório atual):
chmod 755 ep2
Não deixe de voltar aqui para ver mais dicas...