#!/bin/bash # Copyright 2020, Storm Dragon, # # This is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free # Software Foundation; either version 3, or (at your option) any later # version. # # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this package; see the file COPYING. If not, write to the Free # Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # # One line games # Each game is a function, the code is one line, not including the function name and comments. # Array with list of game functions. # Add new games to this array. gameList=( match_the_letter guess_1_to_10 numnastics spelling_game math_game pig helecopter pitch_shifter keyboard exit ) # Games start here match_the_letter() { #Match the letter 197 characters stty -echo;s=99;while [ : ];do t=$(shuf -n1 -e {a..z});banner $t;read -t0.$s -n1 -p " $t " p;if [ "$t" != "$p" ];then play -nqV0 synth pi fade q 0 1 0.5;break;else play -nqV0 synth .05 tri C8:C3 norm -7;fi;((s--));clear;done;stty echo } guess_1_to_10() { #guess 1 to 10 a=Boo;read -p"Guess 1-10 " n;[ $n -eq $(shuf -en1 {1..10}) ]&&a=Yay;echo $a\! } numnastics() { #order the numbers 1-9 type the number to reverse the string from that number to the right c=0;n=$(shuf -zi1-9);while [ $n -ne 123456789 ];do read -n1 -p$n i;l=${n%$i*};l=${#l};a=${n:0:$l};b=$(echo ${n:$l}|rev);n=$a$b;((c++));echo;done;echo $n $c tries } spelling_game() { #spelling game with changable list l=(champagne neighbor tortoise);clear;s="espeak -v en-us -a 200";for i in ${l[@]};do $s $i;read w;if [ "$w" = "$i" ];then $s "Got it!";else c=0;while [ $c -lt ${#i} ];do $s ${i:$c:1};((c++));done;fi;done &> /dev/null } math_game() { #Simple configurable math game, change o for different types, set n min and x max numbers used. n=0;x=10;o=+;m=0;r=0;s=5;t=0;a=-;while [ "${a^}" != "Q" ];do p="$(shuf -n1 -i$n-$x)$o$(shuf -n1 -i$n-$x)";read -t$s -p "$p " a;if [ $a -eq $(($p)) ] ; then echo "Yay!";((r++));s=$(echo "scale=2;$s-0.05" | bc);else echo "Wrong: $(($p))";((m++));fi 2> /dev/null;((t++));done;echo -e "\n$r right and $(($m-1)) missed of $(($t-1)) total." } pig() { #Pig dice game. any letter to roll, space or enter to bank. c=0;p=0;s=0;t=$(shuf -n1 -e c p);while [ $c -lt 100 -a $p -lt 100 ];do if [ $t = c ];then a=$(shuf -n1 -i0-6);case $a in 0)c=$(($c+$s));s=0;t=p;echo "CPU banked $c.";;1)echo "CPU Pigged\!";s=0;t=p;;*)s=$(($s+$a));echo "CPU $s : $c";esac;else read -n1 -p "? " a;if [ -z $a ];then t=c;p=$(($s+$p));echo "You banked $p.";s=0;else a=$(shuf -n1 -i1-6);if [ $a -eq 1 ];then s=0;t=c;echo "You Pigged\!";else s=$(($s+$a));echo "You $s : $p";fi;fi;fi;done;echo "CPU $c : You $p" } helecopter() { #Shoot down the helecopter you hear when sound is centered. Random speeds. h=0;n=1;s=20;while [ $n -eq 1 ];do x=9;y=0;while [ $x -gt 0 ];do espeak --stdout [[schXh | play -qV0 - norm remix v0.$x v0.$y&read -st0.$s -n1 p;[ -n "$p" ]&&if [ $x -eq 5 -a $y -eq 4 -o $x -eq 4 -a $y -eq 5 ];then x=9;y=0;play -nqV0 synth pi fade h 0 1 1 pad 0 1 reverb overdrive riaa speed 32 repeat 2;play -nqV0 synth pi fade h 0 1 1 norm -18 pad 0 1 reverb overdrive riaa;((h++));s=$(seq 10 20|shuf -n1);else n=0;fi;((x--));((y++));done;done;echo "$h kills." } pitch_shifter() { #Talking CLIcat (pitch shifter). e="norm pitch 1000";echo q exits.;f=`mktemp`;while ! read -n1 -t.5 ;do rec -qtwav $f silence 0 1 .5 25%&&play -q $f $e;done;\rm $f } keyboard() { # Small polyphonic music synthesizer. n=CDEFGAB;l=asdfghj;while read -n1 k;do x=$(tr $l $n<<<$k);play -qn synth pl ${x}3 fade 0 .7 & >/dev/null;done } # Add games above this line. # Menu system is here. trap menu SIGINT trap menu SIGTERM menu() { clear while : ; do menuLength=${#gameList[@]} menuLength=$((menuLength - 1)) echo for i in 0 $(seq $menuLength) ; do echo "$i: ${gameList[$i]}" done echo echo "Enter a number:" read choice eval "${gameList[$choice]}" echo read -n1 -p "Press any key to continue" choice echo done } menu