Skip to content

Commit 272e133

Browse files
feat: Port 'Number Sliding Puzzle' Game to the Web App
1 parent 65d1cee commit 272e133

7 files changed

Lines changed: 450 additions & 4 deletions

File tree

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ deactivate
234234

235235
## 🌐 Web App Catalog
236236

237-
The browser app currently exposes 38 projects:
237+
The browser app currently exposes 39 projects:
238238

239239
### Games
240240
- 2048 Game
@@ -255,6 +255,7 @@ The browser app currently exposes 38 projects:
255255
- Whack-a-Mole
256256
- Word Scramble
257257
- Spot the Difference
258+
- Number Sliding Puzzle
258259

259260
### Math
260261
- AP/GP/AGP/HP Recognizer
@@ -284,7 +285,6 @@ The browser app currently exposes 38 projects:
284285

285286
These standalone Python project files do not have a browser counterpart yet and are good future-port candidates:
286287

287-
- [games/Number-Sliding-Puzzle/Number-Sliding-Puzzle.py](games/Number-Sliding-Puzzle/Number-Sliding-Puzzle.py)
288288
- [games/Reverse-Hangman-Game/Reverse-Hangman-Game.py](games/Reverse-Hangman-Game/Reverse-Hangman-Game.py)
289289
- [games/War-Card-Game/War-Card-Game.py](games/War-Card-Game/War-Card-Game.py)
290290
- [math/Happy-Number/Happy-Number.py](math/Happy-Number/Happy-Number.py)
38.1 KB
Loading

web-app/games.html

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,25 @@
329329
<section class="projects-section" aria-label="Game Projects">
330330
<div class="container">
331331
<div class="projects-grid" id="projectsGrid">
332+
<div
333+
class="project-card"
334+
data-category="games"
335+
data-project="number-sliding-puzzle"
336+
>
337+
<img
338+
class="card-banner"
339+
src="assets/banners/number-sliding-puzzle.webp"
340+
alt="Number Sliding Puzzle"
341+
loading="lazy"
342+
/ loading="lazy">
343+
<div class="card-actions">
344+
<button class="btn-play" aria-label="Play Number Sliding Puzzle">Try It</button>
345+
</div>
346+
347+
<h3>Number Sliding Puzzle</h3>
348+
<p>Arrange numbers in ascending order by sliding them!</p>
349+
</div>
350+
332351
<div
333352
class="project-card"
334353
data-category="games"
@@ -712,6 +731,7 @@ <h3>Word Scramble</h3>
712731
<script defer src="js/projects/word-scramble.js"></script>
713732
<script defer src="js/projects/snake.js"></script>
714733
<script defer src="js/projects/spot-the-difference.js"></script>
734+
<script defer src="js/projects/number-sliding-puzzle.js"></script>
715735
<script defer src="js/projects.js"></script>
716736
<script defer src="https://unpkg.com/lucide@latest/dist/umd/lucide.js"></script>
717737
<script defer type="module" src="js/main.js"></script>

web-app/generate_banners.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,18 @@ def generate_banner(name, category, filename):
100100
y = 120 + (i // 2) * 120
101101
v_draw.rounded_rectangle([x, y, x + 140, y + 90], radius=12, fill=(255,255,255,8), outline=color_accent, width=2)
102102
v_draw.text((x + 70, y + 45), val, fill=color_accent, anchor="mm")
103+
elif "sliding" in n_lower or "puzzle" in n_lower:
104+
# Draw a 3x3 grid with sliding numbers
105+
for i in range(9):
106+
if i == 8: # Empty space
107+
continue
108+
r_idx = i // 3
109+
c_idx = i % 3
110+
x = 240 + c_idx * 110
111+
y = 120 + r_idx * 75
112+
val = str(i + 1)
113+
v_draw.rounded_rectangle([x, y, x + 90, y + 60], radius=10, fill=(255,255,255,12), outline=color_accent, width=2)
114+
v_draw.text((x + 45, y + 30), val, fill=color_accent, anchor="mm")
103115
elif "fibonacci" in n_lower:
104116
# Draw golden spiral
105117
cx, cy = 400, 225
@@ -534,6 +546,7 @@ def draw_o(ox, oy):
534546
("Progress Tracker", "utilities", "progress-tracker.webp"),
535547
("Reverse Hangman", "games", "reverse-hangman.webp"),
536548
("Chess Game", "games", "chess.webp"),
549+
("Number Sliding Puzzle", "games", "number-sliding-puzzle.webp"),
537550

538551
# MATH
539552
("AP/GP/AGP/HP Recognizer", "math", "progression-recognizer.webp"),

web-app/index.html

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,7 @@ <h3>Legal</h3>
872872
<script defer src="js/playground.js"></script>
873873
<script defer type="module" src="js/main.js"></script>
874874
<script defer src="js/hero-canvas.js"></script>
875+
<script defer src="js/projects/number-sliding-puzzle.js"></script>
875876
<script>
876877
lucide.createIcons();
877878
</script>
@@ -885,6 +886,13 @@ <h3>Legal</h3>
885886
// ALL projects from your js/projects/ folder
886887
const projectsData = [
887888
// GAMES (20+)
889+
{
890+
project: "number-sliding-puzzle",
891+
title: "Number Sliding Puzzle",
892+
category: "games",
893+
desc: "Arrange tiles in order by sliding them into empty space",
894+
tags: "game,puzzle,sliding,numbers",
895+
},
888896
{
889897
project: "2048-game",
890898
title: "2048 Game",

web-app/js/projects.js

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Project Registry
1+
// Project Registry
22
// Each project's HTML and logic lives in its own file under js/projects/
33

44
function getProjectHTML(projectName) {
@@ -1595,6 +1595,15 @@ function getProjectHTML(projectName) {
15951595

15961596
const projectInstructions = {
15971597
// GAMES
1598+
"number-sliding-puzzle": {
1599+
title: "🧩 How to Play Number Sliding Puzzle",
1600+
steps: [
1601+
"Use arrow keys (← ↑ → ↓) or click/tap on tiles next to the empty space to slide them.",
1602+
"Arrange the numbers in ascending order from 1 to 8, with the blank space at the bottom right.",
1603+
"A moves counter keeps track of your steps.",
1604+
"Click the Reset button to restart the game."
1605+
]
1606+
},
15981607
"2048-game": {
15991608
title: "🎮 How to Play 2048",
16001609
steps: [
@@ -3127,7 +3136,8 @@ function initializeProject(projectName) {
31273136
"color-palette": "initColorPalette",
31283137
"math-quiz": "initMathQuiz",
31293138
"resume-analyzer": "initResumeAnalyzer",
3130-
"caesar-cipher": "initCaesarCipher"
3139+
"caesar-cipher": "initCaesarCipher",
3140+
"number-sliding-puzzle": "initNumberSlidingPuzzle"
31313141
};
31323142

31333143
const initializerName = initializers[projectName];

0 commit comments

Comments
 (0)