Initial commit: Zabavna Matematika web and Android app.

Kids math practice (SL/EN) in a Vite React app, wrapped with Capacitor for Android (net.bit76.matematika). Includes session refactor, i18n, and text-free difficulty icons with translated overlays.
This commit is contained in:
2026-08-15 10:59:25 +02:00
commit 6e85917f73
147 changed files with 9190 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
# Math Game Difficulty Levels
This document describes **how the game works today**.
Difficulty changes **how the player answers** and some number caps.
The player still chooses **which operations** to practice in Settings (`+`, ``, `×`, `÷`).
---
## Overview
Three difficulties:
| Key | Label | Input | Timer |
|---|---|---|---|
| `easy` | Lahko | 4 multiple-choice buttons | Stopwatch (on) |
| `medium` | Srednje | 6 multiple-choice buttons | Stopwatch (on) |
| `hard` | Težko | Numeric keypad + OK | Stopwatch (on) |
Settings also choose:
- Which operations are active
- How many questions (`stevilo_racunov`)
- Add/subtract range (`max_number`)
- Multiplication factors (`za_mnozenje`)
- Division divisors (`za_deljenje`)
---
## Easy (`easy` / Lahko)
- Input: **4 choices**
- Timer: stopwatch, enabled
- Negatives: not allowed
- Multiply other-factor cap: **110**
- Add/subtract range: from settings (`max_number`)
---
## Medium (`medium` / Srednje)
- Input: **6 choices**
- Timer: stopwatch, enabled
- Negatives: not allowed
- Multiply other-factor cap: **112**
- Add/subtract range: from settings (`max_number`)
---
## Hard (`hard` / Težko)
- Input: **keypad** (digits, backspace, `OK`; `±` only if `allowNegative` is on)
- No multiple-choice buttons
- Timer: stopwatch, enabled
- Negatives: **off** (`allowNegative: false`) unless flipped later in `levels.js`
- Multiply other-factor cap: **120**
- Add/subtract range: from settings (`max_number`)
- Division: exact results only
---
## Code map
```js
// web/src/levels.js
LEVELS = {
easy: { inputType: 'choices', choicesCount: 4, timerEnabled: true, allowNegative: false, multiplicationMaxA: 10 },
medium: { inputType: 'choices', choicesCount: 6, timerEnabled: true, allowNegative: false, multiplicationMaxA: 12 },
hard: { inputType: 'keypad', choicesCount: 0, timerEnabled: true, allowNegative: false, multiplicationMaxA: 20 }
}
```
Questions are built by `buildSession(config, level)` in `web/src/questionGenerator.js`.
The Game screen only renders `question.text` and checks `question.result`.
---
## Design principles
- Difficulty increases interaction complexity, not intimidation
- Same play screen, different answer component
- Hard is framed as a challenge, not a punishment
- Unfinished modes (rounding, dice, calculator, equations, text problems) are **not** in the live path