Ver Indice Geral da Apostila de Shell Script
Aplicação Prática: Jogo Batalha Naval - BUGs - Parte Final
Sempre que criar programas deve-se pensar na lógica do que está acontecendo e pensar em possíveis BUGs no programa.
Se você pensa em possíveis BUGs pode resolvê-los antes que usuário perceba os erros.
Vejamos alguns BUGs apresentados nos scripts de Batalha Naval que apresentei
1. Não testa se o usuário entrou com dois valores ( um para linha e outro para coluna )
Dependendo do Script se o usuário não digitar 2 valores, pode ser que o script seja finalizado, gerando um erro.
Uma solução simples seria usar um IF para verificar o que o usuário digitou:
if [[ ${lin} = "" || ${coluna} = "" ]]
then
echo "Entre com valores válidos. Ex: a 0"
fi
2. Não testa se a posição da Bomba é Válida
Se o usuário acidentalmente lançar uma bomba fora do tabuleiro, como por exemplo: "a 5".
O script aceita essa posição e ainda "cria" essa posição, deformando nosso tabuleiro.
Isso não deveria acontecer, com um IF é possível resolver esse problema e o problema número 1.
Vejamos:
if [[ ${lin} != [a-e] || ${coluna} != [0-4] ]]
then
echo "Entre com valores válidos. Ex: a 0"
fi
3. Não testa se a Bomba ja foi lançada nessa posição.
A princípio esse BUG não parece ter grandes problemas.
Se o usuário acertar o barco em uma posição e em seguida lançar mais 2 bombas na mesma posição então o script irá mostrar a mensagem que ele destruiu todos os barcos, mesmo tendo destruído apenas um barco.
Outro problema é que se o usuário lançar uma bomba em um lugar já lançado, então essa jogada não deveria ser contada.
Para resolver isso use o IF:
if eval [ "\${linha$lin[$coluna]}" != "\#" ]
then
echo "A bomba já foi lançada nessa posição"
fi
4. Ao sortear a posição do barco não verifica se já existe um barco nessa mesma posição
Imagina se um barco é sorteado na mesma posição que outro barco?
O Usuário pode lançar bomba pelo tabuleiro todo e não ganhar o jogo.
Uma possível solução para o problema seria usar o WHILE para verificar se o barco 2 é igual a o barco 1, enquanto isso for verdade o WHILE executa um comando que sorteia uma nova posição para barco2.
while [ $barco2 = $barco1 ]
do
barco2=${letras[$((RANDOM % 5))]}$((RANDOM % 5))
done
while [[ $barco3 = $barco2 || $barco3 = $barco2 ]]
do
barco3=${letras[$((RANDOM % 5))]}$((RANDOM % 5))
done
O código com os BUGs resolvidos
| batalha_naval3.sh |
linhaa=( "#" "#" "#" "#" "#" )
linhab=( "#" "#" "#" "#" "#" )
linhac=( "#" "#" "#" "#" "#" )
linhad=( "#" "#" "#" "#" "#" )
linhae=( "#" "#" "#" "#" "#" )
letras=("a" "b" "c" "d" "e")
barco1=${letras[$((RANDOM % 5))]}$((RANDOM % 5))
barco2=${letras[$((RANDOM % 5))]}$((RANDOM % 5))
barco3=${letras[$((RANDOM % 5))]}$((RANDOM % 5))
while [ $barco2 = $barco1 ]
do
barco2=${letras[$((RANDOM % 5))]}$((RANDOM % 5))
done
while [[ $barco3 = $barco2 || $barco3 = $barco2 ]]
do
barco3=${letras[$((RANDOM % 5))]}$((RANDOM % 5))
done
afundados=0
for ((x=1;x>=0;x++));
do
clear
echo " 0 1 2 3 4"
echo "a ${linhaa[@]}"
echo "b ${linhab[@]}"
echo "c ${linhac[@]}"
echo "d ${linhad[@]}"
echo "e ${linhae[@]}"
read -p "Onde quer que eu ataque? " lin coluna
if [[ ${lin} != [a-e] || ${coluna} != [0-4] ]]
then
echo "Entre com valores válidos. Ex: a 0"
let x--
sleep 1
elif eval [ "\${linha$lin[$coluna]}" != "\#" ]
then
echo "A bomba já foi lançada nessa posição"
let x--
sleep 1
else
if [[ "${lin}${coluna}" = "$barco1" || "${lin}${coluna}" = "$barco2" || "${lin}${coluna}" = "$barco3" ]]
then
escrita='='
let afundado++
if [ $afundado -eq 3 ]
then
echo "KABUM!"
echo "Você acertou todos os barcos na tentativa número: $x"
exit 0
fi
else
escrita='.'
fi
eval linha${lin}[$coluna]="$escrita"
fi
done
|
Nota: 9
Postado em: 2008-04-06
Ver Indice Geral da Apostila de Shell Script