рдХреИрдирд╡рд╛рд╕ рдХрджрдо рд╕реЗ рдХрджрдо: рдкреЛрдВрдЧ

рдЖрдЬ рд╣рдо html5 рдХреИрдирд╡рд╛рд╕ рдЯреИрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЫреЛрдЯрд╛ рдкреЛрдВрдЧ рдЧреЗрдо рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдЬреЛ рд▓реЛрдЧ рдкреЛрд╕реНрдЯ рдирд╣реАрдВ рдкрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реЗ рддреБрд░рдВрдд PLAY рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдХреЛ рдорд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдкреЛрдВрдЧ рдЯреЗрдмрд▓ рдЯреЗрдирд┐рд╕ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд╣реИред рдкрд┐рдВрдЧ-рдкреЛрдВрдЧ рдмреЙрд▓ рдХреА рдЬрдЧрд╣ рдПрдХ рдЫреЛрдЯрд╛ рд╡рд░реНрдЧ рд░реИрдЦрд┐рдХ рдкрде рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдкрд░ рдЪрд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╡рд╣ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреА рдкрд░рд┐рдзрд┐ рдпрд╛ рдПрдХ рдЦреАрдВрдЪреА рдЧрдИ рджреМрдбрд╝ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкрд░ рдЪреЛрдЯ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЯрдХреНрдХрд░ рдХреЗ рдХреЛрдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрд╕рдХрд╛ рдкреНрд░рдХреНрд╖реЗрдкрд╡рдХреНрд░ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред
рдЧреЗрдордкреНрд▓реЗ рдпрд╣ рд╣реИ рдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреА рд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд░реИрдХреЗрдЯ рдХреЛ рдЦрдбрд╝реА рдХрд░рдХреЗ рдЪрд▓рддреЗ рд╣реИрдВред рдПрдХ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдПрдХ рдмрд┐рдВрджреБ рдорд┐рд▓рддрд╛ рд╣реИ рдпрджрд┐ рд╡рд╣ рдПрдХ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреЗ рд░реИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдВрдж рднреЗрдЬрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ ...

рд╣рдо рдЦреЗрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдЗрд╕реЗ рдорд╛рдЙрд╕ рд╕реЗ рдЦреЗрд▓рд╛ рдЬрд╛ рд╕рдХреЗ, рдФрд░ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреЛ рдХрдВрдкреНрдпреВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЗрд╕рдХреА рдкреВрд░реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП, рдореВрд▓ рдмрд╛рддреЗрдВ рдмрддрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреЛрд╕реНрдЯ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред

рд╣рдорд╛рд░реЗ рдореЗрдЧрд╛рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХреНрд░рдорд╢рдГ pong.htm рдФрд░ pong.js рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВрдЧреА, рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдмрдирд╛рдиреЗ рдФрд░ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
Html рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдордЧреНрд░реА:
< html >
< head >
< meta charset = "utf-8" >
< title > html5Pong < / title >
< script src = "pong.js" >< / script >
< / head >
< body >
<canvas id = "pong" > wtf?! < / canvas>
< script > init() < / script >
< / body >
< / html >

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЦреЗрд▓ рдХреЗ рд╕рднреА рдпрд╛рдВрддреНрд░рд┐рдХреА рдХреЛ pong.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╣рдо рдЕрдкрдиреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЦреЗрд▓ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ:
//
function init ( ) {
canvas = document. getElementById ( "pong" ) ;
canvas. width = 480 ; //
canvas. height = 320 ; //
context = canvas. getContext ( '2d' ) ;
draw ( ) ;
}
//
function draw ( ) {
context. fillStyle = "#000" ;
context. fillRect ( 0 , 0 , 480 , 320 ) ;
}
init ( ) ;

рдпрджрд┐ рдЖрдк рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рд╛рде html рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдХрд╛рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдорд╛рд░реЗ рдХреИрдирд╡рд╛рд╕ рдХреЛ рдХрд╛рд▓реЗ рд░рдВрдЧ рдореЗрдВ рдкреЗрдВрдЯ рдХрд░рддрд╛ рд╣реИред

рдЦреЗрд▓ рдХреА рд╡рд╕реНрддреБ


