Hra sudoku napsaná v shellu
#!/bin/bash
PRESS=""
KURZOR=(3 4)
KURZOR_S=(3 4)
SUD=( 1 )
SED='\e[0;30m' # světle šedá
N='\e[0m' # Bez barvy a obyčejné písmo
B='\e[1m' #Tučně
function vypln_zadani () {
SUD1=( 2 4 5 9 1 3 6 8 7
1 8 3 4 6 7 2 5 9
7 6 9 2 5 8 1 4 3
9 5 1 3 4 2 8 7 6
3 2 8 5 7 6 4 9 1
6 7 4 8 9 1 5 3 2
4 1 2 7 3 5 9 6 8
5 3 6 1 8 9 7 2 4
8 9 7 6 2 4 3 1 5 )
SUD1S=( 0 0 0 0 1 1 0 1 0
1 0 1 0 1 0 1 0 0
1 0 1 1 1 1 0 1 0
0 1 0 0 1 0 0 0 1
1 0 0 1 1 0 0 0 1
0 1 1 0 0 0 0 1 0
0 1 0 0 1 0 0 0 1
0 1 0 0 0 1 0 1 1
1 1 0 0 0 1 0 0 0 )
# Které zadání se má vyplnit?
SUD=( ${SUD1[*]} )
SUDS=( ${SUD1S[*]} )
# Vyplnování zadání z pole
A=0
for ((R=3; R<20; R=$R+2)); do
for ((S=5; S<38; S=$S+4)); do
if [ "${SUDS[$A]}" != "0" ]; then # pokud je v poli 1
echo -en "${B}\e[${R};${S}f${SUD[$A]}${N}"
SUDV[$A]=${SUD[$A]}
fi
A=$((A+1))
done
S="5"
done
}
function vykresli_mriz () {
clear
echo -e "
${SED}┏━━━┯━━━┯━━━┳━━━┯━━━┯━━━┳━━━┯━━━┯━━━┓
┃ │ │ ┃ │ │ ┃ │ │ ┃ ${N}Sudoku by Honya${SED}
┠───┼───┼───╂───┼───┼───╂───┼───┼───┨
┃ │ │ ┃ │ │ ┃ │ │ ┃ ${N}-pohyb šipkami${SED}
┠───┼───┼───╂───┼───┼───╂───┼───┼───┨ ${N}-vymazání písmenem c${SED}
┃ │ │ ┃ │ │ ┃ │ │ ┃
┣━━━┿━━━┿━━━╋━━━┿━━━┿━━━╋━━━┿━━━┿━━━┫
┃ │ │ ┃ │ │ ┃ │ │ ┃
┠───┼───┼───╂───┼───┼───╂───┼───┼───┨
┃ │ │ ┃ │ │ ┃ │ │ ┃
┠───┼───┼───╂───┼───┼───╂───┼───┼───┨
┃ │ │ ┃ │ │ ┃ │ │ ┃
┣━━━┿━━━┿━━━╋━━━┿━━━┿━━━╋━━━┿━━━┿━━━┫
┃ │ │ ┃ │ │ ┃ │ │ ┃
┠───┼───┼───╂───┼───┼───╂───┼───┼───┨
┃ │ │ ┃ │ │ ┃ │ │ ┃
┠───┼───┼───╂───┼───┼───╂───┼───┼───┨
┃ │ │ ┃ │ │ ┃ │ │ ┃
┗━━━┷━━━┷━━━┻━━━┷━━━┷━━━┻━━━┷━━━┷━━━┛$N"
}
function zkontroluj_vyplnene () {
# Kontrola prozatím vyplněného - pokud je vše ok tak hra končí.
if [ "${SUD[*]}" = "${SUDV[*]}" ]; then
clear
echo -e "\n Gratulujeme! Sudoku úspěšně vyřešeno. \n\n Stiskem Ctrl-C hru ukončíte."
fi
}
function vykresli_kurzor () {
wait
# Zamezí vyjetí z pole
[[ ${KURZOR[0]} -gt 19 || ${KURZOR[0]} -lt 3 ]] && KURZOR[0]=${KURZOR_S[0]}
[[ ${KURZOR[1]} -gt 36 || ${KURZOR[1]} -lt 3 ]] && KURZOR[1]=${KURZOR_S[1]}
echo -en "\e[${KURZOR_S[0]};${KURZOR_S[1]}f "
echo -en "\e[${KURZOR_S[0]};$((KURZOR_S[1]+2))f "
echo -en "\e[${KURZOR[0]};${KURZOR[1]}f["
echo -en "\e[${KURZOR[0]};$((KURZOR[1]+2))f]"
}
function pohyb () {
KURZOR_S=( ${KURZOR[*]} )
case "$PRESS" in
"[A" ) KURZOR[0]=$((KURZOR[0]-2)); vykresli_kurzor ;; # Up
"[B" ) KURZOR[0]=$((KURZOR[0]+2)); vykresli_kurzor ;; # Down
"[C" ) KURZOR[1]=$((KURZOR[1]+4)); vykresli_kurzor ;; # Right
"[D" ) KURZOR[1]=$((KURZOR[1]-4)); vykresli_kurzor ;; # Left
"c" ) wait; echo -en "\e[${KURZOR[0]};${KURZOR[1]}f[ ]" & ;; # vymaže hodnotu v kurzoru
[0-9] )
wait
# Vyplní napsanou číselnou hodnotu do pole.
echo -en "\e[${KURZOR[0]};${KURZOR[1]}f[$PRESS]" &
# Převede souřadnice hřiště na pořadí v poli se sudoku a vyplní napsanou hodnotu.
SUDV[$(((((((KURZOR[0]-1)/2)-1))*9+(KURZOR[1]/4))-1))]="$PRESS"
zkontroluj_vyplnene &
;;
* ) ;;
esac
}
function at_exit() {
printf "\e[?9l" # Turn off mouse reading
printf "\e[?12l\e[?25h" # Turn on cursor
stty "$_STTY" # reinitialize terminal settings
tput sgr0
clear
}
stty -echo -icanon
exec 2>/dev/null
trap at_exit ERR EXIT # Volá funkci, pokud je ukončeno.
echo -en "\033[?25l"
vykresli_mriz
vypln_zadani
vykresli_kurzor
while true; do
read -d "" -sn1 PRESS
[[ "$PRESS" = $'\e' ]] && read -d "" -sn2 PRESS
pohyb
done
exit 0