Compare Preços no Buscape e no BondFaro
BuscaPé, líder em comparação de preços na América Latina

Asus Eee PC 0.9 Ghz
512Mb Ram - 4Gb HD

Expressões Regulares
Aurelio Marinho Jargas

Sony Cyber-shot DSC - T70
8.1 Megapixels

DVD Snoopy
Volte Para Casa

CD Tokyo Tales
Blind Guardian

Pinguim de Pelúcia

Patinho Faminto
www.patinho.net

Apostilas
Expr Regular
Remasterização
SED
Shell Script

Distros
Dizinha
Patinho Faminto

Nerd
Desejo Nerd
Shell Scripts

Artístico
Livro
Musica
Poesias
Tirinhas

Bobagens
Ascii Art
Games Antigos
Porque Amar Nerds
Porque Não Amar Nerds

Eu
About Me
Recomendo
Contato
DOAÇÕES

Amigos
Aurélio
Jogos Antigos
NeoDizinha
Nerds Nervosos
ProibidoParaNormais


* = Recentemente Atualizado



website stats
Locations of visitors to this page

Anúncio provido pelo BuscaPé
BuscaPé, líder em comparação de preços na América Latina

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

Votar:
Postado em: 2008-04-06

Ver Indice Geral da Apostila de Shell Script

Doações
Se quer nos ajudar, pode doar pelo PagSeguro

Ou pode doar pelo Paypal clicando no botão DONATE

Compare Produtos, Lojas e Preços


As poesias devem virar um livro impresso?
Claro
Só se tiver menos de 60 páginas
Só se tiver entre 60 e 120 páginas
Só se tiver mais que 120 páginas
Só vou comprar se for barato
Só vou comprar para você ficar feliz
Livro? Que Livro? Que poesia?
Resultado