рдкреЛрдВрдЧ рдореЗрдВ рд╕рднреА рдЦреЗрд▓ рд╡рд╕реНрддреБрдПрдВ рдЖрдпрддрд╛рдХрд╛рд░ рд╣реИрдВ рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдПрдЧреАред рдЖрдЗрдП рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЖрдпрдд рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдВрдЧреЗ, рд╕рд╛рде рд╣реА рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рднреА рд╣реЛрдЧреА:
function rect ( color , x , y , width , height ) {
this . color = color ; //
this . x = x ; //
this . y = y ; //
this . width = width ; //
this . height = height ; //
this . draw = function ( ) //
{
context. fillStyle = this . color ;
context. fillRect ( this . x , this . y , this . width , this . height ) ;
}
}

рдЕрдм рдЦреЗрд▓ рдореИрджрд╛рди, рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдФрд░ "рдмреЙрд▓" рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдЬреЛрдбрд╝рдХрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрдВред
//
function init ( ) {
//
game = new rect ( "#000" , 0 , 0 , 480 , 320 ) ;
// -
ai = new rect ( "#fff" , 10 , game. height / 2 - 40 , 20 , 80 ) ;
player = new rect ( "#fff" , game. width - 30 , game. height / 2 - 40 , 20 , 80 ) ;
//
ai. scores = 0 ;
player. scores = 0 ;
// ""
ball = new rect ( "#fff" , 40 , game. height / 2 - 10 , 20 , 20 ) ;
canvas = document. getElementById ( "pong" ) ;
canvas. width = game. width ;
canvas. height = game. height ;
context = canvas. getContext ( "2d" ) ;
draw ( ) ;
}
//
function draw ( ) {
game. draw ( ) ; //
//
context. font = 'bold 128px courier' ;
context. textAlign = 'center' ;
context. textBaseline = 'top' ;
context. fillStyle = '#ccc' ;
context. fillText ( ai. scores , 100 , 0 ) ;
context. fillText ( player. scores , game. width - 100 , 0 ) ;
for ( var i = 10 ; i < game. height ; i += 45 ) //
{
context. fillStyle = "#ccc" ;
context. fillRect ( game. width / 2 - 10 , i , 20 , 30 ) ;
}
ai. draw ( ) ; //
player. draw ( ) ; //
ball. draw ( ) ; //
}

рдпрджрд┐ рдЖрдк рдЕрдм рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдорд╛рд░реЗ рдЧреЗрдо рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЬреАрд╡рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ


рдмреЗрд╢рдХ, рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдерд┐рд░ рддрд╕реНрд╡реАрд░ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рддреЛ рдЕрдм рд╣рдо рдЧреЗрдВрдж рдХреЛ "рдкреБрдирд░реНрдЬреАрд╡рд┐рдд" рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдкреНрд▓реЗ () рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдбреНрд░реЙ () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдПрдХ рдЯрд╛рдЗрдорд░ (рдЕрд░реНрдерд╛рддреН 1000/50) рд╕реЗрдЯ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрдирд┐рдЯ () рд╕реЗ рдЦреЗрд▓реЗрдВрдЧреЗред рд╣рдо рдХреИрдирд╡рд╛рд╕ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реБрдП рдорд╛рдЙрд╕ рдХреЗ рд╕рдордиреНрд╡рдп рдХреЗ рд▓рд┐рдП рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдмрд╛рдВрдзрддреЗ рд╣реИрдВред рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐рдП рдЬрд╛рдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдХрд┐ рдорд╛рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдЕрдиреНрдп рдЦреБрд╢рд┐рдпрд╛рдБред рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рднреНрд░рдорд┐рдд рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдкреВрд░реЗ pong.js рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдХреЛрдб рдЬреЛ рд╣рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
//
function rect ( color , x , y , width , height ) {
this . color = color ;
this . x = x ;
this . y = y ;
this . width = width ;
this . height = height ;
this . draw = function ( ) {
context. fillStyle = this . color ;
context. fillRect ( this . x , this . y , this . width , this . height ) ;
} ;
}
//
function playerMove ( e ) {
var y = e. pageY ;
if ( player. height / 2 + 10 < y && y < game.height - player.height / 2 - 10 ) {
player. y = y - player. height / 2 ;
}
}
//
function draw ( ) {
game. draw ( ) ; //
//
context. font = 'bold 128px courier' ;
context. textAlign = 'center' ;
context. textBaseline = 'top' ;
context. fillStyle = '#ccc' ;
context. fillText ( ai. scores , 100 , 0 ) ;
context. fillText ( player. scores , game. width - 100 , 0 ) ;
for ( var i = 10 ; i < game. height ; i += 45 )
//
{
context. fillStyle = "#ccc" ;
context. fillRect ( game. width / 2 - 10 , i , 20 , 30 ) ;
}
ai. draw ( ) ; //
player. draw ( ) ; //
ball. draw ( ) ; //
}
//
function update ( ) {
//
ball. x += ball. vX ;
ball. y += ball. vY ;

}
function play ( ) {
draw ( ) ; //
update ( ) ; //
}
//
function init ( ) {
//
game = new rect ( "#000" , 0 , 0 , 480 , 320 ) ;
// -
ai = new rect ( "#fff" , 10 , game. height / 2 - 40 , 20 , 80 ) ;
player = new rect ( "#fff" , game. width - 30 , game. height / 2 - 40 , 20 , 80 ) ;
//
ai. scores = 0 ;
player. scores = 0 ;
// ""
ball = new rect ( "#fff" , 40 , game. height / 2 - 10 , 20 , 20 ) ;
//
ball. vX = 2 ; //
ball. vY = 2 ; //
canvas = document. getElementById ( "pong" ) ;
canvas. width = game. width ;
canvas. height = game. height ;
context = canvas. getContext ( "2d" ) ;
canvas. onmousemove = playerMove ;
setInterval ( play , 1000 / 50 ) ;
}


