#!/bin/bash # Sun Mar 23 18:03:06 EST 2003 # Copyright 2003, Chris F.A. Johnson # Released under the terms of the GNU General Public License # URLs of other Maxit games # http://216.119.79.54/Moosesoftware/maxit.html # http://www.gregmacg.com/Maxit.html # http://www.ceshopper.com/maxit.html # http://www.pocketpccity.com/software/ppc/MaxIt-1998-10-31-ce-ppc.html # http://www.geocities.com/mea_nitro/maxit_online.html trap 'set +x; printat 0 $(( firstrow + rows * 2 + 6 )); stty echo; exit' EXIT 0 1 2 3 4 5 6 7 main() { vplayer=max1 hplayer=human ##nextcell ##random hname=$hplayer #HORIZONTAL vname=$vplayer #VERTICAL player=${player:-$horizontal} while : do if [ $player -eq $horizontal ] then rowtotal $col $row || break hplay $row || break player=$vertical else coltotal $col $row || break vplay $col || break player=$horizontal fi playerdata done } hplay() { hirow $row local n=0 if [ "$hplayer" != "human" ] then sleep 1 & fi printat 0 0 eval $hplayer wait nextval putcell $col $row hscore=$(( ${hscore:-0} + ${score:-0} )) hirow -$row hicol $col } vplay() { hicol $col if [ "$vplayer" != "human" ] then sleep 1 & fi printat 0 0 eval $vplayer wait putcell $col $row vscore=$(( ${vscore:-0} + ${score:-0} )) hicol -$col hirow $row } random() { case $player in $horizontal) col=$(( $RANDOM % $rows )) ;; $vertical) row=$(( $RANDOM % $rows )) ;; esac } max1() { case $player in $horizontal) col=$(( $maxcol % $rows )) ;; $vertical) row=$(( $maxrow % $rows )) ;; esac } human() { while : do nextval hicell $col $row IFS= read -rsn1 kp case $kp in $ESC) read -n1; read -n1 kp ;; esac case $kp in "") break ;; q|Q|x|X) exit ;; $Cl) clear; board; playerdata ;; b|a|w|W|p|P|A|D) hicell -$col $row prevcell prevval hicell $col $row ;; *) hicell -$col $row nextcell nextval hicell $col $row ;; esac done } nextval() { local n=0 while ! getval do nextcell (( ++n)) [ $n -gt $rows ] && break done } prevval() { while ! getval do prevcell done } nextcell() { if [ $player -eq $horizontal ] then col=$(( (col + 1) % rows )) else row=$(( (row + 1) % rows )) fi } prevcell() { if [ $player -eq $horizontal ] then col=$(( (col + rows - 1) % rows )) else row=$(( (row + rows - 1) % rows )) fi } end() { fixboard board playerdata playerdata >> $logfile echo exit } loginit() { uniqFile $USER-$$-maxitlog logfile=$UNIQFILE } version() { echo $version } usage() { echo " $progname - USAGE: $progname [OPTIONS] OPTIONS: -h - help: print this message -H - help: print more detailed message -v - verbose: -V - print version information Copyright 2003, Chris F.A. Johnson " } printat() { #== print arguments 3-... at Y=$2 X=$1 [ $# -lt 2 ] && return 1 local y=$2 local x=$1 shift 2 msg="$*" printf "\e[%d;%dH%b" $y $x "$msg" } uniqFile() { #== create unused filename by adding incremental suffix if nec. if [ "$1" = "-p" ] then local pad=-001 shift else local pad= fi local base=$1 local n=1 local uf=${base}$pad while [ -f "$uf" ] do uf=$base-`printf "%03d" $n` n=$(( $n + 1 )) done UNIQFILE=$uf touch $uf } board() { local row=0 local width=$((rows * 4)) printat 0 $toprow while [ $row -lt $rows ] do echo "$margin${spacer:0:$width}" echo "$margin${board[row]}|" (( ++row )) done echo "$margin${spacer:0:$width}+" } fillboard() { local row=0 col=0 score n=0 local negs=ABCDEFGHIJKLMNO local num=${negs}0123456789abcdef sign="0-" local max=31 min=15 totalpoints=0 format="|${B}%3d${U}" while [ $row -lt $rows ] do col=0 board[row]="" while [ $col -lt $rows ] do index=$(( $RANDOM % $max )) values[n]=$(($index - $min )) [ ${values[n]} -lt 0 ] && values[n]=$(( ${values[n]} + ($RANDOM % ${values[n]#-}) )) totalpoints=$(( $totalpoints + ${values[n]} )) board[row]="${board[$row]}`printf "$format" ${values[n]}`" ## [ ${values[n]} -eq -$min -a $min -gt 0 ] && { (( --min )) (( --max )); } (( ++col )) (( ++n )) done board[row]="${board[$row]}" (( ++row )) done } fixboard() { local row=0 col=0 score n=0 local negs=ABCDEFGHIJKLMNO local num=${negs}0123456789abcdef sign="0-" local max=31 min=15 totalpoints=0 while [ $row -lt $rows ] do col=0 board[row]="" while [ $col -lt $rows ] do board[row]="${board[$row]}|`printf "%3s" ${values[n]}`" (( ++col )) (( ++n )) done (( ++row )) done } hirow() { local row=$(( ${1#-} )) local width=$((rows * 4 + 1)) local line=$(( $toprow + $row * 2 + 1 )) local spacerow="========================================================================" local neg=${1:0:1} if [ "$neg" = "-" ] then spacerow=$spacer fi printat 0 $(( line - 1 )) echo "$margin${cle}${B}${spacerow:0:$width}${U}" printat 0 $(( line + 1 )) echo "$margin${B}${spacerow:0:$width}${U}" } hicol() { local col=$(( ${1#-} )) local left=$(( col * 4 + ${#margin} + 1 )) local row=0 line sp vbar local neg=${1:0:1} if [ "$neg" = "-" ] then sp=" " vbar="|" else sp="${B}|${U}" vbar="${B}|${U}" fi while [ $row -lt $rows ] do line=$(( $toprow + $row * 2 )) printat $left $(( line )) "$sp" printat $(( left + 4 )) $(( line++ )) "$sp" printat $left $(( line )) "$vbar" printat $(( left + 4 )) $(( line++ )) "$vbar" printat $left $(( line )) "$sp" printat $(( left + 4 )) $line "$sp" (( ++row )) done } putcell() { local row=$(( ${2#-} )) local col=$(( ${1#-} )) local left=$(( ${#margin} + col * 4 + 2 )) local num=$(( $row * $rows + $col )) local line=$(( $toprow + $row * 2 + 1 )) [ "${values[num]}" ] || return 1 totalpoints=$(( $totalpoints - ${values[num]} )) printat 0 0 printat $left $line "`printf "${BR}%3d${U}" ${values[num]}`" score=${values[num]} values[num]= sleep 1 printat $left $line " " playerdata } hicell() { local row=$(( ${2#-} )) local col=$(( ${1#-} )) local left=$(( ${#margin} + col * 4 + 2 )) local num=$(( $row * $rows + $col )) local line=$(( $toprow + $row * 2 + 1 )) local sleep=$3 local neg=${1:0:1} [ "${values[num]}" ] || { return 1; } if [ "$neg" = "-" ] then printat $left $line "`printf "${B}%3d${U}" ${values[num]}`" else printat $left $line "`printf "${BR}%3d${U}" ${values[num]}`" fi sleep ${sleep:-0} return 0 } playerdata() { local h v printat ${#margin} 1 if [ $hscore -gt $vscore ] then h=${B} v= else h= v=${B} fi printf " ${h}H:%15s: %3d${U} " "$hname" $hscore if [ ${player:-0} -eq ${horizontal:-0} ] then printf "(last=%4d)${cle}" $score fi printat ${#margin} 2 printf " ${v}V:%15s: %3d${U} " "$vname" $vscore if [ ${player:-0} -eq ${vertical:-1} ] then printf "(last=%4d)${cle}" $score fi printat ${#margin} 3 printf "Points left: %3d${cle}" $totalpoints printat 0 10 "Now leading:" [ "${v:+x}" ] && leader="V: $vplayer" || leader="H: $hplayer" printat 2 11 printf "%-10.10s" "$leader" printat 0 13 "x/q - EXIT" } getval() { local vn=$(( $col + $row * $rows )) score=${values[vn]} test "${score:+X}" } prompt() { : } coltotal() { local col=$1 local row=$2 local n=0 local vcells=0 local vx= colmin=22 colmax=-22 n=-1 v= while [ $n -lt $rows ] do (( ++n )) vn=$(( $n * $rows + $col )) val=${values[vn]} v="${v}:`printf "%3s" ${val}`" vx=$vx$val [ "${val:+x}" ] || continue (( ++vcells )) [ $val -gt $colmax ] && { colmax=$val; maxrow=$n; } [ $val -lt $colmin ] && { colmin=$val; minrow=$n; } done v=" maxrow=$maxrow minrow=$minrow colmax=$colmax colmin=$colmin " test "${vx:+X}" } rowtotal() { local col=$1 local row=$2 local n=0 vn local r=$(( ${row:-0} * $rows )) v= local vx= rowmax=-22 rowmin=22 n=-1 hcells=0 while [ $n -lt $rows ] do (( ++n )) vn=$(( $r + $n )) val=${values[vn]} v="${v}:`printf "%3s" ${val}`" vx=$vx$val [ "${val:+x}" ] || continue (( ++hcells )) [ $val -gt $rowmax ] && { rowmax=$val; maxcol=$n; } [ $val -lt $rowmin ] && { rowmin=$val; mincol=$n; } done v=" maxcol=$maxcol mincol=$mincol rowmax=$rowmax rowmin=$rowmin " test "${vx:+X}" } terminit() { if tput ce >/dev/null 2>&1 then ## e.g. FreeBSD co=co li=li cle=`tput ce 2>/dev/null` clb=`tput cb 2>/dev/null` BOLD=`tput md 2>/dev/null` UNBOLD=`tput me 2>/dev/null` REVERSE=`tput mr 2>/dev/null` BR=`tput mb mr 2>/dev/null` CINV=`tput vi 2>/dev/null` CVIS=`tput ve 2>/dev/null` ULINE=`tput us 2>/dev/null` elif tput el 2>/dev/null then ## e.g. Linux co=cols li=lines cle=`tput el 2>/dev/null` clb=`tput el1 2>/dev/null` BOLD=`tput bold 2>/dev/null` UNBOLD=`tput sgr0 2>/dev/null` REVERSE=`tput rev 2>/dev/null` BR=`tput bold rev 2>/dev/null` CINV=`tput civis 2>/dev/null` CVIS=`tput cvvis 2>/dev/null` ULINE=`tput smul 2>/dev/null` else ## e.g. SunOS (assumes ANSI-type terminal) co= li= UNBOLD=$'\E[0m' standout=$'\E[0;1;7m' cle=$'\E[K' clb=$'\E[1K' ULINE=$'\E[0;4m' REVERSE=$'\E[0;7m' BLINK=$'\E[0;5m' BOLD=$'\E[0;1m' CINV=$'\E[0;8m' fi R=$REVERSE U=$UNBOLD B=$BOLD BR=$B$R Cl=$'\f' if [ "$co" ] then COLUMNS=${COLUMNS:=`tput $co`} else COLUMNS=${COLUMNS:-80} fi } verbose=0 longusage=0 version="1.0" copyright=2003 author="Chris F.A. Johnson" progname=${0##*/} rows=8 horizontal=0 vertical=1 while getopts vVhHr:ad var do case "$var" in a) player=$horizontal ;; d) player=$vertical ;; r) rows=$OPTARG ;; h) usage; exit ;; H) longusage=1; usage; exit ;; v) verbose=1 ;; V) version; exit ;; *);; esac done shift $(( $OPTIND - 1 )) spaces=" " spacer=" --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- " NL=$'\n' ESC=$'\e' TAB=$'\t' CR=$'\r' FF=$'\f' margin=${spaces:0:$(( (${COLUMNS:-80} - rows * 4) / 2 - 1 ))} toprow=5 clear stty -echo terminit playerdata fillboard board SLEEPYTIME=3 hscore=0 vscore=0 col=$(( $RANDOM % $rows )) row=$(( $RANDOM % $rows )) playerdata hname=HORIZONTAL vname=VERTICAL stty -echo printat 2 4 "Starting with: $totalpoints" loginit main end