Jogo da adivinhação (guess) #4

Open
opened 2025-08-25 21:38:49 -03:00 by blau_araujo · 0 comments
Owner

Os arquivos de áudio podem ser baixados em:

https://blauaraujo.com/downloads/

Programa: guess

#!/bin/bash
# shellcheck disable=SC2162,SC2059,SC2086,SC1073,SC1064,SC1072

# Config -----------------------------------------------------------------------

source ./guessrc

# Command options --------------------------------------------------------------

case "$1" in
    '-q')
	# desabilitar sons...
	[[ "$1" == '-q' ]] && play_sounds=0
	;;
    '-h')
	# imprimir ajuda e sair...
	echo "$help"
	exit
esac

# Functions --------------------------------------------------------------------

# retorna 'sucesso' se $1 expandir alguma coisa...
non_empty () [[ -n "$1" ]]

# retorna 'sucesso' se $1 for um número válido...
is_number () [[ "$1" =~ ^(0|[1-9][0-9]*)$ ]]

# retorna 'sucesso' se $1 estiver na faixa de números esperada...
in_range () (( $1 >= 1 && $1 <= num_max ))

# retorna 'sucesso' se a entrada for '[Qq]'...
quit_game () [[ "${guess,,}" == q ]]

# toca um arquivo de áudio mp3...
play () {
    ((play_sounds)) || return
    mpg123 -q "$1" &> /dev/null &
}

# imprime mensagem de erro...
input_error () {
    printf '\e[31m%s\e[0m\n' "${err[$1]}"
    play "$err_audio"
}

# termina com uma provocação...
quit_taunt () {
    clear
    printf '\e[33;1m%s\e[0m\n\n' "$taunt"
    play "$taunt_audio"
}

# Main -------------------------------------------------------------------------

# requer mpg123 para tocar sons...
command -v mpg123 &> /dev/null || play_sounds=0

# concatena o prompt de palpites com o número máximo...
prompt_guess=$(printf "$prompt_guess" $num_max)

# desabilita Ctrl+L...
bind -r "\C-l"

# game loop...
while :; do
    rand=$((RANDOM % num_max + 1))
    try=0
    clear
    printf '%b\n%s\n\n' "$title" "$help_line"
    
    # guess loop...
    while read -rep "$prompt_guess" guess; do
	# vai amarellar?
	quit_game && { quit_taunt; exit; }
	
	# validação da entrada...
	non_empty $guess   || { input_error $IS_EMPTY; continue; }
	is_number "$guess" || { input_error $NOT_NUMB; continue; }
	in_range "$guess"  || { input_error $OUT_RANGE; continue; }
	
	# incremento da contagem de palpites válidos...
	((try++))
	
	# checagem do palpite...
	[[ guess -eq rand ]] && break
	printf "$wrong_number" "${comp[guess < rand]}"
    done
    
    # Acerto...
    ((try > 0)) && {
	printf "$win" $try
	play "$win_audio"
    }

    # jogar novamente?
    read -sN1 -p "$prompt_again" again
    [[ ${again,,} == n ]] && break
done

# amarelou...
quit_taunt

Configurações: guessrc

# ------------------------------------------------------------------------------
# Configurações do Jogo da Adivinhação
# ------------------------------------------------------------------------------
num_max=100
# ------------------------------------------------------------------------------
IS_EMPTY=1
NOT_NUMB=2
OUT_RANGE=3
# ------------------------------------------------------------------------------
title='\e[34;1mJOGO DA ADIVINHAÇÃO\e[0m'
help_line="Digite 'q' para desistir..."

prompt_guess='\e[1mDigite um número de 1 a %d:\e[0m '
prompt_again='Quer jogar novamente (S/n)? '

comp[0]=Alto
comp[1]=Baixo

wrong_number='\e[31m%s demais!\e[0m\n'
win='\n\e[32;1mNa mosca! Você acertou com %d palpites!\e[0m\n'
taunt="Amarelou, hein... ¯\_(ツ)_/¯"

err[IS_EMPTY]='Deu branco? Manda um número aí...'
err[NOT_NUMB]='Eu disse um número! (•`_´•)'
err[OUT_RANGE]="Eu disse de 1 a $num_max! (•\`_´•)"
# ------------------------------------------------------------------------------
help='Jogo da adivinhação (guess)

USO:
    guess [OPÇÃO]

OPÇÕES:
    -q    Desabilita sons
    -h    Exibe esta ajuda e sai

NOTA:
    Requer mpg123 para tocar sons.
'
# ------------------------------------------------------------------------------
play_sounds=1

taunt_audio=./chicken.mp3
err_audio=./error.mp3
win_audio=./winner.mp3

Para testar, precisa do programa mpg123 e dos arquivos de áudio mp3 que vocês quiserem usar. Depois disso, é só alterar a configuração para redefinir os nomes dos arquivos nas variáveis...

