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

MySQL-Guia do Programador
André Milani

Sony Cyber-shot DSC - T70
8.1 Megapixels

Trilogia Star Wars

CD Theater of Salvation
Edguy

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 - Parte 1

Criei 2 scripts para o Jogo Batalha Naval, para mostrar que sempre é possível fazer a mesma coisa de formas diferentes.
Veja o primeiro script:

batalha_naval.sh

ataque_b1=0

linha[0]="# # # # #"
linha[1]="# # # # #"
linha[2]="# # # # #"
linha[3]="# # # # #"
linha[4]="# # # # #"


# Forma do Barquinho "=="
barquinho1="$((RANDOM % 5)) $((RANDOM % 4))"

for ((x=1;x>=1;x++));
do

echo "  0 1 2 3 4"
echo "A ${linha[0]}"
echo "B ${linha[1]}"
echo "C ${linha[2]}"
echo "D ${linha[3]}"
echo "E ${linha[4]}"

read -p "Onde quer que eu ataque? Ex: A 3. " lin coluna

case "$lin" in
	[Aa]) lin=0;;
	[Bb]) lin=1;;
	[Cc]) lin=2;;
	[Dd]) lin=3;;
	[Ee]) lin=4;;
esac

if [[ "${lin} ${coluna}" = "$barquinho1" || "${lin} $(($coluna-1))" = "$barquinho1" ]]
	then	
		let ataque_b1++
		mudar='='
	else
		mudar=' '
fi

linha[$lin]=${linha[$lin]:0:$(($coluna*2))}${mudar}${linha[$lin]:$(((coluna*2)+1))}


if [[ $ataque_b1 -eq 2 ]]
			then
			echo -e "KABRUM\nVocê afundou o barco!"
			echo "Você Acertou na tentativa número: ${x}"
			exit 0
fi

clear
done

 
 

Vamos explicar o script:

ataque_b1=0
Criei uma variável para contar quantas vezes o barco foi atingido, como acabamos de iniciar o script o barco não foi atingido e o valor é zero.

linha[0]="# # # # #"
linha[1]="# # # # #"
linha[2]="# # # # #"
linha[3]="# # # # #"
linha[4]="# # # # #"

Usei o array linha para criar o tabuleiro do jogo, que mostrará um "#" sempre na posição que o jogador ainda não jogou nenhuma bomba.

# Forma do Barquinho "=="
barquinho1="$((RANDOM % 5)) $((RANDOM % 4))"

Criei uma linha comentada ( que não será lida pelo shell ) para quem ler o script saber que o Barco é "==" ou seja, ocupa espaço de dois caracteres.
Em seguida faço o script sortear uma posição para o barco e gravo essa informação na variável "barquinho1".

Repare que nosso tabuleiro tem 5 linhas e 5 colunas.
Por isso usei o "$((RANDOM % 5))" para sortear em que linha o barco estará.
E usei o "$((RANDOM % 4))" para sortear em que coluna o barco estará.

Por que não foi usado "$((RANDOM % 5))" para sortear em que coluna o barco estará se o tabuleiro tem o mesmo número de linhas e colunas?
Lembra que o barco ocupa sempre 2 colunas?
Por isso se o script sortear coluna 0:
Então o barco ocupará a coluna 0 e a coluna 1

E se o script sorteasse a coluna 4:
Então o barquinho ocuparia a coluna 4 e coluna 5
Como nosso tabuleiro não tem coluna 5, então o barco ficaria fora da coluna, isso seria um BUG

 
 

for ((x=1;x>=1;x++));

Usei o FOR para repetir sempre os mesmo comandos de imprimir tabuleiro, etc...
E porque ele serviria como um contador para poder informar o usuário quantas tentativas ele fez até conseguir afundar o barco

echo "  0 1 2 3 4"
echo "A ${linha[0]}"
echo "B ${linha[1]}"
echo "C ${linha[2]}"
echo "D ${linha[3]}"
echo "E ${linha[4]}"

Imprime o tabuleiro na tela

 
 

read -p "Onde quer que eu ataque? Ex: A 3. " lin coluna

