본문 바로가기

JavaScript/javascript 활용하기

javascript를 활용한 tic tac toe 만들어보기

반응형

 

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      table {
        border-collapse: collapse;
      }
      td {
        width: 80px;
        height: 80px;
        border: 1px solid black;
        text-align: center;
        font-size: 60px;
      }
    </style>
  </head>
  <body>
    <!-- 목표 js를 활용한 게임 만들어보기 -->
    <!-- tictacto 승리조건 : 3*3 칸에서 승리했을때 -->
    <div class="wrapper"></div>
    <script src="tictacto.js"></script>
  </body>
</html>

 

tictactoe.js

 

// 해야 될것 1차
// 3*3테이블을 만든다
// 테이블을 눌렀을때 턴이 넘어가야한다
// 1P는 O를 표시하고
// 2P는 X를 표시해야한다.
// 먼저 O를 가로, 세로, 대각선으로 이어서 하면 승리한다.
//1p와 2p를 나누는 flag함수가 필요할거같다
//한번클릭할때 턴이 넘어가야한다

//데이터를 관리해주는부분
//데이터를 기반으로 렌더링해주는부분
let turnFlag = true;
let wrapper = document.querySelector(".wrapper");
let lines = []; // 줄들을 관리 (tr 정보들 관리)
let squares = []; // 칸 (td 정보들 관리)
let turn = ""; // O, X로 바뀌는 로직
let table = "";
function initialize() {
  turnFlag = true;
  wrapper = document.querySelector(".wrapper");
  lines = []; // 줄들을 관리 (tr 정보들 관리)
  squares = []; // 칸 (td 정보들 관리)
  turn = ""; // O, X로 바뀌는 로직
  table = "";
}
const createTable = function () {
  //테이블 생성 구간
  table = document.createElement("table");
  for (let i = 0; i < 3; i++) {
    const tr = document.createElement("tr");
    //데이터 관리 줄, 칸
    lines.push(tr);
    squares.push([]);
    table.append(tr);
    for (let j = 0; j < 3; j++) {
      const td = document.createElement("td");
      squares[i].push(td);
      tr.append(td);
    }
  }
  //클릭이벤트
  //이벤트 위임 활용하기
  //table에 이벤트를 줬지만 전역적으로 적용이 된다
  table.addEventListener("click", clickEvent);

  return table;
};
function clickEvent(e) {
  // 값이 있을경우
  if (e.target.innerHTML) {
    alert("이미 선택된 부분입니다!");
    return;
  }
  // 턴 관리하기
  turn = turn === "O" ? "X" : "O";

  // 현재 몇번째 줄에 칸인지 알아야한다
  // 현재 줄
  //몇줄
  const lineIndex = lines.indexOf(e.target.parentNode);
  const line = squares[lineIndex];
  //현재 칸
  //find 메소드는 배열 자체를 반환하므로
  //몇칸
  const squareIndex = line.indexOf(e.target);
  const square = line.find((li) => li === e.target);
  square.innerHTML = turn;
  // 클릭 이벤트가 끝났을떄 승리, 패배 로직을 판단해야하다
  let full = false;
  //1차 가로줄 판단로직
  if (
    squares[lineIndex][0].innerHTML === turn &&
    squares[lineIndex][1].innerHTML === turn &&
    squares[lineIndex][2].innerHTML === turn
  ) {
    full = true;
  }
  // 2차 세로줄 판단로직
  console.log(squareIndex);
  if (
    squares[0][squareIndex].innerHTML === turn &&
    squares[1][squareIndex].innerHTML === turn &&
    squares[2][squareIndex].innerHTML === turn
  ) {
    full = true;
  }

  // 3차 대각선 판단 로직
  //대각선은 [0,0], [1, 1], [2, 2]  [0, 2], [1, 1], [2,0] 두가지일때
  // x, y값을 뺐을떄 0이 되거나 x, y를 뺏을떄 절대값 2가 되어야한다
  if (
    lineIndex - squareIndex === 0 ||
    Math.abs(lineIndex - squareIndex) === 2
  ) {
    if (
      (squares[0][0].innerHTML === turn &&
        squares[1][1].innerHTML === turn &&
        squares[2][2].innerHTML === turn) ||
      (squares[0][2].innerHTML === turn &&
        squares[1][1].innerHTML === turn &&
        squares[2][0].innerHTML === turn)
    ) {
      full = true;
    }
  }

  if (full) {
    alert(`${turn} 님의 승리!!`);
    initialize();
    wrapper.innerHTML = "";
    wrapper.appendChild(createTable());
  }
}
wrapper.appendChild(createTable());

 

알고리즘 부분은 공부하지 않았기에.. 노가다로 짜보았다.

 

반응형