рдореИрдВрдиреЗ рд╣рдм рдкрд░ рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ рдПрдХ рд▓реЗрдЦ рдкрдврд╝рд╛ рдерд╛ рдореИрдВрдиреЗ рдпрд╣ рднреА рд╕реЛрдЪрд╛ рдФрд░ рдпрд╛рдж рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрдХреНрд╕реЛрдирд┐рдХреНрд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ 386 рд╡реЗрдВ рджрд┐рди рдЗрд╕ рдЦреЗрд▓ рдХреЗ рд╕рд╛рде рдЫреЗрдбрд╝рдЦрд╛рдиреА рдХреА рдереАред рдФрд░ рдЕрдм, рдХреБрдЫ рд░рд╛рддреЛрдВ рдХреА рдиреАрдВрдж рд╣рд░рд╛рдо рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреИрдпрд╛рд░ рд╣реИред рдпрджрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛рдПрдВ рдкреИрджрд╛ рд╣реБрдИрдВ, рддреЛ рд╣реИрдмреНрд░реИрдЯ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рдЧреЗрдо рдХреЗ рдирд┐рдпрдо рдПрдХреНрд╕реЛрдирд┐рдХреНрд╕ рдХреЛ
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдмрд╛рд░ рдЦреЗрд▓реЗ рдЧрдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЛрдИ рднреВрдорд┐ рд╡рд┐рд░реЛрдзреА рдирд╣реАрдВ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рд▓рд┐рдЦрддреЗ рд╕рдордп, рдмреИрд╢ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреА рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореИрдВ рдЕрдкрдиреА рд░рд╛рдп рдореЗрдВ, рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ред
рдХрд╛рд░реНрдпреЛрдВ
рдЪреВрдВрдХрд┐ рдпрд╣ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдбрд╝реА рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╣реИред рдмрд╛рд╢ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
function func() { cmd1 cmd2 ... cmdn }
рдФрд░ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
func param1 param2 ... paramn
рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ
$1
,
$2
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИ, ... рдЖрдк рд╕реНрдерд╛рдиреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
local
рдЪрд░ рднреА рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рджреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВред рдкрд╣рд▓рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЪрд░ рдореЗрдВ рдПрдХ рдЧрддрд┐рд╢реАрд▓ рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдирд┐рдореНрди рдХреЛрдб
i=3 function f() { echo $i } function g() { local i=5 f } function h() { local i=10 f } g h
5 рдФрд░ 10 рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдЧрд╛ред
рд╡рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб
var i = 3; function f() { alert(i); } function g() { var i = 5; f(); } function h() { var i = 10; f(); } g(); h();
рдЖрджрддрди рджреЛ рдмрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
рджреВрд╕рд░реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдЦрд╛рд▓реА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ (рд╕рд╛рде рд╣реА рдмреИрд╢ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмреНрд▓реЙрдХ)ред рдпрд╣ рдмреГрд╣рджрд╛рдиреНрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рд╕реНрдЯрдм рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
function f() { : }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп
#
рдЖрдк рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
:
function f() { : cmd1 : cmd2 : cmd3 }
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рднрд╛рдЧрд┐рддрд╛
рдпрд╣ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рд░рдВрдЧреАрди рд╡рд░реНрдгреЛрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП, рдПрд╕реНрдХреЗрдк рд╕реАрдХреНрд╡реЗрдВрд╕
"\e[ ; ; m"
ред рдХрд░реНрд╕рд░ рдХреЛ рдПрд╕реНрдХреЗрдк рд╕реАрдХреНрд╡реЗрдВрд╕
"\e[ ; f"
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрд▓рдЯреА рдЧрд┐рдирддреА рдПрдХ рд╕реЗ рд╣реЛрддреА рд╣реИред рджреЛ рдФрд░ рднрд╛рдЧрдиреЗ рдХреЗ рдХреНрд░рдо рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ:
"\e[2K"
- рд╕рдВрдкреВрд░реНрдг рд╡рд░реНрддрдорд╛рди рд░реЗрдЦрд╛ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ,
"\e[2J"
- рд╕рдВрдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВред рдЖрдк рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ
man console_codes
рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рдХрдВрд╕реЛрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡реЗ рд╡реЗрд░рд┐рдПрдмрд▓
COLUMNS
рдФрд░
LINES
рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡реЗ рдХреЗрд╡рд▓ рдСрдирд▓рд╛рдЗрди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦрдирд╛ рд╣реИ
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЗрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджрдмрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
stty -echo
рдЬрдм рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рддреЛ рд▓рд┐рдЦреЗрдВ
stty echo
рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдкрд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рд╣реИ, рдФрд░ рдЕрднреА рднреА рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХрд┐рди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рджрдмрд╛рдпрд╛, рдореБрдЦреНрдп рд▓реВрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
function runLevel() { local -l key local -i time=0 local -i newTime ... while true; do key="" read -t $TIMEOUT -n 1 key newTime=$((`date +%s` * 100 + (10
рдпрд╣рд╛рдБ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБ рд░реВрдЪрд┐ рдХреЗ рд╣реИрдВред
key
рдЪрд░ рдкрд░
-l
рд╡рд┐рд╢реЗрд╖рддрд╛ рдЖрдкрдХреЛ рдпрд╣ рднреВрд▓ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдХрд┐ CAPS LOCK рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЪрд░ рдХрд╛ рдорд╛рди рд╣рдореЗрд╢рд╛ рдХрдо рд╣реЛрдЧрд╛ред рдФрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐, рдЬрд┐рд╕рдХрд╛ рдореВрд▓реНрдп newTime рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ, рдорд┐рд▓рд┐рд╕реЗрдХрдВрдб рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
рд╕рд░рдгрд┐рдпреЛрдВ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╕рд╛рде рд╣реА рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рд░реЛрдзрд┐рдпреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдирд┐рд░реНрджреЗрд╢ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдмреИрд╢ рдореЗрдВ, рд╕рд░рдгрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдПрдХ-рдЖрдпрд╛рдореА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛: рдмрд╕ рджреЛ-рдЖрдпрд╛рдореА рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЗрди рд╕реЗ рдмрд╛рд╣рд░ рдЦреАрдВрдЪреЗрдВред рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд░рдгрд┐рдпреЛрдВ рдХреА рд╕реАрдорд╛рдУрдВ рдХреА рдердХрд╛рдК рдЬрд╛рдВрдЪ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд╖реЗрддреНрд░ рдкрд░рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд╕реАрдорд╛ рддрддреНрд╡ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд╝реАрд▓реНрдб рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
function initMap() { local -ii local -ij for ((i = 1; i < MAP_HEIGHT - 1; ++i)); do for ((j = 1; j < MAP_WIDTH - 1; ++j)); do map[i * MAP_WIDTH + j]=$SEA done done for ((i = 0; i < MAP_HEIGHT; ++i)); do map[i * MAP_WIDTH]=$LAND map[i * MAP_WIDTH + MAP_WIDTH - 1]=$LAND done for ((j = 0; j < MAP_WIDTH; ++j)); do map[j]=$LAND map[(MAP_HEIGHT - 1) * MAP_WIDTH + j]=$LAND done }
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╕рд░рдгреА рдореЗрдВ рдЫреЗрдж рд╕рдВрднрд╡ рд╣реИрдВред рдФрд░ рдмреИрд╢ рдореЗрдВ рднреА рд╕рд╛рд╣рдЪрд░реНрдп рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВред
рдЕрднрд┐рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рд▓рд┐рдЦрдиреА рд╣реЛрдЧреА рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рд░рдгреА рдХреЛ рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд░рдгреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рдлрд┐рд░ рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА рдХреЛ рдкрдврд╝рдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
function writeTopScores() { (IFS=$'\n'; echo "${topScores[*]}" > "$TOP_SCORES_FILE_NAME") }
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг:
${a[*]}
рдЕрд░реНрде рд╣реИ рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрдиред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрджрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреЛрд╣рд░реЗ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрдиреЛрдВ рдореЗрдВ рдкрд╛рдИ рдЬрд╛рддреА рд╣реИ, рддреЛ
IFS
рдЪрд░ рд╕реЗ рдкрд╣рд▓рд╛ рд╡рд░реНрдг рдПрдХ рд╡рд┐рднрд╛рдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рд╕рд░рдгреА рдкрдврд╝рдирд╛ рднреА рд╕рд░рд▓ рд╣реИ:
function readTopScores() { topScores=() if [[ -r "$TOP_SCORES_FILE_NAME" ]]; then readarray -t topScores < "$TOP_SCORES_FILE_NAME" fi }
рд╕рдореБрджреНрд░ рдХреЗ рд╡рд┐рдЬрдпреА рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╣рдЯрд╛рдирд╛
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдмреИрд╢ рдореЗрдВ рд▓рд┐рдЦреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдзреАрдореЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рд╕рдорд╛рди рдХреЛрдб рдХреЛ рддреБрд░рдВрдд рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рд╕рдордп рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрднреА рддрдХ рдХреЛрдИ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдХреВрд▓рди рддрд░реАрдХреЛрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЬрд┐рдирдХрд╛ рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореБрдЭреЗ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╕рдВрдХрд▓рдХ рджреНрд╡рд╛рд░рд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ: рд▓реВрдк рдХреЗ рд╢рд░реАрд░ рд╕реЗ рджреЛрд╣рд░рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рд╣рдЯрд╛рдХрд░, рдЗрдл-рдПрд▓рд┐рдл-рдПрд▓реАрдл-рдФрд░-рдлрд╛рдИ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛, рд╣рд╛рд▓рдд рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдШрдЯрддреЗ рдХреНрд░рдо рдореЗрдВ, рдЖрджрд┐ред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдореБрджреНрд░ рдХреЗ рдкрдХрдбрд╝реЗ рдЧрдП рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХрд╛ рдЙрдкрдорд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдорд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдбреЛрдореЗрди рдлрд┐рд▓рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рд░рд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
function deleteFreeAreas() { local -a points local -ii for ((i = 0; i < countOpponents; ++i)); do points[i]=$((opponents[4 * i] * mapWidth + opponents[4 * i + 1])) done local -i countPoints=$countOpponents local -i index while [[ countPoints -ne 0 ]]; do index=$((points[--countPoints])) map[index]=$opponentArea if [[ ${map[index + 1]} == $sea ]]; then points[countPoints++]=$((index + 1)) fi if [[ ${map[index - 1]} == $sea ]]; then points[countPoints++]=$((index - 1)) fi if [[ ${map[index + mapWidth]} == $sea ]]; then points[countPoints++]=$((index + mapWidth)) fi if [[ ${map[index - mapWidth]} == $sea ]]; then points[countPoints++]=$((index - mapWidth)) fi done ... }
рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд, рдмрд╣реБрдд, рдмрд╣реБрдд рдзреАрдорд╛ рдерд╛ред рдЕрдиреБрдХреВрд▓рди рдкрд░ рджреЛ рдпрд╛ рддреАрди рдШрдВрдЯреЗ рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреБрдирд░реНрд▓реЗрдЦрди рдХрд┐рдпрд╛ рдпрд╛ рдХрд┐, рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рддреЗрдЬ рдХрд┐рдпрд╛, рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдмрд┐рд╕реНрддрд░ рдкрд░ рдЪрд▓рд╛ рдЧрдпрд╛ред рдФрд░ рд╕реБрдмрд╣ рд╣рдмреНрд░ рдкрд░ рдореИрдВрдиреЗ
рдПрдХ рдмрд╛рдЗрдирд░реА рдЫрд╡рд┐ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЧрд┐рдирддреЗ рд╣реБрдП рд▓реЗрдЦ рджреЗрдЦрд╛
ред рднрд╛рдЧ 1 рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рдерд╛ред рддреБрд░рдВрдд рдореИрдВрдиреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд╡рд╣рд╛рдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рдЬрд┐рд╕рдХрд╛ рд╕рдордп рдХрд╛рдлреА рд╕рдВрддреБрд╖реНрдЯ рдерд╛:
function deleteFreeAreas() { local -a marks=() local -i mark=MARK_0 ... for ((i = 1; i < MAP_HEIGHT - 1; ++i)); do for ((j = 1; j < MAP_WIDTH - 1; ++j)); do index=$((i * MAP_WIDTH + j)) if [[ ${tracks[index]} ]]; then map[index]=$LAND fi a=${map[index]} b=${map[(i - 1) * MAP_WIDTH + j]} c=${map[i * MAP_WIDTH + j - 1]} if [[ a -eq SEA ]]; then if [[ b -ne LAND && c -ne LAND ]]; then if [[ ${marks[b]} -eq ${marks[c]} ]]; then map[index]=${marks[b]} else d=$(((b < c) ? b : c)) e=$(((b < c) ? c : b)) map[index]=${marks[d]} m=${marks[e]} for ((k = MARK_0; k < mark; ++k)); do if [[ ${marks[k]} -eq m ]]; then marks[k]=${marks[d]} fi done fi elif [[ b -eq LAND && c -eq LAND ]]; then map[index]=$mark marks[mark]=$mark ((++mark)) elif [[ b -ne LAND && c -eq LAND ]]; then map[index]=${marks[b]} elif [[ b -eq LAND && c -ne LAND ]]; then map[index]=${marks[c]} fi fi done done for ((i = 0; i < countOpponents; ++i)); do m=${marks[${map[$(( ${opponents[4 * i]} * MAP_WIDTH + ${opponents[4 * i + 1]}))]}]} for ((j = 0; j < mark; ++j)); do if [[ ${marks[j]} -eq m ]]; then marks[j]=$OPPONENT_AREA fi done done ... }
рд╣рд┐рд▓рддреЗ рд╣реБрдП рджреБрд╢реНрдорди
рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЙрдкрдорд╛ рд╕реАрдорд╛рдУрдВ рд╕реЗ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдЦрджреЗрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд▓рд┐рдЦ рд░рд╣рд╛ рдерд╛ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдЪреЗрдХ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдпрд╣ рднрд╛рд░реА рдФрд░ рдЕрдирд╛рдбрд╝реА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛ред рдореБрдЭреЗ рдлрд┐рд░ рд╕реЗ рд╕реЛрдЪрдирд╛ рдкрдбрд╝рд╛ред
рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рджреБрд╢реНрдорди рдХреА рдЕрдЧрд▓реА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ 3x3 рдлрд╝реАрд▓реНрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐ рджреБрд╢реНрдорди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХреЗрд╡рд▓ 2 ^ 8 = 256 рд╡реЗрд░рд┐рдПрдВрдЯ рд╕рдВрднрд╡ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдореИрдВ рд╕рднреА 256 рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕рд╛рдВрдХреЗрддрд┐рдХ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЖрдЧреЗ рдХреА рдЧрддрд┐ рдХреА рджрд┐рд╢рд╛ рдХреЗрд╡рд▓ рд╕реАрдорд╛ рдХреЗ рдореБрдЦреНрдп рдЯреБрдХрдбрд╝реЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдХреНрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
_ X _ XXXXX _ _ XX _ 1 _ _ 1 _ _ 1 _ _ 1 _ _ _ 2 _ _ 2 _ _ 2 _ _ 2
рд╣рдо рд╕рдВрдХреЗрддрди рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ: X - рднреВрдорд┐, _ - рд╕рдореБрджреНрд░,? - рдХреБрдЫ рднреАред
рдлрд┐рд░ рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдиреНрдпрд╛рд╕ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдХреЛ рдирд┐рдореНрди рдкреИрдЯрд░реНрди рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
? X ? ? o _ ? _ _
рдФрд░ рдпрд╣ рд╕рдм рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рди рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред
function compare() { local -r -a pattern=($1) local -r -ax=($2) local -ii for ((i = 0; i < 8; ++i)); do if [[ ${pattern[i]} -ne ANY && ${pattern[i]} -ne ${x[i]} ]]; then return 1 fi done return 0 } rules=(
рдФрд░ рдЕрдВрдд рдореЗрдВ, рджреЛ рдордЬреЗрджрд╛рд░ рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп рдХреА рдереАред
рдФрд░ рдХрд┐рддрдиреЗ рд▓рд╛рдкрддрд╛ рдбреЙрд▓рд░ рдЖрдЗрдХрди, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди - рдЧрд┐рдиреЗ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ
http://codepad.org/UfTfcMxj рдкрд░ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕реЗ 80x25 рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рддрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдордЬреЛрд░ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдмреНрд░реЗрдХ рд╕рдВрднрд╡ рд╣реИред
UPD1ред рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ codepad.org рд╕реЗ рдХрдЪреНрдЪреЗ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓рд╛рдЗрди рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдВрдд рдХреЛ CRLF рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╛ рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд╛рда рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВ, рдпрд╛ рдЗрд╕реЗ dos2unix рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред
UPD2ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдореБрдЦ рд░рд┐рд╡рд░реНрд╕ рдЖрдВрджреЛрд▓рди рдХреЛ рджрдмрд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдо рдЕрд▓рдЧ рд╣реИрдВред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкреИрдЪ tzlom
habrayuzer http://codepad.org/slUUrueq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред