<div id="select-screen">
  <div class="title">Select X or O</div>
  <div class="button" id="x">X</div>
  <div class="button" id="o">O</div>
</div>

<div id="result"></div>
<div id="game-board">
  <div class="row">
    <div class="cell" id="cell-1"></div>
    <div class="cell" id="cell-2"></div>
    <div class="cell" id="cell-3"></div>
  </div>

  <div class="row">
    <div class="cell" id="cell-4"></div>
    <div class="cell" id="cell-5"></div>
    <div class="cell" id="cell-6"></div>
  </div>

  <div class="row">
    <div class="cell" id="cell-7"></div>
    <div class="cell" id="cell-8"></div>
    <div class="cell" id="cell-9"></div>
  </div>
</div>

<div id="game-over-overlay"></div>
@import url(https://fonts.googleapis.com/css?family=Oswald);

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  background-color: black;
  color: white;
  font-family: 'Oswald', sans-serif;
}

#select-screen {
  text-align: center;
  color: black;
  background-color: white;
  width: 500px;
  margin: 100px auto;
  border: 5px white solid;
  border-radius: 15px;
  padding: 30px;
}

.title {
  font-size: 30px;
  margin-bottom: 40px;
}

.button {
  font-size: 20px;
  display: inline-block;
  border: 2px solid black;
  padding: 3px 20px;
  border-radius: 8px;
  margin: 0 10px;
  -webkit-transition: background-color .2s, color .2s;
  transition: background-color .2s, color .2s;
}

.button:hover {
  background-color: black;
  color: white;
  cursor: pointer;
}

#result {
  display: none;
  font-size: 40px;
  text-align: center;
  margin: 50px auto;
  width: 500px;
}

#game-board {
  text-align: center;
  display: none;
  background-color: white;
  width: 426.5px;
  height: 426.5px;
  margin: 50px auto;
}

.cell {
  font-size: 40px;
  display: inline-block;
  background-color: black;
  height: 140px;
  line-height: 100px;
  width: 139px;
  vertical-align: top;
}

.cell:hover {
  background-color: #333;
  cursor: pointer;
}

.taken:hover {
  cursor: not-allowed;
}

.row {
  margin-bottom: 4px;
}

