Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.19 KB | None | 0 0
  1. document.addEventListener('DOMContentLoaded', () => {
  2. let cross = {};
  3. let circle = {};
  4.  
  5. const createGameBoard = () => {
  6. let state = {
  7. currentPlayer: cross,
  8. grid: [],
  9. listeners: new Set()
  10. };
  11.  
  12. for (let i = 0; i < 9; i++) {
  13. state.grid.push(null);
  14. }
  15.  
  16. const play = (line, column) => {
  17. if (state.grid[line * 3 + column] !== null) return;
  18.  
  19. let currentPlayer = state.currentPlayer;
  20. state.grid[line * 3 + column] = currentPlayer;
  21. state.currentPlayer = currentPlayer === cross ? circle : cross;
  22.  
  23. state.listeners.forEach(l => {
  24. l({ line, column, player: currentPlayer });
  25. });
  26.  
  27. };
  28.  
  29. const getSquareAt = (line, column) => state.grid[line * 3 + column];
  30.  
  31. const addEventListener = listener => {
  32. state.listeners.add(listener);
  33. };
  34.  
  35. const checkWin = () =>{
  36. for(let i=0;i<state.grid.length;i++){
  37.  
  38. if(state.grid[i] === cross && state.grid[i+1] === cross && state.grid[i+2] === cross){
  39. return true
  40. }
  41. else if (state.grid[i] === circle && state.grid[i+1] === circle && state.grid[i+2] === circle){
  42. return true
  43. }
  44. else if(state.grid[i] === cross && state.grid[i+3]===cross && state.grid[i+6] === cross){
  45. return true
  46. }
  47. else if(state.grid[i] === circle && state.grid[i+3]===circle && state.grid[i+6] === circle){
  48. return true
  49. }
  50. else if(state.grid[i+2] === cross && state.grid[i+5]===cross && state.grid[i+8] === cross){
  51. return true
  52. }
  53. else if(state.grid[i+2] === circle && state.grid[i+5]===circle && state.grid[i+8] === circle){
  54. return true
  55. }
  56. else if(state.grid[i] === cross && state.grid[i+4]===cross && state.grid[i+8] === cross){
  57. return true
  58. }
  59. else if(state.grid[i] === circle && state.grid[i+4]===circle && state.grid[i+8] === circle){
  60. return true
  61. }
  62. }
  63. return false;
  64. }
  65. const removeEventListener = listener => {
  66. state.listeners.delete(listener);
  67. };
  68.  
  69. return {
  70. play,
  71. getSquareAt,
  72. addEventListener,
  73. checkWin
  74. }
  75. };
  76.  
  77. let gameBoard = createGameBoard();
  78.  
  79. const appendSeparatorDiv = element => {
  80. let separatorDiv = document.createElement('div');
  81. separatorDiv.innerHTML = '+-+-+-+';
  82. element.appendChild(separatorDiv);
  83. };
  84.  
  85. let gameBoardDiv = document.createElement('div');
  86. gameBoardDiv.setAttribute('style', 'font-family: monospace;');
  87. appendSeparatorDiv(gameBoardDiv);
  88.  
  89. let colSpans = [];
  90. for (let line = 0; line < 3; line++) {
  91. let lineDiv = document.createElement('div');
  92. lineDiv.appendChild(document.createTextNode('|'));
  93.  
  94. for (let column = 0; column < 3; column++) {
  95. let square = gameBoard.getSquareAt(line, column);
  96.  
  97. let colSpan = document.createElement('span');
  98. if (square === cross) colSpan.innerHTML = 'X';
  99. else if (square === circle) colSpan.innerHTML = 'O';
  100. else colSpan.innerHTML = '&nbsp;';
  101.  
  102. colSpan.addEventListener('click', () => {
  103. gameBoard.play(line, column);
  104. if (gameBoard.checkWin()){
  105. let win = document.createElement('div');
  106. win.innerHTML = '<h1>YOU WIN</h1>';
  107. appDiv.appendChild(win);
  108.  
  109. }
  110. });
  111.  
  112. colSpans.push(colSpan);
  113.  
  114. lineDiv.appendChild(colSpan);
  115. lineDiv.appendChild(document.createTextNode('|'));
  116. }
  117.  
  118. gameBoardDiv.appendChild(lineDiv);
  119. appendSeparatorDiv(gameBoardDiv);
  120. }
  121.  
  122. let appDiv = document.getElementById('app');
  123. appDiv.appendChild(gameBoardDiv);
  124.  
  125. gameBoard.addEventListener(e => {
  126. let colSpan = colSpans[e.line * 3 + e.column];
  127. if (e.player === cross) colSpan.innerText = 'X';
  128. else if (e.player === circle) colSpan.innerText = 'O';
  129. });
  130.  
  131. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement