From edbb434b2d15b3c03a450afdb84e9317b7677e36 Mon Sep 17 00:00:00 2001 From: Anna Agerone Date: Thu, 17 Oct 2024 10:41:31 -0500 Subject: [PATCH 1/4] 2048 --- src/images/2048-icon.png | Bin 0 -> 47986 bytes src/index.html | 8 +- src/modules/Game.class.js | 322 ++++++++++++++++++++++++++++++-------- src/scripts/main.js | 76 ++++++++- src/styles/main.scss | 43 +++-- 5 files changed, 368 insertions(+), 81 deletions(-) create mode 100644 src/images/2048-icon.png diff --git a/src/images/2048-icon.png b/src/images/2048-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8141c10d3a8ba1d50e56579129ca1489abd928 GIT binary patch literal 47986 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 Gjru=76C_>$ literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index aff3d1a98..9196bdbf1 100644 --- a/src/index.html +++ b/src/index.html @@ -7,6 +7,7 @@ content="width=device-width, initial-scale=1.0" /> 2048 + 2048 + +

Combine the numbers and aim to reach the 2048 tile!

@@ -58,13 +61,14 @@

2048

- +

Press "Start" to begin game. Good luck!

+

HOW TO PLAY: Use the arrow keys to move the tiles around. When two tiles with the same number collide, they combine into a single tile!

