numzoo / math_engine.py
goumsss's picture
Improve level experience: better status bar + level 5+ harder difficulty
ba16816
Raw
History Blame Contribute Delete
2.28 kB
import random
# Levels definition
# Targeting ages 9-10
def generate_question(level: int) -> tuple[str, int]:
"""
Returns (question_string, correct_answer) for the given level.
Levels:
1 - Additions (1–30)
2 - Subtractions (1–30, positive result)
3 - Multiplications (2Γ—2 … 9Γ—9)
4 - Mix (all of the above, up to 50)
5 - Hard Mix (2-digit additions/subtractions, 6×…12Γ— tables)
"""
if level == 1:
a = random.randint(1, 30)
b = random.randint(1, 30)
return f"{a} + {b}", a + b
elif level == 2:
a = random.randint(1, 30)
b = random.randint(1, a)
return f"{a} - {b}", a - b
elif level == 3:
a = random.randint(2, 9)
b = random.randint(2, 9)
return f"{a} Γ— {b}", a * b
elif level == 4: # Mix
op = random.choice(["add", "sub", "mul"])
if op == "add":
a = random.randint(10, 50)
b = random.randint(10, 50)
return f"{a} + {b}", a + b
elif op == "sub":
a = random.randint(10, 50)
b = random.randint(1, a)
return f"{a} - {b}", a - b
else:
a = random.randint(2, 12)
b = random.randint(2, 12)
return f"{a} Γ— {b}", a * b
else: # level 5+ β€” Hard Mix
op = random.choice(["add", "sub", "mul"])
if op == "add":
a = random.randint(10, 99)
b = random.randint(10, 99)
return f"{a} + {b}", a + b
elif op == "sub":
a = random.randint(20, 99)
b = random.randint(10, a - 10) # both operands β‰₯ 2 digits, result β‰₯ 10
return f"{a} - {b}", a - b
else:
a = random.randint(6, 12) # tables β‰₯ 6
b = random.randint(6, 12)
return f"{a} Γ— {b}", a * b
LEVEL_NAMES = {
1: "βž• Additions",
2: "βž– Subtractions",
3: "βœ–οΈ Multiplications",
4: "🎲 Mix",
}
LEVEL_THRESHOLDS = {1: 5, 2: 5, 3: 5, 4: 999}
def level_up_message(level: int) -> str:
messages = {
2: "πŸŽ‰ Next level!",
3: "🌟 Multiplications!",
4: "πŸ† Expert mode!",
}
return messages.get(level, "")