css Audio - Active file-generic CSS - Active Generic - Active HTML - Active JS - Active SVG - Active Text - Active file-generic Video - Active header Love html icon-new-collection icon-person icon-team numbered-list123 pop-out spinner split-screen star tv

Pen Settings

CSS Base

Vendor Prefixing

Add External Stylesheets/Pens

Any URL's added here will be added as <link>s in order, and before the CSS in the editor. If you link to another Pen, it will include the CSS from that Pen. If the preprocessor matches, it will attempt to combine them before processing.

+ add another resource

You're using npm packages, so we've auto-selected Babel for you here, which we require to process imports and make it all work. If you need to use a different JavaScript preprocessor, remove the packages in the npm tab.

Add External Scripts/Pens

Any URL's added here will be added as <script>s in order, and run before the JavaScript in the editor. You can use the URL of any other Pen and it will include the JavaScript from that Pen.

+ add another resource

Use npm Packages

We can make npm packages available for you to use in your JavaScript. We use webpack to prepare them and make them available to import. We'll also process your JavaScript with Babel.

⚠️ This feature can only be used by logged in users.

Code Indentation

     

Save Automatically?

If active, Pens will autosave every 30 seconds after being saved once.

Auto-Updating Preview

If enabled, the preview panel updates automatically as you code. If disabled, use the "Run" button to update.

HTML Settings

Here you can Sed posuere consectetur est at lobortis. Donec ullamcorper nulla non metus auctor fringilla. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Praesent commodo cursus magna, vel scelerisque nisl consectetur et.

            
              <menu>
  <h1>Tic Tac Toe Dimensions</h1>
  <button id="human">Pass and play</button>
  <button disabled>Play online opponent</button>
  <button disabled>Play against the computer</button>
</menu>
<stage class="hidden"></stage>
            
          
!
            
              $Primary: #405061;
$Light: hsl(hue($Primary),saturation($Primary),75%);
$xcol: #09f;
$ocol: #f90;

body {
  background: $Primary;
}

.hidden {
  display: none !important;
}

