#!/bin/bash
P1=6;P2=1
P3=20;P4=1
P5=14;P6=48
function Chess_board ()
{
printf "\n\n\n";printf "%32s " " ";printf "\e[33m----->>FIVE STONE GAME<<-----\e[0m";printf "\n"
printf "
printf "%30s\e[43m ";printf "\e[43m \e[0m\n"
for i in {15..1}
do
for j in {1..15}
do
if [ $j = 1 ]
then
if [ $i -le 9 ]
then
printf "%30s" " ";echo -ne "\e[43m\e[30m"" "$i" "; printf "\e[43m\e[30m+ \e[0m"
else
printf "%30s" " ";echo -ne "\e[43m\e[30m"$i" "; printf "\e[43m\e[30m+ \e[0m"
fi
elif [ $j = 15 ]
then
printf "\e[43m\e[30m+ \e[0m"
elif [ $j = 8 ] && [ $i = 8 ]
then
printf "\e[43m\e[30m.\e[43m \e[0m"
elif [ $j = 4 ] && [ $i = 4 ]
then
printf "\e[43m\e[30m.\e[43m \e[0m"
elif [ $j = 12 ] && [ $i = 4 ]
then
printf "\e[43m\e[30m.\e[43m \e[0m"
elif [ $j = 4 ] && [ $i = 12 ]
then
printf "\e[43m\e[30m.\e[43m \e[0m"
elif [ $j = 12 ] && [ $i = 12 ]
then
printf "\e[43m\e[30m.\e[43m \e[0m"
else
printf "\e[43m\e[30m+ \e[0m"
fi
done
printf "\n"
done
printf "%30s\e[43m\e[30m A B C D E F G H I J K L M N O ";printf "\e[43m \e[0m\n"
}
function Location_cursor()
{
h=$1;l=$2
printf "\e[$h;$l;H"
}
function Moving_cursor ()
{
stty cbreak -echo
dd if=/dev/tty bs=1 count=1 2>/dev/null
stty -cbreak echo
}
function Choose ()
{
x=0;y=0;
while true
do
case $(Moving_cursor) in
i|I) printf "\e[1A";((x--));; # Up
k|K) printf "\e[1B";((x++));; # Down
j|J) printf "\e[2D";((y--));; # Left
l|L) printf "\e[2C";((y++));; # Right
" ") break;; # Play
b|B) Start_game;; # Quit the game
esac
done
}
function Test_array ()
{
point=$1;arr=$2
test=$(eval echo \${$arr[@]})
[[ $test == ${test/$point/} ]]
}
function y_n ()
{
arr=$1
eval echo \${$arr[@]}|tr ' ' '\n'|sort -t',' -k1,1n -k2,2n|tr ',' ' '|Score $2 $3
}
function x_n (){
arr=$1
eval echo \${$arr[@]}|tr ' ' '\n' |awk -F, '{print $2" "$1}' |sort -k1n -k2n |Score $2 $3
}
function xy_l_n(){
arr=$1
eval echo \${$arr[@]}|tr ' ' '\n' |awk -F, '{print $1+$2" "$1}' |sort -k1n -k2n |Score $2 $3
}
function xy_r_n(){
arr=$1
eval echo \${$arr[@]}|tr ' ' '\n' |awk -F, '{print $1-$2" "$1}' |sort -k1n -k2n |Score $2 $3
}
function Score(){
num=$2;
if [ $1 == 1 ]
then
awk -vn=$num '{if($1==v1){
if($2==v2+1){a[$1]++}
else{a[$1]=1}}
else{a[$1]=1}
v1=$1
v2=$2}
END{for(i in a)
if(a[i]>=n){print "1";exit}
print "0"}
'
else
awk -vn=$num '{if($1==v1){
if($2==v2+1){a[$1]++}
else{a[$1]=1}}
else{a[$1]=1}
v1=$1
v2=$2}
END{for(i in a){
if(a[i]>=n){print sum="1000000000";exit}
sum+=a[i]==4?"10000000":10*10^a[i]};
print sum}
'
fi
}
function Computer_decision(){
i=0
unset max_w
unset max_b
((sum_w_old=$(xy_r_n array_white 0 5)+$(xy_l_n array_white 0 5)+$(x_n array_white 0 5)+$(y_n array_white 0 5)))
((sum_b_old=$(xy_r_n array_black 0 5)+$(xy_l_n array_black 0 5)+$(x_n array_black 0 5)+$(y_n array_black 0 5)))br/>while((i<${#All_pos[@]}))
do
blackpoint="$black_point ${All_pos[$i]}"
arrayblack=(${blackpoint:1})
whilepoint="$white_point ${All_pos[$i]}"
arraywhite=(${whilepoint:1})
((sum_w=$(xy_r_n arraywhite 0 5)+$(xy_l_n arraywhite 0 5)+$(x_n arraywhite 0 5)+$(y_n arraywhite 0 5)))
((sum_b=$(xy_r_n arrayblack 0 5)+$(xy_l_n arrayblack 0 5)+$(x_n arrayblack 0 5)+$(y_n arrayblack 0 5)))
((increase_score_b=sum_b-sum_b_old))
((increase_score_w=sum_w-sum_w_old))
if ((sum_w>=1000000000))||((sum_b>=1000000000))
then
echo ${All_pos[$i]}&&s=1&&break
else
if ((max_b>increase_score_b))
then
((max_b=max_b))
else
((max_b=increase_score_b,index_b=i))
fi
if ((max_w>increase_score_w))
then
((max_w=max_w))
else
((max_w=increase_score_w,index_w=i))
fi
s=0;
fi
((i++))
done
if [ $s != 1 ]
then
if ((max_b >= max_w))
then
echo ${All_pos[$index_b]}
else
echo ${All_pos[$index_w]}
fi
fi
}
if_continue ()
{
Location_cursor 40 1
read -p "Do you want one more game? Y/N: " answer1
case $answer1 in
y|Y) clear;
echo -e '\n\n\n\n\n\n Do you want to continue player vs player\e[31m(1)\e[0m, or try player vs computer\e[33m(2)\e[0m? '
read -p " Please choose: " answer2;
case $answer2 in
1) Main_program_player_vs_player ;;
2) Main_program_player_vs_computer ;;
esac;;
n|N) echo " Thanks!!! ";exit;;
esac
}
function Winif ()
{
who=$1;
[ xy_r_n $1 $2 $3
== 1 ]||[ xy_l_n $1 $2 $3
== 1 ]||[ x_n $1 $2 $3
== 1 ]||[ y_n $1 $2 $3
== 1 ]&& Locationcursor 12 1 && echo "The ${who##_} win!!!" && Location_cursor $Cx $Cy && echo -e "\e[47m\e[30m+ \e[0m" && Location_cursor $Cx $Cy &&if_continue
}
function Main_program_player_vs_player ()
{
clear # CygWin use echo -e "\e[2J"
Chess_board
Location_cursor $P5 $P6
((Cx=P5,Cy=P6))
unset test_point step step_b step_w black_point white_point
array_white=(); array_black=()
while true
do
Choose
Location_cursor $P3 $P4
echo -e " \n \n "
((Cx=Cx+x,Cy=2y+Cy))
((abs_x=P5-Cx,abs_y=((Cy-P6))/2))
test_point="$abs_x,$abs_y"
if (($abs_x <= 7)) && (($abs_x >= -7)) && (($abs_y <= 7)) && (($abs_y >= -7))
then
if ! Test_array $test_point array_white || ! Test_array $test_point array_black
then
Location_cursor $P3 $P4
echo -e "Not allowed\nPlease try again!!!" && test_result=1
fi
else
Location_cursor $P3 $P4
echo -e "Out of chess broad\nNot allowed\nPlease try again!!!" && test_result=1
fi
if [ "$test_result" == 1 ]
then
((Cx=P5-abs_x,Cy=2*abs_y+P6)) && test_result=0
Location_cursor $Cx $Cy
else
((step++))
((who_go=step%2))
Location_cursor $P1 $P2
if [ $who_go = 1 ]
then
((step_b++))
black_point="$black_point $abs_x,$abs_y"
array_black=(${black_point:1})
Win_if array_black 1 5
Location_cursor $P1 $P2
echo -e "\e[31m The Black \e[0m"
echo -e "\e[31mStep= $step_b\e[0m"
echo "-->The White's turn<--"
echo "Step= $step_w"
Location_cursor $Cx $Cy
echo -e "\e[40m+ \e[0m"
Location_cursor $Cx $Cy
else
((step_w++))
white_point="$white_point $abs_x,$abs_y"
array_white=(${white_point:1})
Win_if array_white 1 5
Location_cursor $P1 $P2
echo -e "\e[31m The White \e[0m"
echo -e "\e[31mStep= $step_w\e[0m"
echo "-->The Black's turn<--"
echo "Step= $step_b"
Location_cursor $Cx $Cy
echo -e "\e[47m\e[30m+ \e[0m"
Location_cursor $Cx $Cy
fi
fi
done
}
#Main_program
function Main_program_player_vs_computer ()
{
clear # CygWin use echo -e "\e[2J"
All_pos=($(echo {-7..7},{-7..7}))
Chess_board
Location_cursor $P5 $P6
((Cx=P5,Cy=P6))
unset test_point step step_b step_w black_point white_point
array_white=(); array_black=()
while true
do
Choose
Location_cursor $P3 $P4
echo -e " \n \n "
((Cx=Cx+x,Cy=2*y+Cy))
((abs_x=P5-Cx,abs_y=((Cy-P6))/2))
test_point="$abs_x,$abs_y"
if (($abs_x <= 7)) && (($abs_x >= -7)) && (($abs_y <= 7)) && (($abs_y >= -7))
then
if ! Test_array $test_point array_white
then
Location_cursor $P3 $P4
echo -e "Not allowed\nPlease try again!!!" && test_result=1
fi
else
Location_cursor $P3 $P4
echo -e "Out of chess broad\nNot allowed\nPlease try again!!!" && test_result=1
fi
if [ "$test_result" == 1 ]
then
((Cx=P5-abs_x,Cy=2*abs_y+P6)) && test_result=0
Location_cursor $Cx $Cy
else
Location_cursor $P1 $P2
((step_b++))
black_point="$black_point $abs_x,$abs_y"
array_black=(${black_point:1})
Location_cursor $((P3+2)) $P4
Win_if array_black 1 5
Location_cursor $P1 $P2
echo -e "\e[31mThe Player \e[0m"
echo -e "\e[31mStep= $step_b\e[0m"
echo "-->The Computer's turn<--"
echo "Step= $step_w"
Location_cursor $Cx $Cy
echo -e "\e[40m+ \e[0m"
Location_cursor $Cx $Cy
All_pos=(`echo ${All_pos[@]}|sed "s/ $abs_x,$abs_y / /"`)
# computer:
Comp_pos=$(Computer_decision)
((step_w++))
white_point="$white_point $Comp_pos"
array_white=(${white_point:1})
abs_x=${Comp_pos%,*}
abs_y=${Comp_pos#*,}
((Cx=P5-abs_x,Cy=2*abs_y+P6))
Win_if array_white 1 5
All_pos=(`echo ${All_pos[@]}|sed "s/ $Comp_pos / /"`)
Location_cursor $P1 $P2
echo -e "\e[31mThe Computer \e[0m"
echo -e "\e[31mStep= $step_w\e[0m"
echo -e "-->The Player's turn<--"
echo -e "Step= $step_b"
Location_cursor $Cx $Cy
echo -e "\e[47m\e[30m+ \e[0m"
Location_cursor $Cx $Cy
fi
done
} Mainpage
function Start_game()
{
clear; # CygWin use echo -e "\e[2J"
cat < ----->>FIVE STONE GAME<<-----
<
read -p " Please choose the game you want to play, or quit the game: " answer;
case $answer in
1) Main_program_player_vs_player ;;
2) Main_program_player_vs_computer ;;
q|Q) exit;;
esac
}
Start_game