Rock, paper, scissors, lizard, Spock… bash!

Italiano

Molti conosceranno il tradizionale “Sasso, Carta, Forbici” (la “morra cinese”), qualcuno in meno potrebbe conoscerne la sua variante più recente “Sasso, Carta, Forbici, Lizard, Spock“. Secondo Sam Kass e Karen Bryla, che hanno inventato, o piuttosto “esteso”, il gioco, una partita giocata nel modo tradizionale termina molto spesso in un pareggio. Con sole tre possibilità a disposizione, c’è 1/3 di probabilità per ciascun risultato (vittoria, sconfitta o pareggio). Con cinque possibilità c’è invece 1 probabilità su 5 di pareggio e 2 su 5 di sconfitta o vittoria. Questo rende le partite sicuramente più interessanti!

Non spiegherò in dettaglio lo script; la sua funzione fondamentale è il confronto tra le due “mani” (giocatore e avversario) per determinare il risultato. Il modo di fare ciò è suggerito dalla tabella inclusa nello script stesso. Ogni mano (elencata nell’ordine specificata sopra nell’array draws) ha una stringa associata, contenuta nell’array results. Se la mano del “Giocatore” (Player) è l’elemento con indice n e la mano dell’avversario (Opponent) è l’elemento con indice m nell’array draws, basta prendere l’m-esimo carattere dell’n-esimo elemento nell’array results per determinare se il giocatore ha vinto (2), perso (1) o pareggiato (0).

Il resto è più che altro formattazione carina del testo per mostrare in maniera ordinata il risultato dell’ultimo turno ed il punteggio: non che non ci sia voluto del tempo per mettere tutto al posto giusto e col colore giusto! Cos’altro aggiungere? Si può giocare contro il computer o lasciare che il cervellone giochi contro se stesso (uno scenario da film “War Games” ;-)). Se siete appassionati di statistica potreste voler verificare se i punteggi tendono a stabilizzarsi dopo qualche centinaio o migliaio di turni: beh, buona fortuna! Probabilmente avete troppo tempo libero…
Per la vostra gioia, guardate come il Dr. Sheldon Cooper spiega le regole del gioco.

Dopo il blocco di codice troverete un video dello script “all’opera”. Dato che WP ogni tanto fa le bizze con il codice, vi prego di segnalarmi eventuali errori. Suggerimenti e miglioramenti sono ugualmente ben accetti. Spero che la mia breve spiegazione sia stata abbastanza chiara. In caso contrario, chiedete pure o semplicemente godetevi il gioco!


English

Many of you know the traditional “Rock, Paper, Scissors” game, fewer might know its more recent variant, “Rock, Paper, Scissors, Lizard, Spock“. According to Sam Kass and Karen Bryla, who invented, or rather “extended”, the game, a game played the traditional way too often ends up in a tie (let me call it “a draw”, you’ll understand why very soon…). With only three possible hands, you have 1/3 chance for each result (win, lose or draw). With five hands, instead, 1 out of 5 leads to a draw, while 2 out of 5 lead to a win or a loss. That makes games surely more interesting!

I am not going to explain the script in detail; its “core” is the way the two hands (player’s and opponent’s) are compared to determine the result. You can figure out the way by the results table in the script itself. Each hand (listed in the order written above, stored in array draws) has a string associated with it, stored in an array results. If player’s draw is the element with index n and opponent’s draw is element with index m in array draws, just take the m-th character of the n-th element in array results to get if player has won (2), lost (1) or drawn (0).

All the rest is just pretty text formatting to display current hand and score: not that it didn’t take some time to put everything in the right place and colour! What else? You can play against computer or just let it play against itself (looks like a “War Games” movie scenario ;-)). If you are keen on statistics you might want to check if scores even out after hundreds or thousands of hands: well, good luck! You probably have too much free time…

For your pleasure, please watch Dr. Sheldon Cooper showing the game rules.

After the code block you’ll find a video of the script “at work”. Please report any mistake in script text: sometimes WP formatting of code acts weird. Suggestions and improvements are welcome, as well. I hope my short explanation was clear enough. Otherwise please ask or just enjoy the game!


Codice / Code

