|
Patinho Faminto 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 |
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.
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. Repare que nosso tabuleiro tem 5 linhas e 5 colunas. 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? E se o script sorteasse a coluna 4: for ((x=1;x>=1;x++)); Usei o FOR para repetir sempre os mesmo comandos de imprimir tabuleiro, etc...
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. Lembre que a posição do barco é definida por "LIN COLUNA" que define em qual linha ele está e em qual coluna. Veja que se "barquinho1=1 2" então a "primeira metade" do barco está na linha 1 e coluna 2. 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". Em seguida o script define "mudar" igual a "=", essa variável serve para escrever no tabuleiro.
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. 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 ).
${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".
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. Nota: 10 |
|