рдЦреЗрд▓ рдЭрдбрд╝рдк


рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдЕрдм рд╢реБрд░реВ рд╣реЛрдЧреА, рд╣рдореЗрдВ рдЧреЗрдВрдж рдХреЛ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рд╕реЗ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдЙрдбрд╝рдиреЗ рдХреА рд╢рд┐рдХреНрд╖рд╛ рджреЗрдирд╛ рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рд░реИрдХреЗрдЯ рдХреЛ рднреА рдЫреВрдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рджреЛ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдЫреВрдиреЗ рдкрд░ рдЕрд╕рд▓реА рд╡реИрд▓реНрдпреВ рджреЗрддрд╛ рд╣реИред рдиреАрдЪреЗ рдЙрд╕рдХрд╛ рдХреЛрдб рд╣реИ
function collision ( objA , objB ) {
if ( objA. x + objA. width > objB. x &&
objA. x < objB. x + objB. width &&
objA. y + objA. height > objB. y &&
objA. y < objB. y + objB. height ) {
return true ;
}
else {
return false ;
}
}

рдЕрдм, рддрд╛рдХрд┐ рдЧреЗрдВрдж рдХреЗрд╡рд▓ рдЦреЗрд▓ рдХреЗ рдореИрджрд╛рди рдХреЗ рдмрд╛рд╣рд░ рди рдЙрдбрд╝ рдЬрд╛рдП, рд╣рдореЗрдВ рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреН
function update ( ) {
//
//
if ( ball. y < 0 || ball. y + ball. height > game. height ) {
//
ball. vY = - ball. vY ;
}
//
if ( ball. x < 0 ) {
//
ball. vX = - ball. vX ;
player. scores ++;
}
if ( ball. x + ball. width > game. width ) {
//
ball. vX = - ball. vX ;
ai. scores ++;
}
//
if ( ( collision ( ai , ball ) && ball. vX < 0 ) || ( collision ( player , ball ) && ball. vX > 0 ) ) {
ball. vX = - ball. vX ;
}
//
ball. x += ball. vX ;
ball. y += ball. vY ;
}

рдЕрдм рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЛ рдЦреЗрд▓рдирд╛ рд▓рдЧрднрдЧ рд╕рдВрднрд╡ рд╣реИ, рдЧреЗрдВрдж рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЙрдбрд╝рддреА рд╣реИ, рд░реИрдХреЗрдЯ рдЗрд╕реЗ рд╣рд░рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреЗ рдкрд╛рд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╢рд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде

function aiMove ( ) {
var y ;
//
var vY = Math. abs ( ball. vY ) - 2 ;
if ( ball. y < ai. y + ai. height / 2 ) {
y = ai. y - vY ;
}
else {
y = ai. y + vY ;
}
if ( 10 < y && y < game. height - ai. height - 10 ) {
ai. y = y ;
}
}

рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд░рд┐рдгрд╛рдо


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

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


All Articles