рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 0: рддреБрд▓рдирд╛ рд╕реЗрд╡реЗрд▓реНрдЯ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛

рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 0: рддреБрд▓рдирд╛ рд╕реЗрд╡реЗрд▓реНрдЯ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 1: рд╕реНрд╡реЗрд▓реЗрдЯ рдФрд░ рдХреИрдирд╡рд╕ 2 рдбреА
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 2: рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ / рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА, рднрд╛рдЧ 3: рдХрдорд╛рдВрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рд╕рд╛рде рдкреВрд░реНрд╡рд╡рдд рдХрд░реЗрдВ / рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВ
рдЯрд┐рдХ рдЯреАрдПрд╕реА рдХреЛ рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рднрд╛рдЧ 4: HTTP рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлреНрд▓рд╛рд╕реНрдХ рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд

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


рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЛрдб рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕реНрд╡реЗрд▓реЗрдЯ


App.svelte
<script> import Board from './Board.svelte'; </script> <div class="game"> <div class="game-board"> <Board /> </div> <div class="game-info"> <div></div> <ol></ol> </div> </div> <style> .game { font: 14px "Century Gothic", Futura, sans-serif; margin: 20px; display: flex; flex-direction: row; } .game-info { margin-left: 20px; } ol { padding-left: 30px; } </style> 

