Skip to content

Instantly share code, notes, and snippets.

@maugern
Last active November 9, 2018 11:56
Show Gist options
  • Save maugern/3576368111709f639655fc36f189697a to your computer and use it in GitHub Desktop.
Save maugern/3576368111709f639655fc36f189697a to your computer and use it in GitHub Desktop.
Tic-Tac-Toe in bash
#!/bin/bash
# Nicolas Mauger, ESD17
# SHALL WE PLAY A GAME ?
PLUS_INFINITY=65536
MINUS_INFINITY=-65536
tab=( 0 0 0 0 0 0 0 0 0 )
display() {
local x=()
for((i=0; i < 9; i++)){
case ${tab[i]} in
1)
x+=( "X" )
;;
2)
x+=( "O" )
;;
*)
x+=( " " )
esac
}
echo "
${x[0]} | ${x[1]} | ${x[2]}
---------
${x[3]} | ${x[4]} | ${x[5]}
---------
${x[6]} | ${x[7]} | ${x[8]}
"
}
minmax(){
count_free_space=0
for i in "${tab[@]}"; do
if [ $i -eq 0 ]; then
(( count_free_space++ ))
fi
done
# Choosing a random start position
if [ $count_free_space -eq 9 ]; then
best_move=$(( RANDOM % 8 ))
else
max
fi
}
min () {
tempCheck=$(is_game_finish)
if [[ $tempCheck -ne 0 ]]; then
if [[ $tempCheck -eq 2 ]]; then
scoreMinMax=$PLUS_INFINITY
elif [[ $tempCheck -eq 1 ]]; then
scoreMinMax=$MINUS_INFINITY
else
scoreMinMax=0
fi
else
local empty_space=()
indexCase=0
for i in "${tab[@]}"; do
if [ $i -eq 0 ]; then
empty_space+=($indexCase)
fi
(( indexCase++ ))
done
local bestTemp=-1
local scoreTemp=$PLUS_INFINITY
for i in "${empty_space[@]}"; do
tab[$i]=1
local stockItemp=$i
max
i=$stockItemp
tab[$i]=0
if [[ $scoreTemp -gt $scoreMinMax ]]; then
local scoreTemp=$scoreMinMax
local bestTemp=$i
if [[ $scoreTemp -eq $MINUS_INFINITY ]]; then
break
fi
fi
done
scoreMinMax=$scoreTemp
best_move=$bestTemp
fi
}
max (){
tempCheck=$(is_game_finish)
if [[ $tempCheck -ne 0 ]]; then
if [[ $tempCheck -eq 2 ]]; then
scoreMinMax=$PLUS_INFINITY
elif [[ $tempCheck -eq 1 ]]; then
scoreMinMax=$MINUS_INFINITY
else
scoreMinMax=0
fi
else
local empty_space=()
indexCase=0
for i in "${tab[@]}"; do
if [ $i -eq 0 ]; then
empty_space+=($indexCase)
fi
(( indexCase++ ))
done
local bestTemp=-1
local scoreTemp=$MINUS_INFINITY
for i in "${empty_space[@]}"; do
tab[$i]=2
local stockItemp=$i
min
i=$stockItemp
tab[$i]=0
if [[ $scoreTemp -lt $scoreMinMax ]]; then
local scoreTemp=$scoreMinMax
local bestTemp=$i
if [[ $scoreTemp -eq $PLUS_INFINITY ]]; then
break
fi
fi
done
scoreMinMax=$scoreTemp
best_move=$bestTemp
fi
}
is_game_finish () {
# Line
if [[ ${tab[0]} == ${tab[1]} ]] && [[ ${tab[1]} == ${tab[2]} ]] && [[ ${tab[0]} != " " ]]; then
echo "${tab[0]}"
elif [[ ${tab[3]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[5]} ]] && [[ ${tab[3]} != " " ]]; then
echo "${tab[3]}"
elif [[ ${tab[6]} == ${tab[7]} ]] && [[ ${tab[7]} == ${tab[8]} ]] && [[ ${tab[6]} != " " ]]; then
echo "${tab[6]}"
# Col
elif [[ ${tab[0]} == ${tab[3]} ]] && [[ ${tab[3]} == ${tab[6]} ]] && [[ ${tab[0]} != " " ]]; then
echo "${tab[0]}"
elif [[ ${tab[1]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[7]} ]] && [[ ${tab[1]} != " " ]]; then
echo "${tab[1]}"
elif [[ ${tab[2]} == ${tab[5]} ]] && [[ ${tab[5]} == ${tab[8]} ]] && [[ ${tab[2]} != " " ]]; then
echo "${tab[2]}"
# Diagonal
elif [[ ${tab[0]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[8]} ]] && [[ ${tab[0]} != " " ]]; then
echo "${tab[0]}"
elif [[ ${tab[2]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[6]} ]] && [[ ${tab[2]} != " " ]]; then
echo "${tab[2]}"
else
j=5
for((i=0; i < 9; i++)){
if [ ${tab[i]=0} -eq 0 ]
then
j=0
break
fi
}
echo $j
fi
}
ask (){
echo "Enter a value between 0 and 8 which is in a free space :"
read -r coord
if ! [[ "$coord" =~ ^[0-8]$ ]]; then
echo -n "Not a correct value! "
ask
elif [ ${tab[$coord]} -eq 0 ]; then
tab[$coord]=$player
else
echo "This position is already taken! "
ask
fi
}
# Tic-tac-toe game VS minmax AI.
main () {
player=1
display
while [[ $(is_game_finish) = 0 ]]; do
if [ "$player" -eq 1 ]; then
ask
else
echo -n "Compute IA turn ... (please take a coffe)"
minmax
echo " Done.";
tab[$best_move]=2
fi
display
[ $player -eq 1 ] && player=2 || player=1
done
[ $player -eq 1 ] && player=2 || player=1
if [ $(is_game_finish) -eq 2 ]; then
echo "Skynet win. Fatality."
elif [ $(is_game_finish) -eq 1 ]; then
echo "Congratulation you won the game!" # theoricaly this line will never appear
else
echo "It's a draw, no winner !"
fi
}
main && exit 0
# GREETINGS PROFESSOR
#
# A STANGE GAME.
# THE ONLY WINNING MOVE IS NOT TO PLAY.
#
# HOW ABOUT A NICE GAME OF CHESS?
#!/bin/bash
# Nicolas Mauger, ESD17
# Here I release the future Skynet
tab=( " " " " " " " " " " " " " " " " " " )
IS_GAME_FINISH=false
display () {
echo "
${tab[0]} | ${tab[1]} | ${tab[2]}
---------
${tab[3]} | ${tab[4]} | ${tab[5]}
---------
${tab[6]} | ${tab[7]} | ${tab[8]}
"
}
ask () {
echo "Enter a value between 0 and 8 which is in a free space :"
read -r coord
if ! [[ "$coord" =~ ^[0-8]$ ]]; then
echo -n "Not a correct value! "
ask "$1"
elif ! [[ ${tab[$coord]} == " " ]]; then
echo -n "This position is already taken! "
ask "$1"
else
tab[$coord]=$1
fi
}
is_game_finish () {
# Line
if [[ ${tab[0]} == ${tab[1]} ]] && [[ ${tab[1]} == ${tab[2]} ]] && [[ ${tab[0]} != " " ]]; then
IS_GAME_FINISH=true
elif [[ ${tab[3]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[5]} ]] && [[ ${tab[3]} != " " ]]; then
IS_GAME_FINISH=true
elif [[ ${tab[6]} == ${tab[7]} ]] && [[ ${tab[7]} == ${tab[8]} ]] && [[ ${tab[6]} != " " ]]; then
IS_GAME_FINISH=true
# Col
elif [[ ${tab[0]} == ${tab[3]} ]] && [[ ${tab[3]} == ${tab[6]} ]] && [[ ${tab[0]} != " " ]]; then
IS_GAME_FINISH=true
elif [[ ${tab[1]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[7]} ]] && [[ ${tab[1]} != " " ]]; then
IS_GAME_FINISH=true
elif [[ ${tab[2]} == ${tab[5]} ]] && [[ ${tab[5]} == ${tab[8]} ]] && [[ ${tab[2]} != " " ]]; then
IS_GAME_FINISH=true
# Diagonal
elif [[ ${tab[0]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[8]} ]] && [[ ${tab[0]} != " " ]]; then
IS_GAME_FINISH=true
elif [[ ${tab[2]} == ${tab[4]} ]] && [[ ${tab[4]} == ${tab[6]} ]] && [[ ${tab[2]} != " " ]]; then
IS_GAME_FINISH=true
else
IS_GAME_FINISH=false
fi
}
main () {
player1="X"
player2="O"
player="$player1"
COUNTER=0
while ! $IS_GAME_FINISH; do
(( COUNTER++ ))
[ $COUNTER -ge 9 ] && echo "It's a draw, no winner !" && exit 0
[[ "$player" == "$player2" ]] && player="$player1" || player="$player2"
echo "Player $player, it's your turn." && display
ask $player
is_game_finish
done
display && echo "Congratulation to player $player who won the game!"
}
main && exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment