💾 Archived View for gemini.thegonz.net › static-sggs › games-src › rps › rps.sh captured on 2021-12-04 at 18:04:22.
-=-=-=-=-=-=-
#!/bin/bash # Rock-paper-scissors implementation for sggs # Copyright (C) 2021 Martin Bays <mbays@sdf.org> # # This program is free software: you can redistribute it and/or modify # it under the terms of version 3 of the GNU General Public License as # published by the Free Software Foundation, or any later version. # # You should have received a copy of the GNU General Public License # along with this program. If not, see http://www.gnu.org/licenses/. FIRST_TO=5 command="$1" shift case "$command" in describe) echo "Rock-paper-scissors";; help) echo "The classic game of psychology and luck.";; players) echo 2;; setarg) ;; init) echo 0 > score1; echo 0 > score2;; showstate) if [ "$1" = 0 ]; then # Observer echo "Scores: $(<score1) - $(<score2) (first to $FIRST_TO wins)" [ -e "last1" ] && echo "P1 played: $(<last1)" [ -e "last2" ] && echo "P2 played: $(<last2)" exit 0 fi [[ "$1" = 1 || "$1" = 2 ]] || exit 1 echo "Scores: YOU $(<score$1) - $(<score$((3-$1))) THEM (first to $FIRST_TO wins)" [ -e "last$1" ] && echo "You played: $(<last$1)" [ -e "last$((3-$1))" ] && echo "They played: $(<last$((3-$1)))" [ -e "next$1" ] && echo && echo "Your next move: $(<next$1)" ;; canmove) [ -e won ] && exit 5 [[ "$1" = 1 || "$1" = 2 ]] || exit 4 [ -e "next$1" ] && exit 4 echo "=> move?R Play rock" echo "=> move?P Play paper" echo "=> move?S Play scissors";; move) [ -e won ] && echo "Game over!" && exit 4 [[ "$1" = 1 || "$1" = 2 ]] || exit 4 [ -e "next$1" ] && echo "Move already selected." && exit 4 [[ "$2" != [RPS] ]] && echo "R/P/S" && exit 1 if [ -e "next$((3-$1))" ]; then if [ $1 = 1 ]; then c1=$2 c2=$(<"next2") else c1=$(<"next1") c2=$2 fi if [ "$c1" != "$c2" ]; then if [[ "$c1$c2" =~ (RS|SP|PR) ]]; then w=1 else w=2 fi newscore="$(($(<score$w)+1))" [ "$newscore" = "$FIRST_TO" ] && echo $w > won echo "$newscore" > score$w fi mv "next$((3-$1))" "last$((3-$1))" echo "$2" > "last$1" else echo "$2" > "next$1" fi;; resign) [[ "$1" = 1 || "$1" = 2 ]] && echo "$((3-$1))" > won;; winner) [ -e won ] || exit 1 cat won;; esac exit 0