- + diff --git a/src/modules/Game.class.js b/src/modules/Game.class.js index 65cd219c9..292871d64 100644 --- a/src/modules/Game.class.js +++ b/src/modules/Game.class.js @@ -1,68 +1,266 @@ 'use strict'; -/** - * This class represents the game. - * Now it has a basic structure, that is needed for testing. - * Feel free to add more props and methods if needed. - */ class Game { - /** - * Creates a new game instance. - * - * @param {number[][]} initialState - * The initial state of the board. - * @default - * [[0, 0, 0, 0], - * [0, 0, 0, 0], - * [0, 0, 0, 0], - * [0, 0, 0, 0]] - * - * If passed, the board will be initialized with the provided - * initial state. - */ - constructor(initialState) { - // eslint-disable-next-line no-console - console.log(initialState); - } - - moveLeft() {} - moveRight() {} - moveUp() {} - moveDown() {} - - /** - * @returns {number} - */ - getScore() {} - - /** - * @returns {number[][]} - */ - getState() {} - - /** - * Returns the current game status. - * - * @returns {string} One of: 'idle', 'playing', 'win', 'lose' - * - * `idle` - the game has not started yet (the initial state); - * `playing` - the game is in progress; - * `win` - the game is won; - * `lose` - the game is lost - */ - getStatus() {} - - /** - * Starts the game. - */ - start() {} - - /** - * Resets the game. - */ - restart() {} - - // Add your own methods here + constructor( + initialState = [ + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0], + [0, 0, 0, 0], + ], + ) { + this.score = 0; + this.status = 'idle'; + this.initialState = initialState; + this.state = this.copyState(this.initialState); + } + + getScore() { + return this.score; + } + + getState() { + return this.state; + } + + getStatus() { + return this.status; + } + + start() { + if (this.status === 'idle') { + this.status = 'playing'; + this.addRandomTile(); + this.addRandomTile(); + } + } + + restart() { + this.state = this.copyState(this.initialState); + this.score = 0; + this.status = 'idle'; + } + + copyState(state) { + return state.map((row) => [...row]); + } + + addRandomTile() { + const emptyTiles = []; + + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 4; col++) { + if (this.state[row][col] === 0) { + emptyTiles.push([row, col]); + } + } + } + + if (emptyTiles.length > 0) { + const randomIndex = Math.floor(Math.random() * emptyTiles.length); + + const [row, col] = emptyTiles[randomIndex]; + + this.state[row][col] = Math.random() < 0.9 ? 2 : 4; + } + } + + moveLeft() { + if (this.status !== 'playing') { + return; + } + + const moved = this.move('left'); + + if (moved) { + this.addRandomTile(); + this.checkGameState(); + } + } + + moveRight() { + if (this.status !== 'playing') { + return; + } + + const moved = this.move('right'); + + if (moved) { + this.addRandomTile(); + this.checkGameState(); + } + } + + moveUp() { + if (this.status !== 'playing') { + return; + } + + const moved = this.move('up'); + + if (moved) { + this.addRandomTile(); + this.checkGameState(); + } + } + + moveDown() { + if (this.status !== 'playing') { + return; + } + + const moved = this.move('down'); + + if (moved) { + this.addRandomTile(); + this.checkGameState(); + } + } + + move(direction) { + const originalState = this.copyState(this.state); + + const combineRow = (row) => { + const newRow = row.filter((n) => n !== 0); + + for (let i = 0; i < newRow.length - 1; i++) { + if (newRow[i] === newRow[i + 1]) { + newRow[i] *= 2; + newRow[i + 1] = 0; + this.score += newRow[i]; + } + } + + return newRow.filter((n) => n !== 0); + }; + + const moveRowLeft = (row) => { + const newRow = combineRow(row); + + while (newRow.length < 4) { + newRow.push(0); + } + + return newRow; + }; + + const moveRowRight = (row) => { + const copyRow = [...row]; + + const newRow = combineRow(copyRow.reverse()); + + while (newRow.length < 4) { + newRow.push(0); + } + + return newRow.reverse(); + }; + + const moveStateLeft = (state) => { + return state.map((row) => moveRowLeft(row)); + }; + + const moveStateRight = (state) => { + return state.map((row) => moveRowRight(row)); + }; + + switch (direction) { + case 'left': + this.state = moveStateLeft(this.state); + break; + + case 'right': + this.state = moveStateRight(this.state); + break; + + case 'up': + this.state = this.transposeState( + moveStateLeft(this.transposeState(this.state)), + ); + break; + + case 'down': + this.state = this.transposeState( + moveStateRight(this.transposeState(this.state)), + ); + break; + } + + return !this.areStatesEqual(this.state, originalState); + } + + hasEmptyCells() { + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 4; col++) { + if (this.state[row][col] === 0) { + return true; + } + } + } + + return false; + } + + canCombine() { + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 4; col++) { + const current = this.state[row][col]; + + if (col < 3 && current === this.state[row][col + 1]) { + return true; + } + + if (row < 3 && current === this.state[row + 1][col]) { + return true; + } + } + } + + return false; + } + + checkGameState() { + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 4; col++) { + if (this.state[row][col] === 2048) { + this.status = 'win'; + + return; + } + } + } + + if (this.hasEmptyCells() || this.canCombine()) { + return; + } + this.status = 'lose'; + } + + transposeState(state) { + const result = []; + + for (let col = 0; col < 4; col++) { + result[col] = []; + + for (let row = 0; row < 4; row++) { + result[col].push(state[row][col]); + } + } + + return result; + } + + areStatesEqual(state1, state2) { + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 4; col++) { + if (state1[row][col] !== state2[row][col]) { + return false; + } + } + } + + return true; + } } module.exports = Game; diff --git a/src/scripts/main.js b/src/scripts/main.js index dc7f045a3..69559f483 100644 --- a/src/scripts/main.js +++ b/src/scripts/main.js @@ -1,7 +1,75 @@ 'use strict'; -// Uncomment the next lines to use your game instance in the browser -// const Game = require('../modules/Game.class'); -// const game = new Game(); +const Game = require('../modules/Game.class'); +const game = new Game(); +const cells = document.querySelectorAll('.field-cell'); +const buttonStart = document.querySelector('.button.start'); -// Write your code here +document.addEventListener('keydown', (e) => { + if (game.getStatus() === 'playing') { + switch (e.key) { + case 'ArrowLeft': + game.moveLeft(); + break; + + case 'ArrowRight': + game.moveRight(); + break; + + case 'ArrowUp': + game.moveUp(); + break; + + case 'ArrowDown': + game.moveDown(); + break; + } + + updateView(); + } +}); + +function updateView() { + let i = 0; + const state = game.getState(); + + for (let row = 0; row < 4; row++) { + for (let col = 0; col < 4; col++) { + const cell = cells[i]; + + cell.className = 'field-cell'; + + if (state[row][col]) { + cell.textContent = state[row][col]; + cell.classList.add(`field-cell--${state[row][col]}`); + } else { + cell.textContent = ''; + } + i++; + } + } + + document.querySelector('.game-score').textContent = game.getScore(); + + const gameStatus = game.getStatus(); + + if (gameStatus === 'win') { + document.querySelector('.message-win').classList.remove('hidden'); + } else if (gameStatus === 'lose') { + document.querySelector('.message-lose').classList.remove('hidden'); + } +} + +buttonStart.addEventListener('click', () => { + if (buttonStart.className === 'button restart') { + game.restart(); + } + + game.start(); + updateView(); + document.querySelector('.message-win').classList.add('hidden'); + document.querySelector('.message-lose').classList.add('hidden'); + document.querySelector('.message-start').classList.add('hidden'); + buttonStart.textContent = 'Restart'; + buttonStart.className = 'button restart'; +}); diff --git a/src/styles/main.scss b/src/styles/main.scss index c43f37dcf..211efd014 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -12,8 +12,8 @@ body { .field-cell { background: #d6cdc4; - width: 75px; - height: 75px; + width: 80px; + height: 80px; border-radius: 5px; color: #776e65; box-sizing: border-box; @@ -75,6 +75,10 @@ body { } } +.container { + margin-top: 0; +} + .game-field { background: #bbada0; border-spacing: 10px; @@ -85,23 +89,27 @@ body { display: flex; width: 100%; justify-content: space-between; - margin-bottom: 24px; + margin-bottom: 10px; padding: 10px; box-sizing: border-box; } h1 { - background: #edc22e; - color: #f9f6f2; - width: 75px; - height: 75px; - font-size: 24px; - border-radius: 5px; - display: flex; - align-items: center; - justify-content: center; - box-sizing: border-box; + font-size: 67px; + font-weight: 700; margin: 0; + display: block; + color: #776e65; + +} + +h3 { + margin: 0; + margin-bottom: 10px; + font-family: sans-serif; + font-size: 20px; + color: #edc22e;; + padding: 10px; } .info { @@ -181,6 +189,15 @@ h1 { color: #f9f6f2; } +.message-lose { + color: #776e65; +} + +.message-rule { + margin-bottom: 0; + font-size: 15px; +} + .message-container { width: 100%; height: 150px; From 2cc8260ae38cdf1bcda28aecc2d87d7ae8d2ed93 Mon Sep 17 00:00:00 2001 From: Anna Agerone Date: Thu, 17 Oct 2024 10:46:29 -0500 Subject: [PATCH 2/4] Solution --- src/styles/main.scss | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/styles/main.scss b/src/styles/main.scss index 211efd014..ee7194970 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -75,10 +75,6 @@ body { } } -.container { - margin-top: 0; -} - .game-field { background: #bbada0; border-spacing: 10px; @@ -178,6 +174,7 @@ h3 { } .container { + margin-top: 0; display: flex; flex-direction: column; align-items: center; From 3fbeff80dde037822a2138b4fba7e3a8ba580a22 Mon Sep 17 00:00:00 2001 From: Anna Agerone Date: Thu, 17 Oct 2024 10:59:42 -0500 Subject: [PATCH 3/4] Update --- src/styles/main.scss | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/styles/main.scss b/src/styles/main.scss index 211efd014..ee7194970 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -75,10 +75,6 @@ body { } } -.container { - margin-top: 0; -} - .game-field { background: #bbada0; border-spacing: 10px; @@ -178,6 +174,7 @@ h3 { } .container { + margin-top: 0; display: flex; flex-direction: column; align-items: center; From a523968e774b7faa83c99d71dc2a3d6b89a34970 Mon Sep 17 00:00:00 2001 From: Anna Agerone Date: Thu, 17 Oct 2024 11:06:55 -0500 Subject: [PATCH 4/4] Update 1 --- src/index.html | 17 +++++++++++++---- src/styles/main.scss | 3 +-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/index.html b/src/index.html index 9196bdbf1..32029141d 100644 --- a/src/index.html +++ b/src/index.html @@ -7,7 +7,10 @@ content="width=device-width, initial-scale=1.0" /> 2048 - + 2048 - +

Combine the numbers and aim to reach the 2048 tile!

@@ -66,9 +69,15 @@

Combine the numbers and aim to reach the 2048 tile!

Press "Start" to begin game. Good luck!

-

HOW TO PLAY: Use the arrow keys to move the tiles around. When two tiles with the same number collide, they combine into a single tile!

+

+ HOW TO PLAY: Use the arrow keys to move the tiles around. When two + tiles with the same number collide, they combine into a single tile! +

- + diff --git a/src/styles/main.scss b/src/styles/main.scss index ee7194970..d614751d4 100644 --- a/src/styles/main.scss +++ b/src/styles/main.scss @@ -96,7 +96,6 @@ h1 { margin: 0; display: block; color: #776e65; - } h3 { @@ -104,7 +103,7 @@ h3 { margin-bottom: 10px; font-family: sans-serif; font-size: 20px; - color: #edc22e;; + color: #edc22e; padding: 10px; }