From 0815657216eaa906d84c46dbe3c0d701809d7f94 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 03:18:01 +0000 Subject: [PATCH] Fix 2048 game over logic and KeyboardManager event removal Co-authored-by: anfernee <174200+anfernee@users.noreply.github.com> --- 2048.js | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/2048.js b/2048.js index 0c3f2c2..d3babe4 100644 --- a/2048.js +++ b/2048.js @@ -183,6 +183,19 @@ class Grid { return tiles } + moves_available() { + if (this.empty_tiles().length > 0) return true; + for (let i = 0; i < this.size; i++) { + for (let j = 0; j < this.size; j++) { + let t = this.grid[i][j]; + if (!t) return true; + if (i < this.size - 1 && this.grid[i+1][j] && this.grid[i+1][j].value === t.value) return true; + if (j < this.size - 1 && this.grid[i][j+1] && this.grid[i][j+1].value === t.value) return true; + } + } + return false; + } + iterations(dir) { let iters = []; for(let i = 0; i < this.size; i++) { @@ -301,7 +314,7 @@ class KeyboardManager { } remove(event) { - this.events.delete(event); + delete this.events[event]; } emit(event, data) { @@ -391,7 +404,8 @@ class Game { let moved = this.grid.move(dir); if (!moved) return; this.renderer.render(); - if (this.new_tile() == Game.GAME_OVER) { + this.new_tile(); + if (!this.grid.moves_available()) { this.keyboard.remove("move"); this.renderer.game_over(); }