рд╣рдо рдПрдХ рдСрдирд▓рд╛рдЗрди рдЧреЗрдо рднрд╛рдЧ 2 рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдмрдЧ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рдирдорд╕реНрдХрд╛рд░% рд╣рдмреНрд░рдирд╛рдо%!




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

рддреЛ рдареАрдХ рд╣реИ! рд╣рдо рдмрдЧреНрд╕ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдорд╛рдВрдЧреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдЧреЗрдо рдмрдирд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдмреНрд▓реЙрдЧ рдХреЗ рд╡рд┐рд╖рдп рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рд╣реБрдП рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рддрдХрдиреАрдХреА рдореБрджреНрджреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд┐рд╖рдп рдореЗрдВ рдкрд╣рд▓рд╛ рд╕рдВрджреЗрд╢ habravchanin Assargin рдХреА рдкрд╣рд▓реА рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдереА :
рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ - рдореИрдВ рдЗрд╕реЗ рд▓рдЧрд╛рддрд╛рд░ 5-6 рдмрд╛рд░ рджрдмрд╛рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реВрдВ рдЬрдмрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдФрд░ / рдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкрд╣рд▓реА рдЪрд╛рд▓ рдХреЗ рдмрд╛рдж рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЬреАрдд рдЬрд╛рддрд╛ рд╣реИ! рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдореМрдХрд╛ рдирд╣реАрдВ рд╣реИ! :)
рдФрд░ рдпрд╣ рдПрдлрдПрдл 3.6.24 рдФрд░ рдХреНрд░реЛрдо 15.0.874.106 рдореЗрдВ рджреЛрдиреЛрдВ рд╣реИ

рдФрд░ рдореЛрд░реНрдлреА рд╕реЗ рдЙрд╕рдХреЗ рдмрд╛рдж:
рдРрд╕рд╛ рдХреИрд╕реЗ?


рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рдПрдХ рджреЛрд╣рд░реЗ рдХрджрдо рдХреЗ рд╕рд╛рде рдЗрд╕ рдХреНрд╖рдг рдХреЛ рдпрд╛рдж рдХрд┐рдпрд╛, рдареАрдХ рд╣реИ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдЦреЗрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХрд╛ рд▓рдХреНрд╖реНрдп рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рдирд╛ рдерд╛ред рджреВрд╕рд░реА рдУрд░, рд╕рддреНрдпрд╛рдкрди рдХреЗрд╡рд▓ рдЙрд╕ рдЧреНрд░рд╛рд╣рдХ рдкрд░ рдерд╛ рдЬреЛ рдЪрд▓ рд░рд╣рд╛ рд╣реИред рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред

рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдкрд░ рдХреМрди рдЬрд╛рддрд╛ рд╣реИ