#game-over-overlay {
  cursor: pointer;
  display: none;
  position: absolute;
  z-index: 100;
  left: 0;
  top: 0;
  width: 100%;
  min-height: 100%;
}
$(document).ready(function() {
  var cell_value = ['', '', '',
    '', '', '',
    '', '', ''
  ];

  var player_letter = '';
  var computer_letter = '';

  $("#x").click(function() {
    player_letter = 'x';
    computer_letter = 'o';
    $("#select-screen").toggle("slide");
    $("#result").show();
    $("#game-board").show();
    $("#result").html("Game in progress");
    randomComputerPlay();
  });
  $("#o").click(function() {
    player_letter = 'o';
    computer_letter = 'x';
    $("#select-screen").toggle("slide");
    $("#result").show();
    $("#game-board").show();
    $("#result").html("Game in progress");
    randomComputerPlay();
  });

  $(".cell").click(function() {
    var cell_id = $(this).attr('id');
    var cell_num = parseInt(cell_id.replace('cell-', ''));
    if (cell_value[cell_num - 1] === '') {
      $("#" + cell_id).html("<div class='letter'>" + player_letter + "</div>");
      cell_value[cell_num - 1] = player_letter;
      $(this).addClass('taken');
      if (checkWinner(cell_value) === player_letter) {
        $("#result").html("Player wins! Click to play again.");
        $("#game-over-overlay").show();
      } else {
        computerPlay(computer_letter);
        if (checkWinner(cell_value) === computer_letter) {
          $("#result").html("Computer wins... Click to play again.");
          $("#game-over-overlay").show();
        } else if (isTie(cell_value)) {
          $("#result").html("It's a tie! Click to play again.");
          $("#game-over-overlay").show();
        }
      }
    }
  });

  $("#game-over-overlay").click(function() {
    $("#game-over-overlay").hide();
    $(".cell").css({
      "color": "white"
    });
    cell_value = ['', '', '',
      '', '', '',
      '', '', ''
    ];
    $(".cell").removeClass('taken');
    $(".cell").html('');
    $("#result").html("Game in progress");
    randomComputerPlay();
  });

  function randomComputerPlay() {
    // make it an even number, so it's a corner or middle square
    var num = Math.floor(Math.random() * 5);
    num *= 2;
    $("#cell-" + (num + 1)).html("<div class='letter'>" + computer_letter + "</div>");
    cell_value[num] = computer_letter;
    $("#cell-" + (num + 1)).addClass('taken');
  }

  function computerPlay(computer_letter) {
    // take center if it's not taken
    if (cell_value[4] === '') {
      $("#cell-5").html("<div class='letter'>" + computer_letter + "</div>");
      cell_value[4] = computer_letter;
      $("#cell-5").addClass('taken');
      return;
    }

    // if computer can win, win
    var move = canWin(computer_letter);
    if (move !== 9) {
      $("#cell-" + (move + 1)).html("<div class='letter'>" + computer_letter + "</div>");
      cell_value[move] = computer_letter;
      $("#cell-" + (move + 1)).addClass('taken');
      return;
    }

    // if player can win, block
    move = canWin(player_letter);
    if (move !== 9) {
      $("#cell-" + (move + 1)).html("<div class='letter'>" + computer_letter + "</div>");
      cell_value[move] = computer_letter;
      $("#cell-" + (move + 1)).addClass('taken');
      return;
    }

    // if computer doesn't have to block or win, pick a corner
    if (cell_value[0] === '') {
      $("#cell-1").html("<div class='letter'>" + computer_letter + "</div>");
      cell_value[0] = computer_letter;
      $("#cell-1").addClass('taken');
      return;
    } else if (cell_value[2] === '') {
      $("#cell-3").html("<div class='letter'>" + computer_letter + "</div>");
      cell_value[2] = computer_letter;
      $("#cell-3").addClass('taken');
      return;
    } else if (cell_value[6] === '') {
      $("#cell-7").html("<div class='letter'>" + computer_letter + "</div>");
      cell_value[6] = computer_letter;
      $("#cell-7").addClass('taken');
      return;
    } else if (cell_value[8] === '') {
      $("#cell-9").html("<div class='letter'>" + computer_letter + "</div>");
      cell_value[8] = computer_letter;
      $("#cell-9").addClass('taken');
      return;
    }

    for (var i = 0; i < 99; i++) {
      var num = Math.floor(Math.random() * 9);
      if (cell_value[num] === '') {
        $("#cell-" + (num + 1)).html("<div class='letter'>" + computer_letter + "</div>");
        cell_value[num] = computer_letter;
        $("#cell-" + (num + 1)).addClass('taken');
        return;
      }
    }
  }

  function canWin(letter) {
    var can_win_str = letter + letter;

    // horizontal
    var row = cell_value[0] + cell_value[1] + cell_value[2];
    if (row === can_win_str) {
      for (var i = 0; i < 3; i++) {
        if (cell_value[i] === '') {
          return i;
        }
      }
    }
    row = cell_value[3] + cell_value[4] + cell_value[5];
    if (row === can_win_str) {
      for (var i = 3; i < 6; i++) {
        if (cell_value[i] === '') {
          return i;
        }
      }
    }
    row = cell_value[6] + cell_value[7] + cell_value[8];
    if (row === can_win_str) {
      for (var i = 6; i < 9; i++) {
        if (cell_value[i] === '') {
          return i;
        }
      }
    }

    // vertical
    var row = cell_value[0] + cell_value[3] + cell_value[6];
    if (row === can_win_str) {
      for (var i = 0; i < 7; i += 3) {
        if (cell_value[i] === '') {
          return i;
        }
      }
    }
    row = cell_value[1] + cell_value[4] + cell_value[7];
    if (row === can_win_str) {
      for (var i = 1; i < 8; i += 3) {
        if (cell_value[i] === '') {
          return i;
        }
      }
    }
    row = cell_value[2] + cell_value[5] + cell_value[8];
    if (row === can_win_str) {
      for (var i = 2; i < 9; i += 3) {
        if (cell_value[i] === '') {
          return i;
        }
      }
    }

    // diagonal
    row = cell_value[0] + cell_value[4] + cell_value[8];
    if (row === can_win_str) {
      if (cell_value[0] === '') {
        return 0;
      } else if (cell_value[4] === '') {
        return 4;
      } else if (cell_value[8] === '') {
        return 8;
      }
    }
    row = cell_value[2] + cell_value[4] + cell_value[6];
    if (row === can_win_str) {
      if (cell_value[2] === '') {
        return 2;
      } else if (cell_value[4] === '') {
        return 4;
      } else if (cell_value[6] === '') {
        return 6;
      }
    }

    return 9;
  }
    
  function isTie(cell_value) {
    var is_full = true;
    for (var i = 0; i < cell_value.length; i++) {
      if (cell_value[i] === '') {
        is_full = false;
      }
    }
    return is_full;
  }

  function colorWinningCells(x, y, z) {
    $("#cell-" + x).css({
      "color": "green"
    });
    $("#cell-" + y).css({
      "color": "green"
    });
    $("#cell-" + z).css({
      "color": "green"
    });
  }

  function checkWinner(board) {
    // horizontal wins
    if (board[0] === board[1] && board[1] === board[2]) {
      if (board[0] !== '') {
        colorWinningCells(1, 2, 3);
      }
      return board[0];
    }
    if (board[3] === board[4] && board[4] === board[5]) {
      if (board[3] !== '') {
        colorWinningCells(4, 5, 6);
      }
      return board[3];
    }
    if (board[6] === board[7] && board[7] === board[8]) {
      if (board[6] !== '') {
        colorWinningCells(7, 8, 9);
      }
      return board[6];
    }

    // vertical wins
    if (board[0] === board[3] && board[3] === board[6]) {
      if (board[0] !== '') {
        colorWinningCells(1, 4, 7);
      }
      return board[0];
    }
    if (board[1] === board[4] && board[4] === board[7]) {
      if (board[1] !== '') {
        colorWinningCells(2, 5, 8);
      }
      return board[1];
    }
    if (board[2] === board[5] && board[5] === board[8]) {
      if (board[2] !== '') {
        colorWinningCells(3, 6, 9);
      }
      return board[2];
    }

    // diagonal wins
    if (board[0] === board[4] && board[4] === board[8]) {
      if (board[0] !== '') {
        colorWinningCells(1, 5, 9);
      }
      return board[0];
    }
    if (board[2] === board[4] && board[4] === board[6]) {
      if (board[2] !== '') {
        colorWinningCells(3, 5, 7);
      }
      return board[2];
    }
  }
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://code.jquery.com/jquery-2.2.4.min.js