taunt_audio=./chicken.mp3
err_audio=./error.mp3
win_audio=./winner.mp3

Elas estão no final do arquivo.

Se não quiserem usar sons, é só alterar a variável play_sounds, também no final das configurações, para 0.

Os arquivos de áudio podem ser baixados em: https://blauaraujo.com/downloads/ Programa: `guess` ```bash #!/bin/bash # shellcheck disable=SC2162,SC2059,SC2086,SC1073,SC1064,SC1072 # Config ----------------------------------------------------------------------- source ./guessrc # Command options -------------------------------------------------------------- case "$1" in '-q') # desabilitar sons... [[ "$1" == '-q' ]] && play_sounds=0 ;; '-h') # imprimir ajuda e sair... echo "$help" exit esac # Functions -------------------------------------------------------------------- # retorna 'sucesso' se $1 expandir alguma coisa... non_empty () [[ -n "$1" ]] # retorna 'sucesso' se $1 for um número válido... is_number () [[ "$1" =~ ^(0|[1-9][0-9]*)$ ]] # retorna 'sucesso' se $1 estiver na faixa de números esperada... in_range () (( $1 >= 1 && $1 <= num_max )) # retorna 'sucesso' se a entrada for '[Qq]'... quit_game () [[ "${guess,,}" == q ]] # toca um arquivo de áudio mp3... play () { ((play_sounds)) || return mpg123 -q "$1" &> /dev/null & } # imprime mensagem de erro... input_error () { printf '\e[31m%s\e[0m\n' "${err[$1]}" play "$err_audio" } # termina com uma provocação... quit_taunt () { clear printf '\e[33;1m%s\e[0m\n\n' "$taunt" play "$taunt_audio" } # Main ------------------------------------------------------------------------- # requer mpg123 para tocar sons... command -v mpg123 &> /dev/null || play_sounds=0 # concatena o prompt de palpites com o número máximo... prompt_guess=$(printf "$prompt_guess" $num_max) # desabilita Ctrl+L... bind -r "\C-l" # game loop... while :; do rand=$((RANDOM % num_max + 1)) try=0 clear printf '%b\n%s\n\n' "$title" "$help_line" # guess loop... while read -rep "$prompt_guess" guess; do # vai amarellar? quit_game && { quit_taunt; exit; } # validação da entrada... non_empty $guess || { input_error $IS_EMPTY; continue; } is_number "$guess" || { input_error $NOT_NUMB; continue; } in_range "$guess" || { input_error $OUT_RANGE; continue; } # incremento da contagem de palpites válidos... ((try++)) # checagem do palpite... [[ guess -eq rand ]] && break printf "$wrong_number" "${comp[guess < rand]}" done # Acerto... ((try > 0)) && { printf "$win" $try play "$win_audio" } # jogar novamente? read -sN1 -p "$prompt_again" again [[ ${again,,} == n ]] && break done # amarelou... quit_taunt ``` Configurações: `guessrc` ```bash # ------------------------------------------------------------------------------ # Configurações do Jogo da Adivinhação # ------------------------------------------------------------------------------ num_max=100 # ------------------------------------------------------------------------------ IS_EMPTY=1 NOT_NUMB=2 OUT_RANGE=3 # ------------------------------------------------------------------------------ title='\e[34;1mJOGO DA ADIVINHAÇÃO\e[0m' help_line="Digite 'q' para desistir..." prompt_guess='\e[1mDigite um número de 1 a %d:\e[0m ' prompt_again='Quer jogar novamente (S/n)? ' comp[0]=Alto comp[1]=Baixo wrong_number='\e[31m%s demais!\e[0m\n' win='\n\e[32;1mNa mosca! Você acertou com %d palpites!\e[0m\n' taunt="Amarelou, hein... ¯\_(ツ)_/¯" err[IS_EMPTY]='Deu branco? Manda um número aí...' err[NOT_NUMB]='Eu disse um número! (•`_´•)' err[OUT_RANGE]="Eu disse de 1 a $num_max! (•\`_´•)" # ------------------------------------------------------------------------------ help='Jogo da adivinhação (guess) USO: guess [OPÇÃO] OPÇÕES: -q Desabilita sons -h Exibe esta ajuda e sai NOTA: Requer mpg123 para tocar sons. ' # ------------------------------------------------------------------------------ play_sounds=1 taunt_audio=./chicken.mp3 err_audio=./error.mp3 win_audio=./winner.mp3 ``` Para testar, precisa do programa `mpg123` e dos arquivos de áudio mp3 que vocês quiserem usar. Depois disso, é só alterar a configuração para redefinir os nomes dos arquivos nas variáveis... ```bash taunt_audio=./chicken.mp3 err_audio=./error.mp3 win_audio=./winner.mp3 ``` Elas estão no final do arquivo. Se não quiserem usar sons, é só alterar a variável `play_sounds`, também no final das configurações, para `0`.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: blau_araujo/bash#4
No description provided.