Guest User

Untitled

a guest
Oct 30th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. const Gameboard = (() => {
  2.     // DOM
  3.     const boardTiles = document.querySelectorAll(".box");
  4.  
  5.     // Gameboard
  6.     const gameBoard = ["","","",
  7.                        "","","",
  8.                        "","",""];
  9.  
  10.     // Board functions
  11.     const boardRender = function() {
  12.         for (let i = 0; i < gameBoard.length; i++) {
  13.         boardTiles[i].textContent = gameBoard[i]
  14.         }
  15.     }
  16.     const updateBoard = (cell, symbol) => gameBoard[cell] = symbol;
  17.  
  18.     return {gameBoard, boardRender, updateBoard, boardTiles}
  19. })();
  20.  
  21. // Player Module
  22. const Player = (name, symbol) => {
  23.     return {name, symbol}
  24. }
  25.  
  26. // Game functionality
  27. const Game = (() => {
  28.     // DOM Elements
  29.     const player1 = Player("Player", "X");
  30.     const player2 = Player("Computer", "O");
  31.  
  32.     let winningCombo = [];
  33.     let gameOver = false;
  34.     const checkForWinner = () => {
  35.         if (Gameboard.gameBoard[0] === Gameboard.gameBoard[1] && Gameboard.gameBoard[0] === Gameboard.gameBoard[2] && Gameboard.gameBoard[0] !== "") {
  36.             winningCombo = [1, 2, 3];
  37.             gameOver = true;
  38.             return [1, 2, 3];
  39.         } else if (Gameboard.gameBoard[3] === Gameboard.gameBoard[4] && Gameboard.gameBoard[3] === Gameboard.gameBoard[5] && Gameboard.gameBoard[3] !== ""){
  40.             winningCombo = [3, 4, 5];
  41.             gameOver = true;
  42.             return [3, 4, 5];
  43.         } else if (Gameboard.gameBoard[6] === Gameboard.gameBoard[7] && Gameboard.gameBoard[6] === Gameboard.gameBoard[8] && Gameboard.gameBoard[6] !== "") {
  44.             winningCombo = [6, 7, 8];
  45.             gameOver = true;
  46.             return [6, 7, 8];
  47.         } else if (Gameboard.gameBoard[0] === Gameboard.gameBoard[4] && Gameboard.gameBoard[0] === Gameboard.gameBoard[8] && Gameboard.gameBoard[0] !== ""){
  48.             winningCombo = [0, 4, 8];
  49.             gameOver = true;
  50.             return [0, 4, 8];
  51.         } else if (Gameboard.gameBoard[2] === Gameboard.gameBoard[4] && Gameboard.gameBoard[2] === Gameboard.gameBoard[6] && Gameboard.gameBoard[2] !== ""){
  52.             winningCombo = [2, 4, 6];
  53.             gameOver = true;
  54.             return [2, 4, 6];
  55.         } else if (Gameboard.gameBoard[0] === Gameboard.gameBoard[3] && Gameboard.gameBoard[0] === Gameboard.gameBoard[6] && Gameboard.gameBoard[0] !== "") {
  56.             winningCombo = [0, 3, 6];
  57.             gameOver = true;
  58.             return [0, 3, 6];
  59.         } else if (Gameboard.gameBoard[1] === Gameboard.gameBoard[4] && Gameboard.gameBoard[1] === Gameboard.gameBoard[7] && Gameboard.gameBoard[1] !== "") {
  60.             winningCombo = [1, 4, 7];
  61.             gameOver = true;
  62.             return [1, 4, 7];
  63.         } else if (Gameboard.gameBoard[2] === Gameboard.gameBoard[5] && Gameboard.gameBoard[2] === Gameboard.gameBoard[8] && Gameboard.gameBoard[2] !== "") {
  64.             winningCombo = [2, 5, 8];
  65.             gameOver = true;
  66.             return [2, 5, 8];
  67.         } else {
  68.             gameOver = false;
  69.             return [];
  70.         }        
  71. }
  72.  
  73.     const checkTie = function() {
  74.         if (board.includes("")) {
  75.             return false;
  76.         } else if (!findWinner()){
  77.             return true;
  78.         }
  79.     }
  80.  
  81.     const winningPlayer = function() {
  82.         let winner = null;
  83.         let winLocation = checkForWinner();
  84.         let winMarker = Gameboard.gameBoard[winLocation[0]];
  85.         if (winMarker === "X") {
  86.             winner = "X";
  87.             return {score: -10}
  88.         } else if (winMarker === "O") {
  89.             winner = "O"
  90.             return {score: +10}
  91.         }
  92.         let openSpots = 0;
  93.         for (let i = 0; i < Gameboard.gameBoard.length; i++) {
  94.             if (Gameboard.gameBoard[i] === "") {
  95.                 openSpots++;
  96.             }
  97.         }
  98.         if (winner === null && openSpots === 0) {
  99.             winner = "tie";
  100.             return {score: 0}
  101.         } else {
  102.            return winner;
  103.         }
  104.  
  105.         return winner;
  106.     }
  107.    
  108.     let turn = 1;
  109.     const whosTurn = () => {
  110.         return (turn % 2 === 0) ? player2 : player1;
  111.     }
  112.     // Player move
  113.     // const move = (e) => {
  114.     //     if (!gameOver){}
  115.     //     let activePlayer = whosTurn();
  116.     //     if (activePlayer === player1) {
  117.     //         if (e.target.innerText === "") {
  118.     //             Gameboard.updateBoard(e.target.getAttribute("data-value"), player1.symbol)
  119.     //             console.log(e.target.value);
  120.     //             console.log(player1.symbol);
  121.     //             Gameboard.boardRender();
  122.     //             checkForWinner();
  123.     //             if (winningCombo.length !== 0) {
  124.     //                 console.log(winningPlayer().name);
  125.     //                 Display.updateWinnerDiv(winningPlayer());
  126.     //             }
  127.     //             turn++;
  128.     //         }
  129.     //     } else if (activePlayer === player2) {
  130.     //         bestMove();
  131.     //     }
  132.     // }
  133.  
  134.     const moves = (e) => {
  135.         let activePlayer = whosTurn();
  136.         if (activePlayer === player1) {
  137.             if (e.target.innerText === "") {
  138.                 Gameboard.updateBoard(e.target.getAttribute("data-value"), activePlayer.symbol)
  139.                 console.log(player1.symbol);
  140.                 Gameboard.boardRender();
  141.                 turn++;
  142.             }
  143.         } else if (activePlayer === player2) {
  144.             bestMove()
  145.             Gameboard.boardRender();
  146.             turn++;
  147.         }
  148.     }
  149.    
  150.  
  151.     const removeEvents = () => {
  152.         Gameboard.boardTiles.forEach((tile) => {
  153.             tile.removeEventListener('click', moves);
  154.         });
  155.     }
  156.     function addEvents() {
  157.         Gameboard.boardTiles.forEach((tile) => {
  158.             tile.addEventListener('click', moves);
  159.         })
  160.     }
  161.  
  162.     const updateWinner = () => {
  163.         if (winningPlayer() === "X") {
  164.             winner = player1;
  165.         } else if (winningPlayer() === "O") {
  166.             winner = player2;
  167.         }
  168.     }
  169.  
  170.     const resetGame = () => {
  171.         removeEvents();
  172.         for (let y = 0; y <= 8; y++) {
  173.             Gameboard.gameBoard[y] = "";
  174.         }
  175.         winningCombo = [];
  176.         winner = "";
  177.         Gameboard.boardRender();
  178.         addEvents();
  179.         Display.updateWinnerDiv("reset");
  180.     }
  181.  
  182.     addEvents();
  183.  
  184.     function bestMove() {
  185.         let bestScore = -1000;
  186.         let activeplayer = whosTurn();
  187.         let move;
  188.         for (let i = 0; i < 9; i++) {
  189.             if (Gameboard.boardTiles[i].innerText === "") {
  190.                 Gameboard.updateBoard(i, player1.symbol);
  191.                 let score = minimax(Gameboard.boardTiles, 0, false);
  192.                 Gameboard.updateBoard(i, "");
  193.                 if (score > bestScore) {
  194.                     bestScore = score;
  195.                     move = i
  196.                     // console.log(move);
  197.                 }
  198.             }
  199.         }
  200.         Gameboard.updateBoard(move, player2.symbol);
  201.         Gameboard.boardRender();
  202.         return move;
  203.     }
  204.     let scores = {
  205.         O: 100,
  206.         x: -100,
  207.         tie: 0
  208.     }
  209.  
  210.     console.log(winningPlayer());
  211.  
  212.     function minimax(board, depth, isMaximizing) {
  213.         let result = winningPlayer();
  214.         if (result !== null) {
  215.             return scores[result];
  216.         }
  217.         if (isMaximizing) {
  218.             let bestScore = -1000;
  219.             for (let i = 0; i < 9; i++) {
  220.                 if (board[i] === "") {
  221.                     Gameboard.updateBoard(i, player2.symbol);
  222.                     let score = minimax(Gameboard.gameBoard, depth + 1, false);
  223.                     bestScore = Math.max(score, bestScore);
  224.                     Gameboard.updateBoard(i, "");
  225.                 }
  226.             }
  227.             return bestScore;
  228.         } else {
  229.             let bestScore = 1000;
  230.             for (let i = 0; i < 9; i++) {
  231.                 if (board[i] === "") {
  232.                     Gameboard.updateBoard(i, player1.symbol);
  233.                     let score = minimax(Gameboard.gameBoard, depth + 1, true);
  234.                     bestScore = Math.min(score, bestScore);
  235.                     Gameboard.updateBoard(i, "");
  236.                 }
  237.             }
  238.             return bestScore;
  239.         }
  240.     }
  241.     console.log(minimax(Gameboard.gameBoard, 0, false));
  242.  
  243.     return {removeEvents, winningPlayer, updateWinner, resetGame}
  244. })();
  245.  
  246. const Display = (() => {
  247.     // DOM Elements
  248.     winnerResultDiv = document.querySelector(".winner-result");
  249.     resetBtn = document.querySelector(".reset-btn");
  250.  
  251.     // Events
  252.     resetBtn.addEventListener('click', Game.resetGame);
  253.  
  254.     // Updating DOM Elements
  255.     const updateWinnerDiv = (player) => {
  256.         winnerResultDiv.innerText = player.name
  257.         if (player === "reset") {
  258.             winnerResultDiv.innerText = "";
  259.         }
  260.     }
  261.  
  262.     return {updateWinnerDiv}
  263. })();
  264.  
  265.  
Advertisement
Add Comment
Please, Sign In to add comment