From 46ae62a335e5fc208f445852ff1a34a03f74b965 Mon Sep 17 00:00:00 2001 From: team3 Date: Wed, 24 Jun 2026 13:19:40 +0200 Subject: [PATCH] update --- frontend/src/components/BausteinPanel.vue | 43 +++++++++++++---------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/frontend/src/components/BausteinPanel.vue b/frontend/src/components/BausteinPanel.vue index 2989092..906c46c 100644 --- a/frontend/src/components/BausteinPanel.vue +++ b/frontend/src/components/BausteinPanel.vue @@ -236,13 +236,6 @@ function naechsterModus() { return imZufall.value ? MODI[Math.floor(Math.random() * MODI.length)] : aktiverModus.value } -// Modus-String eines Pool-Objekts (Form + Schwierigkeit) — Gegenstück zu MODI. -function modusVon(obj) { - if (obj.form === 'quiz') return obj.schwer ? 'quiz_schwer' : 'quiz_leicht' - if (obj.form === 'lueckentext') return obj.schwer ? 'lueck_schwer' : 'lueck_leicht' - return 'erklaeren' -} - // Ein Frage-Objekt eines bestimmten Modus generieren (aus gezogener Saat; Erklären hat Fallback). function frageEinzeln(modus = naechsterModus()) { const form = modus.startsWith('quiz') ? 'quiz' : modus.startsWith('lueck') ? 'lueckentext' : 'erklaeren' @@ -296,15 +289,31 @@ function poolFuellen() { } } -// Frage des gewünschten Modus holen: erst aus dem Cache, sonst gezielt erzeugen. -// So entscheidet der gewürfelte Modus über die Form — nicht das Generier-Tempo. -async function frageHolen(modus) { - const i = pool.value.findIndex((o) => modusVon(o) === modus) - if (i >= 0) return pool.value.splice(i, 1)[0] +// Eine Frage aus dem Pool ziehen — zufällig, nie die schnellste. +// Erstes Laden (Pool leer + nichts in Arbeit): 5 erzeugen, ALLE abwarten, dann ziehen. +async function frageZiehen() { + const ersteLadung = !pool.value.length && !inflight.value + poolFuellen() // bis zu 5 starten/halten pruefLoading.value = true - try { return await frageEinzeln(modus) } - catch { return null } - finally { pruefLoading.value = false } + try { + const missCap = musterModus.value ? Infinity : 3 + if (ersteLadung) { + // nur am Anfang: warten, bis alle 5 fertig sind (Tempo entscheidet nicht über die Form) + while ((inflight.value > 0 || pool.value.length < POOL_ZIEL) && poolMiss < missCap) { + if (!inflight.value) poolFuellen() + await new Promise((r) => setTimeout(r, 80)) + } + } else if (!pool.value.length) { + // Pool leergelaufen (schneller Nutzer): auf die erste fertige warten + while (!pool.value.length && (inflight.value > 0 || poolMiss < missCap)) { + if (!inflight.value) poolFuellen() + await new Promise((r) => setTimeout(r, 80)) + } + } + if (!pool.value.length) return null + const i = Math.floor(Math.random() * pool.value.length) + return pool.value.splice(i, 1)[0] + } finally { pruefLoading.value = false } } // Ein gezogenes Objekt der passenden Form anzeigen (Erklären-Bubble bzw. Quiz/Lück-Widget). @@ -329,9 +338,7 @@ async function naechsteFrageZeigen() { poolMiss = 0 pruefFehler.value = '' await musterLaden() - poolFuellen() // Cache im Hintergrund vorwärmen - const modus = naechsterModus() // Form vorab würfeln — unabhängig vom Tempo - const obj = await frageHolen(modus) + const obj = await frageZiehen() // erste Ladung: alle 5 abwarten; dann zufällig ziehen if (obj) { frageObjZeigen(obj) pruefScroll()