Pergunta em qual lugar o usuário que lançar a bomba e grava o valor em duas variáveis diferentes "lin" e "coluna".

case "$lin" in
	[Aa]) lin=0;;
	[Bb]) lin=1;;
	[Cc]) lin=2;;
	[Dd]) lin=3;;
	[Ee]) lin=4;;
esac

Para a array ser chamada ela precisa ser chamada com um número, por isso o CASE substitui a letra, que o usuário digitou, por um número.

 
 

if [[ "${lin} ${coluna}" = "$barquinho1" || "${lin} $(($coluna-1))" = "$barquinho1" ]]

O "${lin} ${coluna}" = "$barquinho1" Verifica se a posição digitada ( Linha e Coluna ) é igual a posição do barco.
O "${lin} $(($coluna-1))" = "$barquinho1" Verifica se subtraindo um da posição digitada para coluna é igual a posição do barco.
Você deve estar se pensando: "Como é que é? Não entendí nada."

Lembre que a posição do barco é definida por "LIN COLUNA" que define em qual linha ele está e em qual coluna.
Lembre também que o barco ocupa o espaço de dois caracteres.

Veja que se "barquinho1=1 2" então a "primeira metade" do barco está na linha 1 e coluna 2.
Como o barco terá sua outra metade na mesma linha, então se eu definisse uma variável para essa outra metade ela seria:
"barquinho2=1 3"
Certo?

Para não criar uma variável para a segunda metade do barco, então eu usei "${lin} $(($coluna-1))" para fazer esse teste sem precisar criar a variável

		let ataque_b1++
		mudar='='
	else
		mudar=' '

Se a bomba estiver no local da primeira ou da segunda metade do barco o script soma mais um a variável "ataque_b1".
Assim quando essa variável valer 2 saberemos que o barco todo foi atingido.

Em seguida o script define "mudar" igual a "=", essa variável serve para escrever no tabuleiro.
Quando acertar o barco mostra "=" e quando errar o barco ele mostra um espaço vazio ( ' ' ).

 
 

linha[$lin]=${linha[$lin]:0:$(($coluna*2))}${mudar}${linha[$lin]:$(((coluna*2)+1))}

Seleciona a linha em que o jogador lançou sua bomba e altera o caracter, na posição em que o jogador lançou a bomba, mostrando se o usuário acertou o barco ou não.
Essa é a linha mais complicada então vamos por partes.

linha[$lin]=

Seleciona a linha para alterar seu conteúdo

${linha[$lin]:0:$(($coluna*2))}

Imprime a linha da forma que está atualmente até a posição "$coluna*2" ( $coluna é a posição da coluna que o usuário digitou ).
Por que tem esse "vezes 2"?
Veja que na hora de definir nosso tabuleiro, coloquei um espaço entre cada '#'. ( ex: linha[0]="# # # # #" )
Deixei esse espaço porque senão o tabuleiro ficaria pouco legível para o usuário.
Isso quer dizer que a coluna 4, por exemplo, na verdade fica na posição 8.
Por isso sempre tem esse "vezes 2".

${mudar}

Mostra '=' ou um espaço em branco ( ' ' ). Lembra que essa variável foi definida ao verificar se a bomba atingiu o barco.

${linha[$lin]:$(((coluna*2)+1))}

Imprime a linha de forma que está atualmente da posição "($coluna*2)+1".
Por que "vezes 2 mais 1"?
O "vezes dois" é pelo mesmo motivo de antes, o espaço entre os '#'.
O "mais 1" é porque se o usuário selecionou a coluna 2, então o caracter 2 será ocupado pelo conteúdo de ${mudar}, portanto devemos imprimir do caracter 3 em diante.

 
 

if [[ $ataque_b1 -eq 2 ]]
			then
			echo -e "KABRUM\nVocê afundou o barco!"
			echo "Você Acertou na tentativa número: ${x}"
			exit 0
fi

Verifica se a variável já atingiu o valor 2, o que signfica que o barco foi totalmente atingido.
Se sim, mostra uma mensagem para usuário dizendo que ele afundou o barco.

 
 

Nota: 10

Votar:
Postado em: 2008-04-03

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