Last active
November 9, 2018 11:56
-
-
Save maugern/3576368111709f639655fc36f189697a to your computer and use it in GitHub Desktop.
Tic-Tac-Toe in bash
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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? |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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