Board.svelte
 <script> import Square from './Square.svelte'; </script> <div class="status">Next player: X</div> <div class="board"> {#each Array(9) as square} <Square /> {/each} </div> <style> .board { width: 102px; } .status { margin-bottom: 10px; } </style> 

Square.svelte
 <button></button> <style> button { background: #fff; border: 1px solid #999; float: left; font-size: 24px; font-weight: bold; line-height: 34px; height: 34px; margin-right: -1px; margin-top: -1px; margin-bottom: -1px; padding: 0; text-align: center; width: 34px; } button:focus { outline: none; } </style> 

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


рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдЬрд░рд┐рдП рдбрд╛рдЯрд╛ рдкрд╛рд╕ рдХрд░рдирд╛

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕реНрд╡реЗрд▓реЗрдЯ
рд╕реНрдХреНрд╡рд╛рдпрд░ рдПрдХ рдореВрд▓реНрдп рд╕рдВрдкрддреНрддрд┐ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ ред


 <script> export let value = ''; </script> <button>{value}</button> 

рдмреЛрд░реНрдб рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рдЖрдмрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред


 <div class="board"> {#each Array(9) as square, i} <Square value={i}/> {/each} </div> 

рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдШрдЯрдХ рдмрдирд╛рдирд╛

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕реНрд╡реЗрд▓реЗрдЯ
рд╕реЗрд▓ рдореЗрдВ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рдПрдХ рдХреНрд░реЙрд╕ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред рд╕реНрдХреНрд╡рд╛рдпрд░ рдиреЗ рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдХреЗ рд▓рд┐рдП DOM рд╣реИрдВрдбрд▓рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рд╛ред рдПрдХ рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдХреНрд░реЙрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╛рдЬреНрдп рдЪрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред


 <script> export let value = ''; let state = ''; function handleClick() { state = 'X'; } </script> <button on:click={handleClick}> {state} </button> 

рдЙрдард╛рдиреЗ рдХреА рдЕрд╡рд╕реНрдерд╛

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕реНрд╡реЗрд▓реЗрдЯ
рдЙрд╕ рдХреНрд╖рдг рддрдХ, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдЙрдирдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдереАред рдЕрдм рдЦреЗрд▓ рд░рд╛рдЬреНрдп рдХрд╛ рднрдВрдбрд╛рд░рдг рдмреЛрд░реНрдб рдШрдЯрдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рднреА рдХрдХреНрд╖реЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╣реИрдВрдбрд▓ рд╣реИрдВрдбрд▓рд░ рдХреНрд▓рд┐рдХрдХреНрд▓рд┐рдХ рдХреЛ рднреА рдмреЛрд░реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╕реНрдХреНрд╡рд╛рдпрд░ рдЕрдм рд╡реИрд▓реНрдпреВ рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рд╕реЗрд▓ рд╕реНрдЯреЗрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред


Board.svelte
 <script> import Square from './Square.svelte'; let state = { squares: Array(9).fill(''), }; function handleClick(i) { const squares = state.squares.slice(); squares[i] = 'X'; state.squares = squares; } </script> <div class="status">Next player: X</div> <div class="board"> {#each state.squares as value, i} <Square {value} on:click={e => handleClick(i)}/> {/each} </div> 

Square.svelte
 <script> export let value = ''; </script> <button on:click> {value} </button> 

рдХрд░рд╡рдЯ рд▓реЗрдирд╛

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕реНрд╡реЗрд▓реЗрдЯ
рдХреНрд░реЙрд╕ рдХреЗ рдмрд╛рдж рдкреИрд░ рдХреА рдЕрдВрдЧреБрд▓реА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЬреЛрдбрд╝рд╛ред


Board.svelte
 <script> import Square from './Square.svelte'; let state = { squares: Array(9).fill(''), xIsNext: true, }; function handleClick(i) { const squares = state.squares.slice(); squares[i] = state.xIsNext ? 'X' : 'O'; state.squares = squares; state.xIsNext = !state.xIsNext; } </script> <div class="status">Next player: {state.xIsNext ? 'X' : 'O'}</div> <div class="board"> {#each state.squares as value, i} <Square {value} on:click={e => handleClick(i)}/> {/each} </div> 

рд╡рд┐рдЬреЗрддрд╛ рдШреЛрд╖рд┐рдд рдХрд░рдирд╛

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕реНрд╡реЗрд▓реЗрдЯ
рдПрдХ рдЕрд▓рдЧ рдлрд╝рд╛рдЗрд▓ рд╕рд╣рд╛рдпрдХ рдореЗрдВ рд╡рд┐рдЬреЗрддрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рдиред рдЬреАрдд рдХреЗ рдмрд╛рдж рдкрд╣рд▓реЗ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдирд╛ рдордирд╛ рд╣реИред


heplers.js
 export function calculateWinner(squares) { const lines = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6], ]; for (let i = 0; i < lines.length; i++) { const [a, b, c] = lines[i]; if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) { return squares[a]; } } return null; } 

Board.svelte
 <script> import Square from './Square.svelte'; import { calculateWinner } from './helpers.js'; let state = { squares: Array(9).fill(''), xIsNext: true, }; $: winner = calculateWinner(state.squares); function handleClick(i) { if (winner || state.squares[i]) return; const squares = state.squares.slice(); squares[i] = state.xIsNext ? 'X' : 'O'; state.squares = squares; state.xIsNext = !state.xIsNext; } </script> <div class="status"> {#if winner} <b>Winner: {winner}</b> {:else} Next player: {state.xIsNext ? 'X' : 'O'} {/if} </div> <div class="board"> {#each state.squares as value, i} <Square {value} on:click={e => handleClick(i)} /> {/each} </div> 

рдореИрдВ рдЕрдм рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдореИрдВ рдврд╛рдВрдЪреЗ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реВрдВред


рдЧрд┐рдЯрд╣рдм рднрдВрдбрд╛рд░

https://github.com/nomhoi/tic-tac-toe


рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЧреЗрдо рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛:


 git clone git@github.com:nomhoi/tic-tac-toe.git cd tic-tac-toe npm install npm run dev 

рд╣рдо рдкрддреЗ рдкрд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЧреЗрдо рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ: http: // localhost: 5000 / ред


рдЕрджреНрдпрддрди: рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлрд┐рдХреНрд╕реНрдб рд▓реЗрдЦ рдФрд░ рд╕реНрд░реЛрдд рдХреЛрдбред


UPDATE2: GitHub рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред

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


All Articles