рд╣рдо рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЧреЗрдо рдореЙрдбреНрдпреВрд▓ / tictactoe.js рдХреЗ рджрд┐рд▓ рдХреЗ рд╕рд╛рде рдЦреЛрд▓рддреЗ рд╣реИрдВ, рдЗрд╕ рдореВрд╡ рдлрдВрдХреНрд╢рди рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЧреЗрдо рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ:
GameItem.prototype.step = function(x, y, user, cb) { if(this.board[x + 'x' + y] !== undefined) return; //    "      ",   <hh user="theshock"></hh>     ! this.board[x + 'x' + y] = this.getTurn(user); this.steps++; cb(this.checkWinner(x, y, this.getTurn(user)), this.getTurn(user)); } 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЪрд╛рд▓ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп, рд╣рдордиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдлрд╝реАрд▓реНрдб рдЕрдзрд┐рднреЛрдЧ рдХреЗ рд▓рд┐рдП рдЪреЗрдХ рдХрд┐рдпрд╛ рдерд╛, рдЕрдм рд╣рдореЗрдВ рдХрд┐рд╕рдХреА рдЪрд╛рд▓ рдкрд░ рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рд╣рдо рдЦреЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдИ рд╕рдВрдкрддреНрддрд┐ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕реЗ рдЯрд░реНрди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ:
 var GameItem = function(user, opponent, x, y, stepsToWin) { ... //   this.turn = 'X'; //      , ..         . } 

рдХрджрдо рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЪреЗрдХ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдкреНрд░рддрд┐рджреНрд╡рдВрджреНрд╡реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ:
 GameItem.prototype.step = function(x, y, user, cb) { if(this.board[x + 'x' + y] !== undefined || this.getTurn(user) != this.turn) return; //      turn       this.board[x + 'x' + y] = this.getTurn(user); this.turn = (user != this.user ? 'X' : 'O'); //       this.steps++; cb(this.checkWinner(x, y, this.getTurn(user)), this.getTurn(user)); } 

рдпрд╣ рдкрд╣рд▓рд╛ рдмрдЧ рдкреНрд░реЛрдлрд╛рдЗрд▓ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдореЙрд░реА рд╕реНрдХреНрд░реАрди рджреЗрдЦреА, рддреЛ рдпреВрдЖрдИ рдореЗрдВ рдПрдХ рдмрдЧ рдиреЗ рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛ рдЬрд┐рд╕рдиреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ 3 рдмрд╛рд░ рдпрд╣ рдХрд╣рддрд╛ рд╣реИ "рдЖрдк рдЦреЗрд▓рддреЗ рд╣реИрдВ: рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА"ред рдЦреЗрд▓ рдХреЗ рдбрд┐рдмрдЧ рдиреЗ рдХрд╣рд╛ рдХрд┐ рдЦреЗрд▓ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реЙрдХреЗрдЯ.рдЖрдИрдУ рдореЗрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЧреЗрдо рд░реВрдо рд╕реЗ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЙрд╕реЗ рдирдП рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдЖрдо рдХрдорд░реЗ рдореЗрдВ рд▓рд╛рддреЗ рд╣реИрдВред рдФрд░ рдЗрд╕ рддрд░рд╣ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирдП рдЧреЗрдо рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдмрдЯрди "рдирдпрд╛ рдЧреЗрдо" рджрдмрд╛рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЖрд╕рд╛рдиреА рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рд╣рдо рдПрдХ рдмрдЯрди рдХреЗ рдХреНрд▓рд┐рдХ рдкрд░ рдЦреЗрд▓ рдореЗрдВ рдПрдХ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ рдЕрдм рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВред

рдЧреЗрдо рдХрд╛ рдЕрдВрдд рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдирдП рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд┐рдП рдмрд┐рдирд╛


рд╣рдо рдЕрдкрдиреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ tictactoe.js рдХреЛ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ рдФрд░ рдмрдЯрди рдкрд░ рдЧреЗрдо рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдШрдЯрдирд╛ рдореЗрдВ рдПрдХ рдХреЙрд▓ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдкреГрд╖реНрда рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ:
 $('#reload').hide().button({icons:{primary:'ui-icon-refresh'}}).click(function() { $('#reload').off('click').click(function(){window.location.reload();}); socket.emit('start'); }); 

рдФрд░ index.js рдХреЗ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ рд╣рдо рдЧреЗрдо рдХреЛ рдПрдХ рдЕрд▓рдЧ рдИрд╡реЗрдВрдЯ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрдВрдХреНрд╢рди рд▓реЗрддреЗ рд╣реИрдВ:
 socket.on('start', function () { if(Game.users[socket.id] !== undefined) return; //    ,         Game.start(socket.id.toString(), function(start, gameId, opponent, x, y){ ... }); }); 

рдЕрдм рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдЦреБрдж рдирдпрд╛ рдЧреЗрдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдкреНрд░рдЧрддрд┐ рдХрд╛ рд╕рдордп рд╕рдорд╛рдкреНрдд


рдХрдИ рд▓реЛрдЧ рд╢рд┐рдХрд╛рдпрдд рдХрд░рдиреЗ рд▓рдЧреЗ рдХрд┐ рдХреЛрдИ рднреА рдирд╣реАрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдмреБрд░рд╛рдИ рдереА, рд╢рд╛рдпрдж рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдЬреЛ рдЦреЗрд▓ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕реЗ рдереЗ, рд╡реЗ рдмрд╕ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддреЗ рдереЗ рдФрд░ рдЦреЗрд▓ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдЦреБрд▓рд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЗрд╡рдирдЧрд╛рд░реНрдб рдХреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЖрдЗрдП рдЕрдкрдиреА рдХреНрд▓рд╛рдЗрдВрдЯ рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдкрд╣рд▓реЗ / рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ / titactoe.js рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд╣рд▓реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдПрдХ рдирдпрд╛ рд╡реЗрд░рд┐рдПрдмрд▓ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдорд╛рд╕реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рдерд╛:
 var TicTacToe = { gameId: null, turn: null, i: false, socket: null, interval: null, //  ... mask: function(state) { var mask = $('#masked'), board = $('#board-table'); clearInterval(this.interval); $('#timer').html(15); this.interval = setInterval(function(){ var i = parseInt($('#timer').html()); i--; $('#timer').html(i); }, 1000); if(state) { mask.show(); var p = board.position(); mask.css({ width: board.width(), height: board.height(), left: p.left, top: p.top }); } else { mask.hide(); } }, 

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

рд╕рд░реНрд╡рд░ рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ EventEmitter рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВ


рдЕрдм рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╣рдореЗрдВ рдЯрд╛рдЗрдорд░ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╡рд╛рдВрдЫрд┐рдд рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЧреЗрдо рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдФрд░ рдмрдврд╝рд╛рдПрдВрдЧреЗред рд▓реЗрдХрд┐рди, рдореИрдВрдиреЗ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рд╢реИрдХреНрд╖рд┐рдХ рд╕рд╛рдордЧреНрд░реА рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВрдЧреЗ рдХрд┐ NodeJS рдореЗрдВ рдХреМрди-рдХреМрди рд╕реА рдШрдЯрдирд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ, рдпрд╛ рдлрд┐рд░ EventEmitter рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдиреЛрдбрдЬ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдИрд╡реЗрдВрдЯ рдореЙрдбреНрдпреВрд▓ рд╣реИред
рдореЙрдбрд▓ / tictactoe.js рдлрд╝рд╛рдЗрд▓ рдХреА рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рдПрдХ EventEmitter рдФрд░ Util рдХрдиреЗрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдмрд╛рдж рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдореИрдВ рдереЛрдбрд╝рд╛ рдмрд╛рдж рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред
 var util = require('util'), EventEmitter = require("events").EventEmitter; 

рдЗрд╕ рдХреЙрд▓ рдореЗрдВ, рд╣рдо рди рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдирдпрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдмрдирд╛рддреЗ рд╣реИрдВред

рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдмрд┐рдЯ

рдЪреВрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ EventEmitter рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╣рд╛рдВ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВрдЧреЗ, рдЬрдмрдХрд┐ рдиреЛрдбрдЬ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд╕рднреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреИрд╢ рдХреА рдЧрдИ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рджреЛрд╣рд░рд╛рдпрд╛ рдХреЙрд▓ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕реЗ рдЬреБрдбрд╝реЗ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рд╣реИред EventEmitter рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдПрдХ рдЗрд╡реЗрдВрдЯ рдорд╢реАрди рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рд╕рд╛рдзрд╛рд░рдг рд╢рдмреНрджреЛрдВ рдореЗрдВ рдпрд╣ рдЗрд╡реЗрдВрдЯ рдХреЙрд▓ рдХреА рдПрдХ рддрд░рд╣ рдХреА рдореЙрдирд┐рдЯрд░рд┐рдВрдЧ рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдлреЛрдХрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╡рд╛рдкрд╕ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдПрдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдЙрдкрдпреЛрдЧ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдХреЗрд╡рд▓ TicTacToe рдФрд░ GameItem рдХреЗ рд▓рд┐рдП рдПрдХ рдИрд╡реЗрдВрдЯрдореАрдЯрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ :
 var TicTacToe = module.exports = function() { //   EventEmitter.call(this); ... } util.inherits(TicTacToe, EventEmitter); var GameItem = function(user, opponent, x, y, stepsToWin) { //   EventEmitter.call(this); ... } util.inherits(GameItem, EventEmitter); 

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

ID рдЯрд╛рдЗрдорд░, рд╕рд╛рде рд╣реА рд╣рдорд╛рд░реЗ GameItem рдореЗрдВ рд╣рдорд╛рд░рд╛ рдкрд╣рд▓рд╛ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:
 var GameItem = function(user, opponent, x, y, stepsToWin) { ... //   this.timeout = null; //   this.on('timer', function(state, user) { if(state == 'stop') { //   clearTimeout(this.timeout); this.timeout = null; } else { //   var game = this; this.timeout = setTimeout(function() { //  ,    game.emit('timeout', user); }, 15000); } }); 

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ, GameItem рдореЗрдВ рдЕрднреА рддрдХ рдХреЛрдИ рдЯрд╛рдЗрдордЖрдЙрдЯ рдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЗрд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ рдФрд░ рд╣рдо рдЗрд╕реЗ index.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рд╣рдо рд╡рд╣рд╛рдБ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ рдореИрдВ рдХреЛрдб рдХреЗ рдмрд╛рдж рд╕рдордЭрд╛рдКрдВрдЧрд╛:
 socket.on('start', function () { if(Game.users[socket.id] !== undefined) return; Game.start(socket.id.toString(), function(start, gameId, opponent, x, y){ if(start) { //      timeout Game.games[gameId].on('timeout', function(user) { Game.end(user, function(gameId, opponent, turn) { io.sockets.in(gameId).emit('timeout', turn); closeRoom(gameId, opponent); //    }); }); ... }); }); 

рд╣рдордиреЗ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ 2 рд▓реЗрдпрд░реНрд╕ рдХреЛ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд▓рд╛, рдЬрд╣рд╛рдВ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд╕рдм рдШрдЯрдирд╛ рдХреЗ рдЯреНрд░рд┐рдЧрд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдФрд░ рдЧреЗрдо рдСрдмреНрдЬреЗрдХреНрдЯ (TicTacToe) рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдПрдХ рдмрдЧ рдУрдкреЗрд░рд╛ рдореЗрдВ рдЯрд┐рдордЯрд┐рдорд╛ рдпрд╛ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде рдореЗрд░реА рдмреЗрд╡рдХреВрдл рдЧрд▓рддреА рдХреЗ рд╕рд╛рде

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ seriyPS рдиреЗ рд▓рд┐рдЦрд╛ рд╣реИ:
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрд┐рд╕рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдВрдХрдбрд╝реЗ рдЖрдкрдХреЗ "рдЦреЗрд▓" рдХреЛ 100 рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рднреЗрдЬрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдирд╛ рдХреЗ рд╕рд╛рде, UI рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдЦреЗрд▓рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ (рдФрд░ рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдирд╣реАрдВ)ред рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдбрд░рд╛рд╡рдирд╛ред

рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрд╣реБрдд рдкреЗрд╢реЗрд╡рд░ рд░реВрдк рд╕реЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рд╕рдВрдкрд░реНрдХ рдХрд┐рдпрд╛, рдЗрд╕рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ред рдореИрдВрдиреЗ рддреБрд░рдВрдд рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рдЧрд▓рддреА рд╣реИ, рдФрд░ рдЕрдм рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдпрд╣ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ
 io.sockets.on('connection', function (socket) { io.sockets.emit('stats', [ ' : ' + countGames, ' : ' + Object.keys(countPlayers).length, ' : ' + onlineGames, ' : ' + onlinePlayers ]); setInterval(function() { io.sockets.emit('stats', [ ' : ' + countGames, ' : ' + Object.keys(countPlayers).length, ' : ' + onlineGames, ' : ' + onlinePlayers ]); }, 5000); ... }); 

рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╣рд░ 5 рд╕реЗрдХрдВрдб рдореЗрдВ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЖрдВрдХрдбрд╝реЗ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, 50 рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдордп рдкрд░ 5 * 50 = 250 рдЖрдБрдХрдбрд╝реЗ рдЕрдиреБрд░реЛрдз рд╣рд░ 5 рд╕реЗрдХрдВрдб рдореЗрдВ рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬреЗ рдЧрдП рдереЗред рдРрд╕реА рдмрдЧрд┐рдпрд╛ред
рдФрд░ рдЖрдк рдЗрд╕реЗ рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рди рдШрдЯрдирд╛ рдХреА рд╕реАрдорд╛ рд╕реЗ рдмрд╛рд╣рд░ рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рдХреЛрдб рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 setInterval(function() { io.sockets.emit('stats', [ ' : ' + countGames, ' : ' + Object.keys(countPlayers).length, ' : ' + onlineGames, ' : ' + onlinePlayers ]); }, 5000); io.sockets.on('connection', function (socket) { io.sockets.emit('stats', [ ' : ' + countGames, ' : ' + Object.keys(countPlayers).length, ' : ' + onlineGames, ' : ' + onlinePlayers ]); ... }); 


рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ

рдЗрд╕ рдкрд░, рддреНрд░реБрдЯрд┐ рд╕реБрдзрд╛рд░ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдореИрдВрдиреЗ рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
Index.js рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рдореИрдВрдиреЗ рдЬреЛ рдкрд╣рд▓рд╛ рдХрд╛рдо рдХрд┐рдпрд╛, рд╡рд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХрдорд░реЛрдВ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдЗрд╕реЗ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рдЦрд╛:
 io.sockets.on('connection', function (socket) { ... function closeRoom(gameId, opponent) { socket.leave(gameId); io.sockets.socket(opponent).leave(gameId); } ... }); 


рдореИрдВрдиреЗ рдСрдирд▓рд╛рдЗрди рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдФрд░ рдЦреЗрд▓реЛрдВ рдХреЗ рдХрд╛рдЙрдВрдЯрд░реЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рд╣реИрдВ:
 var countGames = 0, countPlayers = [], Game = new TicTacToe(); ... io.sockets.emit('stats', [ ' : ' + countGames, ' : ' + Object.keys(countPlayers).length, ' : ' + Object.keys(Game.games).length, ' : ' + Object.keys(Game.users).length ]); 


рдЕрднреА рднреА рдмрд╣реБрдд рд╕реА рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдереАрдВ, рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд┐рдХрд▓рд╛ :)
рдЖрдк рд╕рднреА рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдЗрд╕ рд▓рд╛рдЗрди рдХреЗ рдкрд╣рд▓реЗ рд▓реЗрдЦ рд╕реЗ рдкрдврд╝рд╛!

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

рдкреБрдирд╢реНрдЪ: рдореИрдВ рдЗрд╕ рддрдереНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдорд╛рдВрдЧрддрд╛ рд╣реВрдВ рдХрд┐ 15 рд╡реАрдВ рд╢реБрд░реБрдЖрдд рддрдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдХреНрд░рд┐рдп рд▓рд┐рдВрдХ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдпреВрдПрдлрдУ рджреНрд╡рд╛рд░рд╛ рдЫрд┐рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ "рдкреЛрд╕реНрдЯреНрд╕ рдореЗрдВ рдкреЙрдХреЗрдЯ рдкрд┐рдХрд┐рдВрдЧ" рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ 7 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЪреВрдВрдХрд┐ рдкреНрд░рд╢рд╛рд╕рди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдореИрдВ рдмрд╕ рдЪреБрдк рд░рд╣реВрдВрдЧрд╛ред

рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП


рдЕрдм рдЖрдк рдЦреЗрд▓ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ "рдирдпрд╛ рдЦреЗрд▓" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
ivan.zhuravlev.name/game - рдЬреАрддрдиреЗ рдХреЗ рд▓рд┐рдП 4 рдЪрд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде 6x6 рдлрд╝реАрд▓реНрдб
ivan.zhuravlev.name/game3 - рдЬреАрддрдиреЗ рдХреЗ рд▓рд┐рдП 3 рдЪрд╛рд▓реЛрдВ рдХреЗ рд╕рд╛рде 3x3 рдлрд╝реАрд▓реНрдб

рд╕реНрд░реЛрдд рджреЗрдЦреЗрдВ: github.com/intech/TicTacToe
рдореИрдВрдиреЗ рдПрдХ рдХреЗ рд▓рд┐рдП рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП: github.com/intech/TicTacToe/commit/ff3c1d6e9e298a84ab660b52385c378f69f24f01

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


All Articles