File size: 3,602 Bytes
2d276da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
const gameBoard = document.querySelector(".game-board");
const scoreDisplay = document.querySelector("#score");
let board = [];
let score = 0;

function initBoard() {
  board = [
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
    [0, 0, 0, 0],
  ];
  addTile();
  addTile();
  renderBoard();
}

function addTile() {
  let emptyTiles = [];
  for (let i = 0; i < 4; i++) {
    for (let j = 0; j < 4; j++) {
      if (board[i][j] === 0) {
        emptyTiles.push({ row: i, col: j });
      }
    }
  }
  if (emptyTiles.length > 0) {
    let randomTile = emptyTiles[Math.floor(Math.random() * emptyTiles.length)];
    board[randomTile.row][randomTile.col] = Math.random() < 0.9 ? 2 : 4;
  }
}

function renderBoard() {
  gameBoard.innerHTML = "";
  for (let i = 0; i < 4; i++) {
    for (let j = 0; j < 4; j++) {
      const tileValue = board[i][j];
      const tile = document.createElement("div");
      tile.classList.add("tile");
      if (tileValue > 0) {
        tile.classList.add(`tile-${tileValue}`);
        tile.textContent = tileValue;
      }
      gameBoard.appendChild(tile);
    }
  }
  scoreDisplay.textContent = score;
}

function moveTiles(direction) {
  let moved = false;
  if (direction === "ArrowUp") {
    for (let j = 0; j < 4; j++) {
      for (let i = 1; i < 4; i++) {
        if (board[i][j] !== 0) {
          let k = i;
          while (k > 0 && board[k - 1][j] === 0) {
            board[k - 1][j] = board[k][j];
            board[k][j] = 0;
            k--;
            moved = true;
          }
          if (k > 0 && board[k - 1][j] === board[k][j]) {
            board[k - 1][j] *= 2;
            score += board[k - 1][j];
            board[k][j] = 0;
            moved = true;
          }
        }
      }
    }
  } else if (direction === "ArrowDown") {
    for (let j = 0; j < 4; j++) {
      for (let i = 2; i >= 0; i--) {
        if (board[i][j] !== 0) {
          let k = i;
          while (k < 3 && board[k + 1][j] === 0) {
            board[k + 1][j] = board[k][j];
            board[k][j] = 0;
            k++;
            moved = true;
          }
          if (k < 3 && board[k + 1][j] === board[k][j]) {
            board[k + 1][j] *= 2;
            score += board[k + 1][j];
            board[k][j] = 0;
            moved = true;
          }
        }
      }
    }
  } else if (direction === "ArrowLeft") {
    for (let i = 0; i < 4; i++) {
      for (let j = 1; j < 4; j++) {
        if (board[i][j] !== 0) {
          let k = j;
          while (k > 0 && board[i][k - 1] === 0) {
            board[i][k - 1] = board[i][k];
            board[i][k] = 0;
            k--;
            moved = true;
          }
          if (k > 0 && board[i][k - 1] === board[i][k]) {
            board[i][k - 1] *= 2;
            score += board[i][k - 1];
            board[i][k] = 0;
            moved = true;
          }
        }
      }
    }
  } else if (direction === "ArrowRight") {
    for (let i = 0; i < 4; i++) {
      for (let j = 2; j >= 0; j--) {
        if (board[i][j] !== 0) {
          let k = j;
          while (k < 3 && board[i][k + 1] === 0) {
            board[i][k + 1] = board[i][k];
            board[i][k] = 0;
            k++;
            moved = true;
          }
          if (k < 3 && board[i][k + 1] === board[i][k]) {
            board[i][k + 1] *= 2;
            score += board[i][k + 1];
            board[i][k] = 0;
            moved = true;
          }
        }
      }
    }
  }
  if (moved) {
    addTile();
    renderBoard();
  }
}

document.addEventListener("keydown", (event) => {
  moveTiles(event.key);
});

initBoard();