Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | const { Machine, actions, State } = require('xstate'); console.log(State); const isValidMove = (ctx, e) => { return ctx.board[e.value] === null; }; function checkWin(ctx) { const { board } = ctx; const winningLines = [ [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 line of winningLines) { const xWon = line.every(index => { return board[index] === 'x'; }); if (xWon) { return true; } const oWon = line.every(index => { return board[index] === 'o'; }); if (oWon) { return true; } } } function checkDraw(ctx) { return ctx.moves === 9; } const ticTacToeMachine = Machine( { initial: 'playing', states: { playing: { on: { '': [ { target: 'winner', cond: 'checkWin' }, { target: 'draw', cond: 'checkDraw' } ], PLAY: [ { target: 'playing', cond: 'isValidMove', actions: ['updateBoard'] } ] } }, winner: { onEntry: ['setWinner'] }, draw: {} } }, { actions: { updateBoard: actions.assign({ board: (ctx, e) => { const newBoard = [...ctx.board]; newBoard[e.value] = ctx.player; return newBoard; }, moves: ctx => ctx.moves + 1, player: ctx => (ctx.player === 'x' ? 'o' : 'x') }), setWinner: actions.assign({ winner: ctx => (ctx.player === 'x' ? 'o' : 'x') }) }, guards: { checkWin, checkDraw, isValidMove } }, { board: Array(9).fill(null), moves: 0, player: 'x', winner: undefined } ); module.exports = { ticTacToeMachine }; |