menu {
  display: block;
  margin: 0 auto;
  width: 80vw;
  
  > * {
    display: block;
    text-align: center;
    margin: 1em auto;
  }
  h1 {
    font-weight: 300;
    text-align: center;
    color: #fff;
  }
  
  button {
    border: 1px solid $Light;
    background: mix($Primary,$Light,90%);
    color: mix(#fff,$Light);
    cursor: pointer;
    display: block;
    font-family: 'Roboto',sans-serif;
    text-transform: uppercase;
    font-weight: 700;
    padding: 1em;
    min-width: 50%;
    border-radius: 1em;
    
    &[disabled] {
      cursor: default;
      opacity: .3;
      font-weight: 100;
    }
  }
}



/* Game Styling */
body {
  border-top: 1vh solid transparent;
  color: $Light;
  font-family: 'Roboto', sans-serif;
  font-weight: 100;
  padding: 0;
  margin: 0;
  
  transition: .3s border-top-color ease-in-out;
  
  &.current_turn_x {
    border-top-color: $xcol;
  }
  &.current_turn_o {
    border-top-color: $ocol;
  }
  &.complete {
    border-top-color: transparent;
    .description {
      display: none;
    }
  }
}

* {
  box-sizing: border-box;
}

stage,
ministage {
  display: table;
  border-collapse: collapse;
}

row {
  display: table-row;
}

board,
cell {
  display: table-cell;
  border-collapse: collapse;
}

stage {
  font-family: 'Inconsolata', monospace;
  font-weight: bold;
  font-size: .8vw;
  height: 100em;
  left: 50%;
  position: absolute;
  top: 50%;
  transform: translate(-50%,-50%);
  width: 100em;
  
  &::before {
    content:"";
    font-size: 150em;
    left: 50%;
    top: 55%;
    opacity: 0;
    position: absolute;
    transform: translate(-50%,-50%);
    transition: .6s top ease-in-out, .6s opacity ease-in-out;
    z-index: 1;
  }
  &.complete {
    &::before {
      opacity: 1;
      top: 35%;
    }
    
    board {
      opacity: .2;
      &.active {
        background: transparent;
      }
    }
  }
  &.taken {
    &_x::before {
      color: $xcol;
      content: "x";
    }
    &_o::before {
      color: $ocol;
      content: "o";
    }
  }
  
  .description {
    color: #fff;
    font-family: 'Roboto', sans-serif;
    font-size: 18px;
    font-weight: 100;
    position: absolute;
    left: 0;
    right: 0;
    bottom: 100%;
    text-align: center;
    padding: 0 0 1em;
    
    span {
      font-weight: bold;
      text-transform: uppercase;
      font-size: 1.8em;
      vertical-align: -.15em;
      margin: 0 .2em;
    }
    .color {
      &_x {color: $xcol;}
      &_o {color: $ocol;}
    }
  }
  
  stage {
    font-size: .22em;
    position: relative;
  }
  
  
  board {
    border: 0 solid $Light;
    height: 33.33em;
    padding: 1em;
    position: relative;
    transition: .3s border-color ease-in-out, 
      .3s opacity ease-in-out;
    width: 33.33em;
    
    &.active {
      background: lighten($Primary,5%);
    }
    
    &.inactive board {
      opacity: .4;
      border-color: mix($Light,$Primary,25%);
    }
    
    &.complete board {
      opacity: 1;
      border-color: $Light;
    }
    
    &.taken_x,
    &.taken_o {
      board {
        opacity: .4;
        border-color: mix($Light,$Primary,25%);  
      } 
    }
    
    &::before {
      font-size: 40em;
      left: 50%;
      top: 37%;
      position: absolute;
      transform: translate(-50%,-50%);
      z-index: 1;
    }
    
    &.taken_x::before {
      color: $xcol;
      content: "x";
    }
    &.taken_o::before {
      color: $ocol;
      content: "o";
    }
    
    &:nth-child(2n) {
      border-left-width: 1px;
      border-right-width: 1px;
    }
    
    &.inactive board.cell {
      cursor: default;
    }
    
    &.cell {
      cursor: pointer;
      position: relative;
      &::before {
        font-size: 25em;
        left: 50%;
        position: absolute;
        top: 40%;
        transform: translate(-50%,-50%);
      }
      
      &.taken_x::before {
        color: $xcol;
        content: "x";
      }
      &.taken_o::before {
        color: $ocol;
        content: "o";
      }
    }
  }
  
  > row:nth-child(n+2) > board {
    border-top-width: 1px;
  }
  .description + row > board {
    border-top-width: 0;
  }
}

body {
    background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAIGCAYAAACs8uv3AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkM5ODlDMEUyQUFERDExRTdBNUEzRjE2NTNDRkQ5RjZFIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkM5ODlDMEUzQUFERDExRTdBNUEzRjE2NTNDRkQ5RjZFIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Qzk4OUMwRTBBQUREMTFFN0E1QTNGMTY1M0NGRDlGNkUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Qzk4OUMwRTFBQUREMTFFN0E1QTNGMTY1M0NGRDlGNkUiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz675KrPAABZ80lEQVR42uy9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);
}
            
          
!
            
              class ticTac {
  constructor($el) {
    this.$el = $el;
    this.$el.html('');
    this.turnClasses = ["x", "o"];
    this.state = { boards: { x: [], o: [], cells: [] } };
    this.turnNumber = 0;

    this.regexes = [
      /^((?:.{3}){0,2}1{3}(?:.{3}){0,2})$/, //horizontal wins
      /(1.{2}1.{2}1)/, //vertical wins
      /^(1.{3}1.{3}1|.{2}1.1.1.{2})$/ //diagonal wins
    ];

    $("body").attr("class", "current_turn_" + this.turnClasses[this.turnNumber % 2]);    
    this.constructDom();
    this.setupListeners();
    this.updateDescription();
  }

  constructDom() {
    this.$el.removeClass('hidden').each(function() {
      for (var i = 0; i < 9; i += 3) {
        $(this).append(
          '<row><board id="board_' +
            i +
            '" class="board"></board><board id="board_' +
            (i + 1) +
            '" class="board"></board><board id="board_' +
            (i + 2) +
            '" class="board"></board></row>'
        );
      }
    });
    var stageHtml = this.$el
      .html()
      .replace(/board_/g, "cell_")
      .replace(/"board"/g, '"cell unplayed"');
    this.$el.find("board").each(function() {
      $(this).append("<stage>" + stageHtml + "</stage>");
    });
    this.$el.prepend('<div class="description"></div>');
  }

  setupListeners() {
    this.$el.find(".cell").click(this.cellClick);
  }

  cellClick(e) {
    var $el = $(e.delegateTarget);
    if ($el.hasClass("unplayed") && !$el.closest(".board").hasClass("complete") && !$el.closest(".board").hasClass("inactive")) {
      var turn = game.turnClasses[game.turnNumber % 2];
      $el.addClass("taken_" + turn).removeClass("unplayed");
      var index = $el.index() + $el.parent().index() * 3;

      $(".board").removeClass("inactive active");
      if (!$(".board:eq(" + index + ")").hasClass("complete")) {
        $(".board")
          .addClass("inactive")
          .filter(":eq(" + index + ")")
          .removeClass("inactive")
          .addClass("active");
      }
      game.turnNumber++;
      $("body").attr(
        "class",
        "current_turn_" + game.turnClasses[game.turnNumber % 2]
      );
      game.storeGameValues();
      game.checkBoardWinners($el.closest(".board"));
      if (!$(".board").not(".complete,.inactive").length) {
        $(".board").removeClass("inactive active");
      }
      game.updateDescription();
    }
  }
  resize() {
    game.$el.css(
      "font-size",
      ($(window).height()/$(window).width() > 1.2 ? ".9vw" : ".75vh")
    );
  }

  storeGameValues() {
    this.state.boards.x = $(".board")
      .map(function() {
        return $(this).hasClass("taken_x") ? 1 : 0;
      })
      .get()
      .join("");
    this.state.boards.o = $(".board")
      .map(function() {
        return $(this).hasClass("taken_o") ? 1 : 0;
      })
      .get()
      .join("");
    this.state.boards.cells = $(".board")
      .map(function() {
        return {
          x: $(this)
            .find(".cell")
            .map(function() {
              return $(this).hasClass("taken_x") ? 1 : 0;
            })
            .get()
            .join(""),
          o: $(this)
            .find(".cell")
            .map(function() {
              return $(this).hasClass("taken_o") ? 1 : 0;
            })
            .get()
            .join("")
        };
      })
      .get();
  }

  checkBoardWinners($board) {
    $(".board").each(function(i) {
      if ($(this)[0] === $board[0]) {
        game.checkBoard(game.state.boards.cells[i], $board);
      }
    });
  }

  checkBoard(boardVals, $board) {
    var found = false;
    for (var i = 0; i < this.regexes.length; i++) {
      if (boardVals.x.match(this.regexes[i])) {
        $board.addClass("taken_x complete");
        found = true;
      }
      if (boardVals.o.match(this.regexes[i])) {
        $board.addClass("taken_o complete");
        found = true;
      }
      if (found) {
        this.storeGameValues();
        if ($board !== game.$el) {
          this.checkBoard(game.state.boards, game.$el);
        } else {
          setTimeout(function() {$('body').addClass('complete')},300);
        }
        return true;
      }
    }
  }
  
  updateDescription(str) {
    var str = '';
    if (this.$el.find('.inactive').length) {
      str = '<span class="color_{player}">{player}</span>\'s turn to play in the highlighted board';
    } else {
      str = '<span class="color_{player}">{player}</span> has a free play on any board';
    }
    this.$el.find('.description').html(str.replace(/{player}/g,this.turnClasses[this.turnNumber % 2]));
  }
  
  destroy() {
    this.$el.html('');
    delete this;
  }
}

var game = new ticTac($('stage').first());
$(window).resize(game.resize).resize();
$('stage').addClass('hidden');

$('#human').click(function() {
  $('body>*').addClass('hidden');
  $('stage').attr('class','');
  game = new ticTac($('stage').first());
});

$('body').click(function() {
  if ($(this).hasClass('complete')) {
    $('body>*').addClass('hidden');
    $('menu').removeClass('hidden');
    game.destroy();
  }
});



            
          
!
999px
🕑 One or more of the npm packages you are using needs to be built. You're the first person to ever need it! We're building it right now and your preview will start updating again when it's ready.
Loading ..................

Console