Uživatelské nástroje

Nástroje pro tento web


sudoku_v_shlellu

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
sudoku_v_shlellu.txt · Poslední úprava: 1. 11. 2014 autor: honya