-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscript.js
139 lines (117 loc) · 5.23 KB
/
script.js
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
document.addEventListener('DOMContentLoaded', () => {
const gameBoard = document.getElementById("game-board");
const scoreDisplay = document.getElementById("score");
const restartButton = document.getElementById("restart-btn");
const highScoreDisplay = document.createElement("p");
const highScoreTable = document.createElement("div");
highScoreTable.setAttribute("id", "high-score-table");
highScoreDisplay.textContent = "High Score: 0";
scoreDisplay.parentNode.insertBefore(highScoreDisplay, scoreDisplay.nextSibling); // Display high score under current score
document.body.appendChild(highScoreTable); // Add high score table to the body
let tiles = [];
let score = 0;
let highScore = 0;
let scoresHistory = []; // To keep track of the score history
function createBoard() {
gameBoard.innerHTML = ''; // Clear the board before creating new tiles
tiles = []; // Reset the tiles array
for (let i = 0; i < 16; i++) {
const tile = document.createElement("div");
tile.classList.add("tile");
tile.textContent = ""; // Ensure each tile starts as an empty string
gameBoard.appendChild(tile);
tiles.push(tile);
}
generateNewTile();
generateNewTile();
}
function generateNewTile() {
const emptyTiles = tiles.filter(tile => tile.textContent.trim() === ""); // Handle trimmed empty strings
if (emptyTiles.length === 0) return;
const randomTile = emptyTiles[Math.floor(Math.random() * emptyTiles.length)];
randomTile.textContent = Math.random() < 0.1 ? "2" : "4"; // Assign "2" or "4" as strings to avoid NaN
checkGameOver();
}
function moveTile(direction) {
switch (direction) {
case "left":
for (let i = 0; i < 4; i++) combineRow(i * 4, i * 4 + 1, i * 4 + 2, i * 4 + 3);
break;
case "right":
for (let i = 0; i < 4; i++) combineRow(i * 4 + 3, i * 4 + 2, i * 4 + 1, i * 4);
break;
case "up":
for (let i = 0; i < 4; i++) combineRow(i, i + 4, i + 8, i + 12);
break;
case "down":
for (let i = 0; i < 4; i++) combineRow(i + 12, i + 8, i + 4, i);
break;
}
generateNewTile();
}
function combineRow(a, b, c, d) {
const tileArray = [tiles[a], tiles[b], tiles[c], tiles[d]];
const values = tileArray.map(tile => Number(tile.textContent.trim()) || 0); // Use Number() to handle any non-numeric value
const filteredValues = values.filter(value => value !== 0);
for (let i = 0; i < filteredValues.length - 1; i++) {
if (filteredValues[i] === filteredValues[i + 1]) {
filteredValues[i] *= 2;
filteredValues[i + 1] = 0;
score += filteredValues[i];
scoreDisplay.textContent = score; // Update the score correctly
if (score > highScore) { // Update high score
highScore = score;
highScoreDisplay.textContent = `High Score: ${highScore}`;
}
}
}
const newRow = filteredValues.filter(value => value !== 0);
while (newRow.length < 4) newRow.push(0);
tileArray.forEach((tile, index) => {
tile.textContent = newRow[index] === 0 ? "" : newRow[index]; // Ensure tiles are set to numbers or empty strings
});
}
function checkGameOver() {
if (tiles.every(tile => tile.textContent.trim() !== "")) {
alert("Game Over! Your score is: " + score);
scoresHistory.push(score); // Add the score to the history
updateHighScoreTable(); // Update the high score table
resetGame(); // Restart the game automatically
}
}
function updateHighScoreTable() {
highScoreTable.innerHTML = "<h3>High Scores</h3>";
const sortedScores = [...scoresHistory].sort((a, b) => b - a); // Sort scores in descending order
sortedScores.forEach((score, index) => {
const scoreEntry = document.createElement("p");
scoreEntry.textContent = `#${index + 1}: ${score}`;
highScoreTable.appendChild(scoreEntry);
});
}
function resetGame() {
tiles.forEach(tile => (tile.textContent = "")); // Reset all tiles to be empty
score = 0;
scoreDisplay.textContent = score; // Reset score display
createBoard(); // Recreate the board instead of just generating new tiles
}
document.addEventListener("keydown", (e) => {
switch (e.key) {
case "ArrowLeft":
moveTile("left");
break;
case "ArrowRight":
moveTile("right");
break;
case "ArrowUp":
moveTile("up");
break;
case "ArrowDown":
moveTile("down");
break;
}
});
restartButton.addEventListener("click", () => {
resetGame();
});
createBoard();
});