 |
|
|
|
 |
 |
 |
 |
|
 |
 |
 |
 |
 |
Maxim6077 Bruchpilot

Anmeldungsdatum: 20.08.2025 Beiträge: 1
 |
Verfasst am: Mi Aug 20, 2025 5:43 pm Titel: Mathemakustik Python-Skript |
|
|
Hallo Gemeinde,
da dies mein erster Post ist, moechte ich mich vorerst fuer die zahlreichen Informationen bedanken.
Nun zum Thema:
Ich bin gerade in der Vorbereitung fuer meine EFA BU. Beim Kopfrechnen wiederholen sich die Aufgaben bekanntlich ja, weshalb die Vorbereitung darueber eher mittelmaessig ist. Nun hoert man oefters von Mathemakustik, einem Programm, welches dir fuer 20 Euro Mathematikaufgaben vorliest.
Da ich es allerdings nicht einsehe fuer so eine Lappalie Geld auszugeben, habe ich ein Pythonskript geschrieben, welches genau das auch kann.
Code: |
import random
import pyttsx3
import winsound
import threading
import time
from inputimeout import inputimeout, TimeoutOccurred
# ==============================
# ========== CONFIG ===========
# ==============================
NUM_TASKS = 25
ADD_MAX = 1000
SUB_MAX = 1000
MUL_MAX = 30
DIV_MAX = 30
TIME_LIMIT = 30
WARNING_BEFORE = 5
BEEP_FREQUENCY = 1000
BEEP_DURATION = 500
TTS_RATE = 135
DIFFICULTY = "hard" # "normal" oder "hard"
# ==============================
# TTS Funktion
# ==============================
def speak(text, rate=TTS_RATE):
engine = pyttsx3.init()
engine.setProperty('rate', rate)
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[0].id)
engine.say(text)
engine.runAndWait()
engine.stop()
# ==============================
# Signalton vor Ablauf
# ==============================
def warning_beep(stop_event, wait_time=TIME_LIMIT, frequency=BEEP_FREQUENCY, duration=BEEP_DURATION):
for _ in range(wait_time - WARNING_BEFORE):
if stop_event.is_set():
return
time.sleep(1)
if not stop_event.is_set():
winsound.Beep(frequency, duration)
# ==============================
# Aufgaben-Generator
# ==============================
def generate_task(task_type):
if task_type == "add":
a = random.randint(1, ADD_MAX)
b = random.randint(1, ADD_MAX)
expr = f"{a} plus {b}"
result = a + b
return expr, expr, result
elif task_type == "sub":
a = random.randint(1, SUB_MAX)
b = random.randint(1, SUB_MAX)
# 75% Chance, dass Ergebnis positiv, 25% Chance negativ
if random.random() <0> a:
a, b = b, a # gr??ere Zahl zuerst → positiv
# sonst a und b belassen → negativ m?glich
expr = f"{a} minus {b}"
spoken_expr = expr
result = a - b
return expr, spoken_expr, result
elif task_type == "mul":
a = random.randint(2, MUL_MAX)
b = random.randint(2, MUL_MAX)
expr = f"{a} mal {b}"
result = a * b
return expr, expr, result
elif task_type == "div":
# Ergebnis zwischen 1 und DIV_MAX
result = random.randint(2, DIV_MAX)
# Divisor b darf nicht 1 sein und nicht gleich dem Ergebnis
b_candidates = [x for x in range(2, DIV_MAX+1) if x != result]
b = random.choice(b_candidates)
a = result * b
expr = f"{a} geteilt durch {b}"
return expr, expr, result
# ==============================
# Trainingsdurchlauf
# ==============================
def run_training():
speak(f"Willkommen zum Kopfrechentraining. Es folgen {NUM_TASKS} Aufgaben.")
print(f"🔢 Kopfrechentraining gestartet ({NUM_TASKS} Aufgaben).")
print("Dr?cke Strg+C zum Abbrechen.n")
task_types = ["add", "sub", "mul", "div"] * (NUM_TASKS // 4)
while len(task_types) < NUM_TASKS:
task_types.append(random.choice(["add", "sub", "mul", "div"]))
random.shuffle(task_types)
correct = 0
total = len(task_types)
user_answers = []
for i, task_type in enumerate(task_types, 1):
expr, spoken_expr, result = generate_task(task_type)
if DIFFICULTY == "hard":
speak(f"{spoken_expr}") # nur TTS, keine sofortige R?ckmeldung
else:
speak(f"{spoken_expr}")
stop_event = threading.Event()
timer_thread = threading.Thread(target=warning_beep, args=(stop_event,))
timer_thread.daemon = True
timer_thread.start()
try:
user_input = inputimeout(prompt=f"({i}/{total}) Deine L?sung: ", timeout=TIME_LIMIT)
stop_event.set()
except TimeoutOccurred:
stop_event.set()
speak(f"Zeit abgelaufen.")
if DIFFICULTY == "normal":
print(f"⏰ Zeit abgelaufen → L?sung: {expr} = {result}n")
user_answers.append((expr, result, None))
continue
try:
user_result = float(user_input.replace(",", "."))
user_answers.append((expr, result, user_result))
if DIFFICULTY == "normal":
if abs(user_result - result) < 1e-6:
speak("Richtig!")
print(f"✅ Richtig! {expr} = {result}n")
correct += 1
else:
speak("Falsch.")
print(f"❌ Falsch → L?sung: {expr} = {result}n")
except ValueError:
speak("Ung?ltig.")
print("⚠️ Ung?ltige Eingabe.n")
user_answers.append((expr, result, None))
# ==============================
# Endauswertung
# ==============================
print("n📊 Endauswertung:")
for expr, result, user_result in user_answers:
if user_result is None:
status = "⏰ keine Eingabe"
display_input = "-"
elif abs(user_result - result) < 1e-6:
status = "✅ richtig"
display_input = user_result
correct += 1
else:
status = "❌ falsch"
display_input = user_result
print(f"{expr} → Deine Eingabe: {display_input}, {status}, L?sung: {result}")
percentage = (correct / total) * 100
speak(f"Training beendet. Du hast {correct} von {total} Aufgaben richtig.")
speak(f"Das sind {percentage:.1f} Prozent.")
print(f"n📊 Gesamt: {correct}/{total} richtig = {percentage:.1f}%")
# ==============================
# Hauptprogramm
# ==============================
def main():
while True:
run_training()
try:
again = input("nM?chtest du noch einmal trainieren? (j/n): ").strip().lower()
except KeyboardInterrupt:
print("nTraining beendet.")
break
if again != "j":
print("Training beendet.")
break
# ==============================
if __name__ == "__main__":
main()
|
Allerdings ist das Ganze noch nicht ganz und wuerde mich ueber Verbesserungsvorschlaege/Meinungen freuen.
Das Ganze ist auch als .exe verfuegbar.
Vielen Dank
Max |
|
Nach oben |
|
 |
|
|
 |
 |
 |
 |
 |
|
 |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|
|
 |