html> ="en"> 100 body { margin: 0; overflow: hidden; background-color: #f0f0f0; font-family: 'Arial', sans-serif; } #gameCanvas { background-color: #ffffff; border: 2px solid #000000; display: block; margin: 0 auto; cursor: url('https://cur.cursors-4u.net/others/cur-9.cur'), auto; /* Old school mouse cursor */ } .square { position: absolute; width: 50px; height: 50px; transition: transform 0.1s; border-radius: 10%; opacity: 0.9; } Merge 100 const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); let squares = []; let gravity = 0.1; class Square { constructor(x, y, level) { this.x = x; this.y = y; this.level = level; // Level of the square this.size = 50 + (level * 5); // Increase size based on level this.color = hsl(${Math.random() * 360}, 100%, 50%); this.vy = 0; // Velocity } draw() { ctx.fillStyle = this.color; ctx.fillRect(this.x, this.y, this.size, this.size); } update() { this.vy += gravity; this.y += this.vy; if (this.y + this.size > canvas.height) { this.y = canvas.height - this.size; this.vy *= -0.5; // Bounce back } } } function spawnSquare(level) { const x = Math.random() * (canvas.width - 50); squares.push(new Square(x, 0, level)); } canvas.addEventListener('mousedown', (e) => { const x = e.clientX - canvas.offsetLeft; const y = e.clientY - canvas.offsetTop; for (let i = squares.length - 1; i >= 0; i--) { const square = squares[i]; if (x >= square.x && x <= square.x + square.size && y >= square.y && y <= square.y + square.size) { square.vy = -5; // Throw the square up break; } } }); function mergeSquares() { const merged = []; squares.forEach((square, index) => { for (let j = index + 1; j < squares.length; j++) { const otherSquare = squares[j]; if (square.level === otherSquare.level && checkCollision(square, otherSquare)) { const newLevel = square.level + 1; const newSquare = new Square((square.x + otherSquare.x) / 2, square.y, newLevel); merged.push(newSquare); squares.splice(j, 1); // Remove merged square squares.splice(index, 1); // Remove this square break; } } }); merged.forEach(square => squares.push(square)); } function checkCollision(square1, square2) { return !(square1.x + square1.size < square2.x || square1.x > square2.x + square2.size || square1.y + square1.size < square2.y || square1.y > square2.y + square2.size); } function update() { ctx.clearRect(0, 0, canvas.width, canvas.height); squares.forEach(square => { square.update(); square.draw(); }); mergeSquares(); requestAnimationFrame(update); } // Spawn initial squares for (let i = 0; i < 10; i++) { spawnSquare(Math.floor(Math.random() * 5)); // Random level between 0 and 4 } update();