commit
d2c7f72750
|
@ -0,0 +1,432 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Title: Tic-tac-toe / noughts and crosses
|
||||||
|
# Description: Play noughts and crosses with the croc
|
||||||
|
# Author: Cribbit
|
||||||
|
# Version: 1.0
|
||||||
|
# Category: General
|
||||||
|
# Prop: Artificial Intelligence by Bert van Dam
|
||||||
|
|
||||||
|
# Matches
|
||||||
|
|
||||||
|
MATCH (?i)tic[- ]tac[- ]toe
|
||||||
|
MATCH (?i)noughts (and|\&) crosses
|
||||||
|
|
||||||
|
####################### Config #######################
|
||||||
|
# Language file
|
||||||
|
lfile=/usr/local/croc/lib/languages/gb.json
|
||||||
|
##################### End Config #####################
|
||||||
|
|
||||||
|
# if null or not found default to bad english ;-)
|
||||||
|
if [ -z "$lfile" ] || [ ! -f "$lfile" ] ; then
|
||||||
|
lfile=/usr/local/croc/lib/languages/us.json
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 0 1 2 3 4 5 6 7 8
|
||||||
|
game=(0 0 0 0 0 0 0 0 0)
|
||||||
|
currX=10
|
||||||
|
currY=2
|
||||||
|
crocsMove=100
|
||||||
|
crocwin=0
|
||||||
|
# raw log path
|
||||||
|
rawlog=/root/loot/croc_raw.log
|
||||||
|
|
||||||
|
usersMove() {
|
||||||
|
# get the current line count
|
||||||
|
cnt=$(wc -l "$rawlog" | awk {'print $1'})
|
||||||
|
KEYPRESSED=""
|
||||||
|
# loop the loop
|
||||||
|
while : ; do
|
||||||
|
# get the current line count
|
||||||
|
cnt2=$(wc -l "$rawlog" | awk {'print $1'})
|
||||||
|
# compaire the first with the secound
|
||||||
|
if [ "$cnt" -ne "$cnt2" ]; then
|
||||||
|
# get the differnce
|
||||||
|
dif=$((cnt2-cnt))
|
||||||
|
# read each line
|
||||||
|
while read -r line
|
||||||
|
do
|
||||||
|
# cut line down to 8 char
|
||||||
|
key=${line:0:8}
|
||||||
|
# see if the the last 2 are not zeros
|
||||||
|
if [[ ${key:6:2} != "00" ]] ; then
|
||||||
|
# extract the key name
|
||||||
|
# WARNING if there is an escape char this will be pass out i.e "\"": "02,00,34", = \"
|
||||||
|
KEYPRESSED=$(grep $key $lfile | sed 's/^[^"]*"\([^:]*\)".*/\1/')
|
||||||
|
QUACK LOCK
|
||||||
|
case $KEYPRESSED in
|
||||||
|
'UPARROW' ) ((currY--)) ;;
|
||||||
|
'DOWNARROW' ) ((currY++)) ;;
|
||||||
|
'LEFTARROW' )
|
||||||
|
if [ $currX -eq 1 ]; then
|
||||||
|
((currY--))
|
||||||
|
currX=10
|
||||||
|
else
|
||||||
|
((currX--))
|
||||||
|
fi ;;
|
||||||
|
'RIGHTARROW' )
|
||||||
|
if [ $currX -eq 10 ]; then
|
||||||
|
((currY++))
|
||||||
|
currX=1
|
||||||
|
else
|
||||||
|
((currX++))
|
||||||
|
fi ;;
|
||||||
|
'x' )
|
||||||
|
# fix if they use delete
|
||||||
|
# echo "X $currX Y $currY"
|
||||||
|
if [[ '2 5 8' == *$currX* ]]; then
|
||||||
|
((currX++))
|
||||||
|
fi
|
||||||
|
# change cursor to array pos
|
||||||
|
pos=$((((currX/3)+(currY*3))-1))
|
||||||
|
# echo "pos $pos"
|
||||||
|
if [[ $pos -gt -1 ]] && [[ $pos -lt 9 ]]; then
|
||||||
|
if [[ ${game[$pos]} -ne 10 ]]; then
|
||||||
|
game[$pos]=1
|
||||||
|
QUACK UNLOCK
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
# echo "Zero"
|
||||||
|
QUACK BACKSPACE
|
||||||
|
QUACK O
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
QUACK UNLOCK
|
||||||
|
fi
|
||||||
|
done <<< "$(tail --lines $dif $rawlog)"
|
||||||
|
# reset count
|
||||||
|
cnt=$cnt2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
writeMove () {
|
||||||
|
# Convert array to screen
|
||||||
|
crocX=3
|
||||||
|
crocY=0
|
||||||
|
if [[ $1 -eq 3 ]] || [[ $1 -eq 4 ]] || [[ $1 -eq 5 ]]; then
|
||||||
|
crocY=1
|
||||||
|
elif [[ $1 -eq 6 ]] || [[ $1 -eq 7 ]] || [[ $1 -eq 8 ]]; then
|
||||||
|
crocY=2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $1 -eq 1 ]] || [[ $1 -eq 4 ]] || [[ $1 -eq 7 ]]; then
|
||||||
|
crocX=6
|
||||||
|
elif [[ $1 -eq 2 ]] || [[ $1 -eq 5 ]] || [[ $1 -eq 8 ]]; then
|
||||||
|
crocX=9
|
||||||
|
fi
|
||||||
|
# move x
|
||||||
|
while [ $currX -ne $crocX ]
|
||||||
|
do
|
||||||
|
if [[ $currX -lt $crocX ]]; then
|
||||||
|
QUACK RIGHTARROW
|
||||||
|
((currX++))
|
||||||
|
else
|
||||||
|
QUACK LEFTARROW
|
||||||
|
((currX--))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# move y
|
||||||
|
while [ $currY -ne $crocY ]
|
||||||
|
do
|
||||||
|
if [[ $currY -lt $crocY ]]; then
|
||||||
|
QUACK DOWNARROW
|
||||||
|
((currY++))
|
||||||
|
else
|
||||||
|
QUACK UPARROW
|
||||||
|
((currY--))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# at location
|
||||||
|
QUACK BACKSPACE
|
||||||
|
QUACK O
|
||||||
|
}
|
||||||
|
|
||||||
|
spaceInRow () {
|
||||||
|
if [[ $1 -eq 1 ]]; then
|
||||||
|
if [[ ${game[0]} -eq 0 ]]; then
|
||||||
|
crocsMove=0
|
||||||
|
elif [[ ${game[1]} -eq 0 ]]; then
|
||||||
|
crocsMove=1
|
||||||
|
elif [[ ${game[2]} -eq 0 ]]; then
|
||||||
|
crocsMove=2
|
||||||
|
fi
|
||||||
|
elif [[ $1 -eq 2 ]]; then
|
||||||
|
if [[ ${game[3]} -eq 0 ]]; then
|
||||||
|
crocsMove=3
|
||||||
|
elif [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ ${game[5]} -eq 0 ]]; then
|
||||||
|
crocsMove=5
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ ${game[6]} -eq 0 ]]; then
|
||||||
|
crocsMove=6
|
||||||
|
elif [[ ${game[7]} -eq 0 ]]; then
|
||||||
|
crocsMove=7
|
||||||
|
elif [[ ${game[8]} -eq 0 ]]; then
|
||||||
|
crocsMove=8
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
spaceInCol () {
|
||||||
|
if [[ $1 -eq 1 ]]; then
|
||||||
|
if [[ ${game[0]} -eq 0 ]]; then
|
||||||
|
crocsMove=0
|
||||||
|
elif [[ ${game[3]} -eq 0 ]]; then
|
||||||
|
crocsMove=3
|
||||||
|
elif [[ ${game[6]} -eq 0 ]]; then
|
||||||
|
crocsMove=6
|
||||||
|
fi
|
||||||
|
elif [[ $1 -eq 2 ]]; then
|
||||||
|
if [[ ${game[1]} -eq 0 ]]; then
|
||||||
|
crocsMove=1
|
||||||
|
elif [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ ${game[7]} -eq 0 ]]; then
|
||||||
|
crocsMove=7
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ ${game[2]} -eq 0 ]]; then
|
||||||
|
crocsMove=2
|
||||||
|
elif [[ ${game[5]} -eq 0 ]]; then
|
||||||
|
crocsMove=5
|
||||||
|
elif [[ ${game[8]} -eq 0 ]]; then
|
||||||
|
crocsMove=8
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
spaceInDia () {
|
||||||
|
if [[ $1 -eq 1 ]]; then
|
||||||
|
if [[ ${game[0]} -eq 0 ]]; then
|
||||||
|
crocsMove=0
|
||||||
|
elif [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ ${game[8]} -eq 0 ]]; then
|
||||||
|
crocsMove=8
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ ${game[2]} -eq 0 ]]; then
|
||||||
|
crocsMove=2
|
||||||
|
elif [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ ${game[6]} -eq 0 ]]; then
|
||||||
|
crocsMove=6
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
sumTotals ()
|
||||||
|
{
|
||||||
|
sumRow1=$((${game[0]} + ${game[1]} + ${game[2]}))
|
||||||
|
sumRow2=$((${game[3]} + ${game[4]} + ${game[5]}))
|
||||||
|
sumRow3=$((${game[6]} + ${game[7]} + ${game[8]}))
|
||||||
|
sumCol1=$((${game[0]} + ${game[3]} + ${game[6]}))
|
||||||
|
sumCol2=$((${game[1]} + ${game[4]} + ${game[7]}))
|
||||||
|
sumCol3=$((${game[2]} + ${game[5]} + ${game[8]}))
|
||||||
|
sumDia1=$((${game[0]} + ${game[4]} + ${game[8]}))
|
||||||
|
sumDia2=$((${game[2]} + ${game[4]} + ${game[6]}))
|
||||||
|
total=$(($sumRow1 + $sumRow2 + $sumRow3))
|
||||||
|
}
|
||||||
|
|
||||||
|
playGame () {
|
||||||
|
while true; do
|
||||||
|
usersMove
|
||||||
|
sumTotals
|
||||||
|
crocsMove=100
|
||||||
|
|
||||||
|
# Have they won
|
||||||
|
if [ $sumRow1 -eq 3 ] || [ $sumRow2 -eq 3 ] || [ $sumRow3 -eq 3 ] || [ $sumCol1 -eq 3 ] || [ $sumCol2 -eq 3 ] || [ $sumCol3 -eq 3 ] || [ $sumDia1 -eq 3 ] || [ $sumDia2 -eq 3 ]; then
|
||||||
|
endgame 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Game On
|
||||||
|
|
||||||
|
# 1 - Can I win
|
||||||
|
if [[ $sumRow1 -eq 20 ]]; then
|
||||||
|
spaceInRow 1
|
||||||
|
elif [[ $sumRow2 -eq 20 ]]; then
|
||||||
|
spaceInRow 2
|
||||||
|
elif [[ $sumRow3 -eq 20 ]]; then
|
||||||
|
spaceInRow 3
|
||||||
|
elif [[ $sumCol1 -eq 20 ]]; then
|
||||||
|
spaceInCol 1
|
||||||
|
elif [[ $sumCol2 -eq 20 ]]; then
|
||||||
|
spaceInCol 2
|
||||||
|
elif [[ $sumCol3 -eq 20 ]]; then
|
||||||
|
spaceInCol 3
|
||||||
|
elif [[ $sumDia1 -eq 20 ]]; then
|
||||||
|
spaceInDia 1
|
||||||
|
elif [[ $sumDia2 -eq 20 ]]; then
|
||||||
|
spaceInDia 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $crocsMove -ne 100 ]; then
|
||||||
|
crocwin=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2 - Can they win
|
||||||
|
if [ $crocsMove -eq 100 ]; then
|
||||||
|
if [[ $sumRow1 -eq 2 ]]; then
|
||||||
|
spaceInRow 1
|
||||||
|
elif [[ $sumRow2 -eq 2 ]]; then
|
||||||
|
spaceInRow 2
|
||||||
|
elif [[ $sumRow3 -eq 2 ]]; then
|
||||||
|
spaceInRow 3
|
||||||
|
elif [[ $sumCol1 -eq 2 ]]; then
|
||||||
|
spaceInCol 1
|
||||||
|
elif [[ $sumCol2 -eq 2 ]]; then
|
||||||
|
spaceInCol 2
|
||||||
|
elif [[ $sumCol3 -eq 2 ]]; then
|
||||||
|
spaceInCol 3
|
||||||
|
elif [[ $sumDia1 -eq 2 ]]; then
|
||||||
|
spaceInDia 1
|
||||||
|
elif [[ $sumDia2 -eq 2 ]]; then
|
||||||
|
spaceInDia 2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3 - Double change
|
||||||
|
if [ $crocsMove -eq 100 ]; then
|
||||||
|
if [[ $(($sumRow1 + $sumCol1)) -eq 20 ]] && [[ ${game[0]} -eq 0 ]]; then
|
||||||
|
crocsMove=0
|
||||||
|
elif [[ $(($sumRow1 + $sumCol2)) -eq 20 ]] && [[ ${game[1]} -eq 0 ]]; then
|
||||||
|
crocsMove=1
|
||||||
|
elif [[ $(($sumRow1 + $sumCol3)) -eq 20 ]] && [[ ${game[2]} -eq 0 ]]; then
|
||||||
|
crocsMove=2
|
||||||
|
elif [[ $(($sumRow2 + $sumCol1)) -eq 20 ]] && [[ ${game[3]} -eq 0 ]]; then
|
||||||
|
crocsMove=3
|
||||||
|
elif [[ $(($sumRow2 + $sumCol2)) -eq 20 ]] && [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ $(($sumRow2 + $sumCol3)) -eq 20 ]] && [[ ${game[5]} -eq 0 ]]; then
|
||||||
|
crocsMove=5
|
||||||
|
elif [[ $(($sumRow3 + $sumCol1)) -eq 20 ]] && [[ ${game[6]} -eq 0 ]]; then
|
||||||
|
crocsMove=6
|
||||||
|
elif [[ $(($sumRow3 + $sumCol2)) -eq 20 ]] && [[ ${game[7]} -eq 0 ]]; then
|
||||||
|
crocsMove=7
|
||||||
|
elif [[ $(($sumRow3 + $sumCol3)) -eq 20 ]] && [[ ${game[8]} -eq 0 ]]; then
|
||||||
|
crocsMove=8
|
||||||
|
elif [[ $(($sumCol1 + $sumDia1)) -eq 20 ]] && [[ ${game[0]} -eq 0 ]]; then
|
||||||
|
crocsMove=0
|
||||||
|
elif [[ $(($sumCol2 + $sumDia1)) -eq 20 ]] && [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ $(($sumCol3 + $sumDia1)) -eq 20 ]] && [[ ${game[8]} -eq 0 ]]; then
|
||||||
|
crocsMove=8
|
||||||
|
elif [[ $(($sumCol1 + $sumDia2)) -eq 20 ]] && [[ ${game[6]} -eq 0 ]]; then
|
||||||
|
crocsMove=6
|
||||||
|
elif [[ $(($sumCol2 + $sumDia2)) -eq 20 ]] && [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ $(($sumCol3 + $sumDia2)) -eq 20 ]] && [[ ${game[2]} -eq 0 ]]; then
|
||||||
|
crocsMove=2
|
||||||
|
elif [[ $(($sumRow1 + $sumDia1)) -eq 20 ]] && [[ ${game[0]} -eq 0 ]]; then
|
||||||
|
crocsMove=0
|
||||||
|
elif [[ $(($sumRow2 + $sumDia1)) -eq 20 ]] && [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ $(($sumRow3 + $sumDia1)) -eq 20 ]] && [[ ${game[8]} -eq 0 ]]; then
|
||||||
|
crocsMove=8
|
||||||
|
elif [[ $(($sumRow1 + $sumDia2)) -eq 20 ]] && [[ ${game[2]} -eq 0 ]]; then
|
||||||
|
crocsMove=2
|
||||||
|
elif [[ $(($sumRow2 + $sumDia2)) -eq 20 ]] && [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
elif [[ $(($sumRow3 + $sumDia2)) -eq 20 ]] && [[ ${game[6]} -eq 0 ]]; then
|
||||||
|
crocsMove=6
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4 - I'm in the center. user has two diagonals either side
|
||||||
|
if [ $crocsMove -eq 100 ]; then
|
||||||
|
if [ $total -eq 12 ] && [[ ${game[4]} -eq 10 ]] ; then
|
||||||
|
if [[ $sumDia1 -eq 12 ]] || [[ $sumDia2 -eq 12 ]]; then
|
||||||
|
crocsMove=3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5 - Take the middle
|
||||||
|
if [ $crocsMove -eq 100 ] && [[ ${game[4]} -eq 0 ]]; then
|
||||||
|
crocsMove=4
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 6 - Take a corner
|
||||||
|
if [ $crocsMove -eq 100 ]; then
|
||||||
|
if [[ ${game[0]} -eq 0 ]]; then
|
||||||
|
crocsMove=0
|
||||||
|
elif [[ ${game[2]} -eq 0 ]]; then
|
||||||
|
crocsMove=2
|
||||||
|
elif [[ ${game[6]} -eq 0 ]]; then
|
||||||
|
crocsMove=6
|
||||||
|
elif [[ ${game[8]} -eq 0 ]]; then
|
||||||
|
crocsMove=8
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7 - Pick a empty space
|
||||||
|
if [ $crocsMove -eq 100 ]; then
|
||||||
|
for i in {0..8}
|
||||||
|
do
|
||||||
|
if [[ ${game[$i]} -eq 0 ]]; then
|
||||||
|
crocsMove=$i
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
#WriteMove
|
||||||
|
if [ $crocsMove -ne 100 ]; then
|
||||||
|
game[$crocsMove]=10
|
||||||
|
writeMove $crocsMove
|
||||||
|
else
|
||||||
|
endgame 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $crocwin -ne 0 ]; then
|
||||||
|
endgame 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
endgame ()
|
||||||
|
{
|
||||||
|
QUACK CONTROL-END
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK ENTER
|
||||||
|
if [[ $1 -eq 1 ]]; then
|
||||||
|
QUACK STRING "Congratulations you won the game!"
|
||||||
|
elif [[ $1 -eq 2 ]]; then
|
||||||
|
QUACK STRING "Unlucky, I won the game!"
|
||||||
|
else
|
||||||
|
QUACK STRING "It's a draw"
|
||||||
|
fi
|
||||||
|
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING 'Thank you for playing'
|
||||||
|
QUACK ENTER
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
start ()
|
||||||
|
{
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "Welcome"
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "You move first"
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "Move the text cursor / caret using the arrow keys one press at a time"
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "Do not hold down the keys. Or we will lose where we are."
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "Use backspace on an underscores then press x"
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "[_][_][_]"
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "[_][_][_]"
|
||||||
|
QUACK ENTER
|
||||||
|
QUACK STRING "[_][_][_]"
|
||||||
|
playGame
|
||||||
|
}
|
||||||
|
|
||||||
|
start
|
|
@ -0,0 +1,37 @@
|
||||||
|
# Tic-tac-toe / Noughts and crosses
|
||||||
|
- Author: Cribbit
|
||||||
|
- Version: 1.0
|
||||||
|
- Target: Mutli OS (GUI based text editior)
|
||||||
|
- Category: General
|
||||||
|
- Attackmode: HID
|
||||||
|
|
||||||
|
## Change Log
|
||||||
|
| Version | Changes |
|
||||||
|
| ------- | --------------- |
|
||||||
|
| 1.0 | Initial release |
|
||||||
|
|
||||||
|
## Description
|
||||||
|
Play tic-tac-toe / noughts and crosses with the KeyCroc.
|
||||||
|
|
||||||
|
Open a text editor, start the game and enjoy.
|
||||||
|
|
||||||
|
## Config
|
||||||
|
Set the language file path on line 15'ish
|
||||||
|
|
||||||
|
`lfile=/usr/local/croc/lib/languages/gb.json`
|
||||||
|
|
||||||
|
## Match
|
||||||
|
"`tic-tac-toe`" or "`tic tac toe`"
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
"`noughts and crosses`" or "`noughts & crosses`"
|
||||||
|
|
||||||
|
## How to play
|
||||||
|
You move first.
|
||||||
|
|
||||||
|
Move the text cursor / caret using the arrow keys one press at a time.
|
||||||
|
|
||||||
|
Do not hold down the keys. Or we will lose where we are.
|
||||||
|
|
||||||
|
Use backspace on an underscores then press x.
|
Loading…
Reference in New Issue