#!/bin/bash
#Rock, Paper, Scissors, Lizard, Spock
clear
gethelp () {
# Instructions and options
echo -e \\033[33\;1m"Run script without options to get this help;
Run with option \"a\" for [a]utomated (CPU vs CPU) game;
Run with option \"h\" for [h]uman (Player vs CPU) game."\\033[0m
# Theory and author's web page
echo -e \\033[32m"---
The Theory:
Scissors cut paper, Paper covers rock,
Rock crushes lizard, Lizard poisons Spock,
Spock smashes scissors, Scissors decapitate lizard,
Lizard eats paper, Paper disproves Spock,
Spock vaporizes rock, Rock crushes scissors.
Visit http://www.samkass.com/theories/RPSSL.html
---"\\033[0m
# Results table
echo -e \\033[33\;1m"Table usage: Result of \"row\" to \"column\" draw
0: draw / 1: \"row\" loses to \"column\" / 2: \"row\" wins to \"column\"
----------------------------------------------------
        | Rock | Paper | Scissors | Lizard | Spock |
--------|------|-------|----------|--------|-------|
   Rock |  0   |   1   |    2     |   2    |   1   |
--------|------|-------|----------|--------|-------|
  Paper |  2   |   0   |    1     |   1    |   2   |
--------|------|-------|----------|--------|-------|
Scissors|  1   |   2   |    0     |   2    |   1   |
--------|------|-------|----------|--------|-------|
 Lizard |  1   |   2   |    1     |   0    |   2   |
--------|------|-------|----------|--------|-------|
  Spock |  2   |   1   |    2     |   1    |   0   |
----------------------------------------------------
Examples: Rock (r1) vs. Paper (c2) -> Result: 1 -> Rock loses on Paper
Lizard (r4) vs. Spock (c5) -> Result: 2 -> Lizard wins on Spock"\\033[0m
}
# Print help and exit with no/invalid options
[[ -z $1 ]] || [[ ${1^} != [A\|H] ]] && gethelp && exit 0
game_type=${1^}
pl_score=0
opp_score=0
hand_count=0
human_player () {
echo -ne "Draw your hand: \\033[35;4;1mR\\033[0mock, \\033[35;4;1mP\\033[0maper, \\033[35;4;1mS\\033[0mcissors,
\\033[35;4;1mL\\033[0mizard or Spoc\\033[35;4;1mk\\033[0m [R,P,S,L,K], X to finish > "
read -n 1 pl_hand; sleep 0.3
[[ "${pl_hand^}" = "X" ]] && final_score && exit 0
until [[ "${pl_hand^}" =~ [R|P|L|S|K] ]]
do
echo
echo -n "Invalid draw, please retry (R, P, S, L, K) > "
read -n 1 pl_hand; sleep 0.3
done
pl_res=$(echo ${pl_hand^} | sed 'y/RPSLK/01234/')
}
final_score () {
if [[ $pl_score -gt $opp_score ]]
then
winner="Player wins!"
elif [[ $pl_score -lt $opp_score ]]
then
winner="Opponent wins!"
else
winner="it's a draw!"
fi
echo -e \\n"Final score: Player $pl_score - $opp_score Opponent
after $hand_count hand(s) $winner"
}
draw_hands () {
if [[ "$game_type" = "A" ]]
then
pl_res=$(($RANDOM%5))
else
human_player
fi
opp_res=$(($RANDOM%5))
pl_draw=${draws[$pl_res]}
opp_draw=${draws[$opp_res]}
hand_count=$(($hand_count+1))
case "${results[$pl_res]:$opp_res:1}" in
0 ) result_string="Draw!"
color=33 ;;
1 ) opp_score=$(($opp_score+1))
color=32
result_string="Opponent wins!" ;;
2 ) pl_score=$(($pl_score+1))
color=31
result_string="Player wins!" ;;
esac
# Print hand result
printf "\n\033[31mPlayer \033[31;1m[%8s]\033[0m:\033[32;1m[%8s]\033[0m \033[32mOpponent \033[$color;1m-> %s\033[0m\n"  "$pl_draw" "$opp_draw" "$result_string"
# Print score
printf "\033[31mPlayer \033[31;1m[%8u]\033[0m:\033[32;1m[%8u]\033[0m \033[32mOpponent\033[0m after %u hand(s)\n\r" "$pl_score" "$opp_score" "$hand_count"
}
declare -a draws=(Rock Paper Scissors Lizard Spock)
declare -a results=(01221 20112 12021 12102  21210)
again="q"
until [ "${again^}" = "X" ]
do
draw_hands
if [[ "$game_type" = "A" ]]
then
echo -n "Continue? (x/X to finish, any key to continue): "
read -n 1 again
fi
done
final_score
exit

Video

English subtitles available / Disponibili i sottotitoli in italiano

Informazioni su Man from Mars

https://extendedreality.wordpress.com/

  1. obo

    Sei un fottuto GENIO *___*

    Mi piace

  2. Pingback: Script bash: il problema di Monty Hall | Extended Reality

  3. Pingback: jouer à un Pierre,Feuille,Ciseaux amélioré dans son terminal – memo-linux.com

Dimmi che ne pensi o fai "Ciao ciao!" con la manina // Share your thoughts or just say "Hello!"

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: