рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реАрдЦреЗрдВ, Xonix рд▓рд┐рдЦреЗрдВ

рдореИрдВрдиреЗ рд╣рдм рдкрд░ рдХреБрдЫ рд╣рдлреНрддреЗ рдкрд╣рд▓реЗ рдПрдХ рд▓реЗрдЦ рдкрдврд╝рд╛ рдерд╛ рдореИрдВрдиреЗ рдпрд╣ рднреА рд╕реЛрдЪрд╛ рдФрд░ рдпрд╛рдж рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрдХреНрд╕реЛрдирд┐рдХреНрд╕ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдЕрдкрдиреЗ рдкреБрд░рд╛рдиреЗ 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 рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рд╡реЗ рдХреЗрд╡рд▓ рдСрдирд▓рд╛рдЗрди рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд▓рд┐рдЦрдирд╛ рд╣реИ
 #!/bin/bash -i 

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЗрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рджрдмрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ
 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#`date +%N` / 10000000))) case "$key" in $UP_KEY) playerDY=-1 playerDX=0;; $DOWN_KEY) playerDY=1 playerDX=0;; $LEFT_KEY) playerDX=-1 playerDY=0;; $RIGHT_KEY) playerDX=1 playerDY=0;; $EXIT_KEY) break 3;; "") ;; esac if [[ $((newTime - time)) -ge DELAY ]]; then movePlayer moveOpponents time=newTime fi ... done } 

рдпрд╣рд╛рдБ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд┐рдВрджреБ рд░реВрдЪрд┐ рдХреЗ рд╣реИрдВред 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=( # pattern dy dx "$ANY $SEA $SEA $ANY $SEA $ANY $ANY $ANY" 1 1 "$ANY $LAND $ANY $ANY $SEA $ANY $SEA $SEA" -1 1 "$SEA $SEA $ANY $SEA $LAND $ANY $ANY $ANY" 1 -1 "$ANY $ANY $LAND $ANY $ANY $LAND $ANY $ANY" 0 0 "$ANY $LAND $ANY $ANY $ANY $ANY $LAND $ANY" 0 0 "$ANY $ANY $ANY $LAND $LAND $ANY $ANY $ANY" 0 0 ... "$ANY $LAND $ANY $ANY $ANY $LAND $ANY $LAND" 0 0 ) declare -r -i COUNT_RULES=$((${#rules[*]} / 3)) function findRule() { local -rx=$1 for ((i = 0; i < COUNT_RULES; ++i)); do if compare "${rules[i * 3]}" "$x"; then echo ${rules[i * 3 + 1]} ${rules[i * 3 + 2]} break fi done } function moveOpponents() { local -ii local -iy local -ix local -i dx local -i dy local -a cells local -a rule for ((i = 0; i < countOpponents; ++i)); do y=${opponents[4 * i]} dy=${opponents[4 * i + 2]} x=${opponents[4 * i + 1]} dx=${opponents[4 * i + 3]} clearOpponent $y $x cells[0]=${map[(y + dy) * MAP_WIDTH + x - dx]} cells[1]=${map[(y + dy) * MAP_WIDTH + x]} cells[2]=${map[(y + dy) * MAP_WIDTH + x + dx]} cells[3]=${map[y * MAP_WIDTH + x - dx]} cells[4]=${map[y * MAP_WIDTH + x + dx]} cells[5]=${map[(y - dy) * MAP_WIDTH + x - dx]} cells[6]=${map[(y - dy) * MAP_WIDTH + x]} cells[7]=${map[(y - dy) * MAP_WIDTH + x + dx]} rule=(`findRule "${cells[*]}"`) ((dy *= rule[0])) ((dx *= rule[1])) ((y += dy)) ((x += dx)) opponents[4 * i]=$y opponents[4 * i + 2]=$dy opponents[4 * i + 1]=$x opponents[4 * i + 3]=$dx drawOpponent $y $x done ... } 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рджреЛ рдордЬреЗрджрд╛рд░ рдЧрд▓рддрд┐рдпрд╛рдБ рдЬреЛ рдореИрдВрдиреЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрддреЗ рд╕рдордп рдХреА рдереАред


рдФрд░ рдХрд┐рддрдиреЗ рд▓рд╛рдкрддрд╛ рдбреЙрд▓рд░ рдЖрдЗрдХрди, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди - рдЧрд┐рдиреЗ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреЗред

рд╕реНрдХреНрд░рд┐рдкреНрдЯ http://codepad.org/UfTfcMxj рдкрд░ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕реЗ 80x25 рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдк рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рддрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрдордЬреЛрд░ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдмреНрд░реЗрдХ рд╕рдВрднрд╡ рд╣реИред

UPD1ред рдпрджрд┐ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ codepad.org рд╕реЗ рдХрдЪреНрдЪреЗ рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд▓рд╛рдЗрди рд╡рд░реНрдгреЛрдВ рдХреЗ рдЕрдВрдд рдХреЛ CRLF рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдореЗрдВ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдореЗрдВ рдбрд╛рд▓рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╛ рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкрд╛рда рдХреЛ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдбрд╛рд▓реЗрдВ, рдпрд╛ рдЗрд╕реЗ dos2unix рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВред

UPD2ред рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рдореБрдЦ рд░рд┐рд╡рд░реНрд╕ рдЖрдВрджреЛрд▓рди рдХреЛ рджрдмрд╛рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдирд┐рдпрдо рдЕрд▓рдЧ рд╣реИрдВред рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЬрд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдкреИрдЪ tzlom habrayuzer http://codepad.org/slUUrueq рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In122029/


All Articles