All files / xstate/examples/src ticTacToeMachine.js

0% Statements 0/24
0% Branches 0/8
0% Functions 0/9
0% Lines 0/24

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 };