From b3b02a59ae51875aa3c6ae47e0793acaa022fe92 Mon Sep 17 00:00:00 2001 From: El Haddoury Younes Date: Wed, 21 Jan 2026 14:24:29 +0100 Subject: [PATCH] last commit implemented js file --- MainPage/.DS_Store | Bin 0 -> 6148 bytes MainPage/younes/Streichholzreatsel.css | 12 +--- MainPage/younes/Streichholzreatsel.html | 4 +- MainPage/younes/Streichholzreatsel.js | 89 ++++++++---------------- 4 files changed, 31 insertions(+), 74 deletions(-) create mode 100644 MainPage/.DS_Store diff --git a/MainPage/.DS_Store b/MainPage/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..adade906c56d1a225d34225873f306d12bac8167 GIT binary patch literal 6148 zcmeHK%}x|S5Uz$5WpF%X8}62N6Gp?saAs1VXZB zy?OBgd;k+q9`ynA=v5P6z>84j=D%2<90B!m?IA%gePYp z{WUWr&?myIwSKQo^K-YulCI^wTk^dy8Xo>a8X6PlnwpJfqt#fk*ZH;`IZ-*xIKh&5 zn&;eitGeSZcyv2wc29B^IUb{d4DbpRU6vnvtiZQ3yvz!rjJ1`)NE*qU*|)bhGCnqF zjou#LAGG%Fj0_K2H%D*n?-lP$)ryiWt>@b=w3{8BT^-#WJv}|W7yB-CUcQnuyId!~Q4GXNC%Mmqj9;cXvpvLm zr}Lc626PMS%trKiWP7`4>Z}QvqlG6&L-RW&^yxktkdrSf0l<{b8P=VL*2HwI)_zd6SCmfJA(o6cu02w4>WSpeQ1eqgCWR*DNsfur?zT~TV zJ`E&9{&Z^A9Yp^O`j*8cDt#5H_;bK>LKL@&f>J)3*%6*CYs@ED_ zI1rf`=h2yo{z4%#JC0k@9Y|VX+{X;W44h=3Q9YXC{=a|v_y5VD_$g)}X5gP

Allumettes Equation Infinite Levels

Klicke auf die Streichhölzer, um sie zu entfernen (sie werden weiß bzw. unsichtbar). -Mache die Gleichung wahr, indem du genau die vorgegebene Anzahl entfernst.
+ Mache die Gleichung wahr, indem du genau die vorgegebene Anzahl entfernst.
@@ -39,7 +39,7 @@ Mache die Gleichung wahr, indem du genau die vorgegebene Anzahl entfernst.
Goal: lösch N sodass die Gleichung WAHR wird. -Es ist nur das Entfernen erlaubt (kein Hinzufügen). Die Ziffern bestehen aus 7 Segmenten. + Es ist nur das Entfernen erlaubt (kein Hinzufügen). Die Ziffern bestehen aus 7 Segmenten. Der Generator garantiert, dass jedes Level lösbar ist (unendlich viele Level).
diff --git a/MainPage/younes/Streichholzreatsel.js b/MainPage/younes/Streichholzreatsel.js index f0dbb40..fe8e584 100644 --- a/MainPage/younes/Streichholzreatsel.js +++ b/MainPage/younes/Streichholzreatsel.js @@ -12,16 +12,16 @@ function maskFromSegments(list){ const DIGIT_MASK = [ - maskFromSegments(["a","b","c","d","e","f"]), // 0 - maskFromSegments(["b","c"]), // 1 - maskFromSegments(["a","b","d","e","g"]), // 2 - maskFromSegments(["a","b","c","d","g"]), // 3 - maskFromSegments(["b","c","f","g"]), // 4 - maskFromSegments(["a","c","d","f","g"]), // 5 - maskFromSegments(["a","c","d","e","f","g"]), // 6 - maskFromSegments(["a","b","c"]), // 7 - maskFromSegments(["a","b","c","d","e","f","g"]), // 8 - maskFromSegments(["a","b","c","d","f","g"]) // 9 + maskFromSegments(["a","b","c","d","e","f"]), + maskFromSegments(["b","c"]), + maskFromSegments(["a","b","d","e","g"]), + maskFromSegments(["a","b","c","d","g"]), + maskFromSegments(["b","c","f","g"]), + maskFromSegments(["a","c","d","f","g"]), + maskFromSegments(["a","c","d","e","f","g"]), + maskFromSegments(["a","b","c"]), + maskFromSegments(["a","b","c","d","e","f","g"]), + maskFromSegments(["a","b","c","d","f","g"]) ]; @@ -56,13 +56,12 @@ function pick(arr){ return arr[randInt(0, arr.length-1)]; } let level = 1; let targetRemove = 2; -let current = null; // {A,B,C} shown digits -let solution = null; // {A,B,C} target digits after removals +let current = null; +let solution = null; let removedSoFar = 0; -// Each segment element knows which digit/segment it belongs to -// We'll store: digitIndex (0..2 for A,B,C) and segName -let removedSet = new Set(); // keys like "0-a" meaning digit0 seg a removed + +let removedSet = new Set(); const elEq = document.getElementById("equation"); const elRemovedGrid = document.getElementById("removedGrid"); @@ -80,13 +79,12 @@ document.getElementById("btnNew").addEventListener("click", () => { generateLevel(); }); document.getElementById("btnReset").addEventListener("click", () => { - // reset current level state but keep the same puzzle + resetPlayState(); renderEquation(); updateTruthUI(); }); -// Turn mask into a set of active segment names function segmentsFromMask(mask){ const set = new Set(); for(let i=0;i<7;i++){ @@ -95,13 +93,11 @@ function segmentsFromMask(mask){ return set; } -// Compute displayed digit masks after removals function displayedMaskForDigit(digitValue, digitIndex){ let mask = DIGIT_MASK[digitValue]; for(const s of segNames){ const key = digitIndex + "-" + s; if(removedSet.has(key)){ - // remove the segment if it exists mask &= ~(1 << SEG[s]); } } @@ -110,11 +106,11 @@ function displayedMaskForDigit(digitValue, digitIndex){ function displayedDigitValue(digitValue, digitIndex){ const mask = displayedMaskForDigit(digitValue, digitIndex); - return MASK_TO_DIGIT.has(mask) ? MASK_TO_DIGIT.get(mask) : null; // null = invalid digit shape + return MASK_TO_DIGIT.has(mask) ? MASK_TO_DIGIT.get(mask) : null; } function equationIsTrue(){ - // get displayed digits; if any invalid => false + const a = displayedDigitValue(current.A, 0); const b = displayedDigitValue(current.B, 1); const c = displayedDigitValue(current.C, 2); @@ -128,7 +124,7 @@ function updateTruthUI(){ elTruthText.textContent = ok ? "Equation is TRUE" : "Equation is FALSE"; } -// Reset removals and removed pile + function resetPlayState(){ removedSet.clear(); removedSoFar = 0; @@ -141,7 +137,6 @@ function syncRemovedCounts(){ elPileCount.textContent = String(removedSoFar); } -// Render a digit as a 7-seg container with clickable match segments function renderDigit(digitValue, digitIndex, color){ const digit = document.createElement("div"); digit.className = "digit"; @@ -150,7 +145,7 @@ function renderDigit(digitValue, digitIndex, color){ const baseSegs = segmentsFromMask(baseMask); for(const s of segNames){ - if(!baseSegs.has(s)) continue; // no stick here in the original digit + if(!baseSegs.has(s)) continue; const seg = document.createElement("div"); seg.className = "seg " + s; @@ -161,16 +156,15 @@ function renderDigit(digitValue, digitIndex, color){ seg.addEventListener("click", () => { if(removedSet.has(key)) return; - // If player already removed target count, block further removes if(removedSoFar >= targetRemove) return; removedSet.add(key); removedSoFar++; - // visually remove from equation (turn white/invisible) + seg.classList.add("removed"); - // add to removed pile as a small colored bar + const clone = document.createElement("div"); clone.className = "removedSeg"; clone.style.background = color; @@ -179,12 +173,11 @@ function renderDigit(digitValue, digitIndex, color){ syncRemovedCounts(); updateTruthUI(); - // win condition if(removedSoFar === targetRemove){ if(equationIsTrue()){ - elHint.innerHTML = "✅ Solved! You removed exactly the target and made the equation true. Click New level."; + elHint.innerHTML = "Solved! You removed exactly the target and made the equation true. Click New level."; } else { - elHint.innerHTML = "❌ Not solved. You used all removals but the equation isn’t true. Click Reset level to try again."; + elHint.innerHTML = " Not solved. You used all removals but the equation isn’t true. Click Reset level to try again."; } } }); @@ -197,7 +190,6 @@ function renderDigit(digitValue, digitIndex, color){ function renderEquation(){ elEq.innerHTML = ""; - // color palette (A,B,C different) const colors = [ "linear-gradient(180deg,#ff6b6b,#d64545)", "linear-gradient(180deg,#6bcBff,#3a7bd5)", @@ -233,78 +225,57 @@ function renderEquation(){ updateTruthUI(); } -// -------- Infinite level generation algorithm -------- -// -// We generate a "solution equation" (A_s + B_s = C_s) valid in 0..9. -// Then we create the "shown equation" by turning each solution digit into a SUPERSET digit -// (i.e., add extra segments) so that the player can remove sticks to get back to the solution. -// We also ensure the shown equation is NOT already true. -// We finally choose a removal target N = total segments added across the 3 digits (or some bounded version). -// -// This guarantees solvable by removals only, for infinite levels. -// ----------------------------------------------------- + function generateLevel(){ resetPlayState(); - // Level difficulty curve: increase target removals slowly, but never explode. - // You can tweak this. Keeps it playable while still "infinite". + targetRemove = Math.min(2 + Math.floor(Math.log2(level + 1)), 6); - // Find a puzzle with exactly targetRemove removals needed to reach a true equation. - // We'll attempt random constructions until we hit the required N. + let tries = 0; while(true){ tries++; if(tries > 5000){ - // fallback: relax target a bit if extremely unlucky targetRemove = Math.max(2, targetRemove - 1); tries = 0; } - // 1) Pick a valid solution equation (A_s + B_s = C_s) const As = randInt(0, 9); const Bs = randInt(0, 9); const Cs = As + Bs; if(Cs < 0 || Cs > 9) continue; - // 2) For each digit, choose a "shown digit" that can be reduced to solution digit by removing sticks. - // i.e., shownMask is a superset of solutionMask. + const Achoices = superDigits(As); const Bchoices = superDigits(Bs); const Cchoices = superDigits(Cs); - // pick a random superset (could be itself) const Ashow = pick(Achoices); const Bshow = pick(Bchoices); const Cshow = pick(Cchoices); - // Count how many removals required to go from shown -> solution (sum removed bits) const need = popcount(DIGIT_MASK[Ashow] ^ DIGIT_MASK[As]) + popcount(DIGIT_MASK[Bshow] ^ DIGIT_MASK[Bs]) + popcount(DIGIT_MASK[Cshow] ^ DIGIT_MASK[Cs]); - // Require exactly targetRemove removals if(need !== targetRemove) continue; - // 3) Ensure the shown equation is not already true. - // (It might accidentally be true with different digit meanings.) + const shownTrue = (Ashow + Bshow) === Cshow; if(shownTrue) continue; - // Accept puzzle solution = { A: As, B: Bs, C: Cs }; current = { A: Ashow, B: Bshow, C: Cshow }; break; } - // UI labels elLvl.textContent = String(level); elTarget.textContent = String(targetRemove); elGoalN.textContent = String(targetRemove); - // Friendly hint (don’t reveal exact digits) elHint.innerHTML = `Level ${level}: Make the equation true by removing ${targetRemove} match(es). ` + `You can only remove sticks (click them).`; @@ -314,19 +285,15 @@ function generateLevel(){ updateTruthUI(); } -// Returns digits whose mask is a SUPERSET of base digit's mask (i.e., can remove to base) function superDigits(baseDigit){ const base = DIGIT_MASK[baseDigit]; const res = []; for(let d=0; d<=9; d++){ const m = DIGIT_MASK[d]; - // m must contain all base segments if((m & base) === base){ res.push(d); } } return res; } - -// Start generateLevel(); \ No newline at end of file