2 Commits

Author SHA1 Message Date
d68c4a6c3d 1.9.4 2026-02-11 06:27:42 +01:00
23c9137985 fix: update win condition to validate hints instead of exact match 2026-02-11 06:27:42 +01:00
3 changed files with 51 additions and 11 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{ {
"name": "vue-nonograms-solid", "name": "vue-nonograms-solid",
"version": "1.9.3", "version": "1.9.4",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "vue-nonograms-solid", "name": "vue-nonograms-solid",
"version": "1.9.3", "version": "1.9.4",
"dependencies": { "dependencies": {
"fireworks-js": "^2.10.8", "fireworks-js": "^2.10.8",
"flag-icons": "^7.5.0", "flag-icons": "^7.5.0",

View File

@@ -1,6 +1,6 @@
{ {
"name": "vue-nonograms-solid", "name": "vue-nonograms-solid",
"version": "1.9.3", "version": "1.9.4",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",

View File

@@ -2,6 +2,34 @@ import { defineStore } from 'pinia';
import { ref, computed } from 'vue'; import { ref, computed } from 'vue';
import { generateRandomGrid } from '@/utils/puzzleUtils'; import { generateRandomGrid } from '@/utils/puzzleUtils';
// Helper: Calculate hints for a line (row or column)
function calculateHints(line) {
const hints = [];
let currentRun = 0;
for (const cell of line) {
if (cell === 1) {
currentRun++;
} else {
if (currentRun > 0) {
hints.push(currentRun);
currentRun = 0;
}
}
}
if (currentRun > 0) {
hints.push(currentRun);
}
return hints.length > 0 ? hints : [0];
}
// Helper: Validate if a line matches its hints
function validateLine(line, targetHints) {
const currentHints = calculateHints(line);
if (currentHints.length !== targetHints.length) return false;
return currentHints.every((h, i) => h === targetHints[i]);
}
// Definicje zagadek (Static Puzzles) // Definicje zagadek (Static Puzzles)
const PUZZLES = { const PUZZLES = {
easy: { easy: {
@@ -249,20 +277,32 @@ export const usePuzzleStore = defineStore('puzzle', () => {
function checkWin() { function checkWin() {
let correct = true; let correct = true;
// Calculate expected hints from solution (truth)
// We do this dynamically to ensure we always check against the rules of the board
const solutionRows = solution.value;
const solutionCols = Array(size.value).fill().map((_, c) => solution.value.map(r => r[c]));
// Check Rows
for (let r = 0; r < size.value; r++) { for (let r = 0; r < size.value; r++) {
for (let c = 0; c < size.value; c++) { const targetHints = calculateHints(solutionRows[r]);
const playerCell = playerGrid.value[r][c]; const playerLine = playerGrid.value[r];
const solutionCell = solution.value[r][c]; if (!validateLine(playerLine, targetHints)) {
correct = false;
const isFilled = playerCell === 1; break;
const shouldBeFilled = solutionCell === 1; }
}
if (isFilled !== shouldBeFilled) {
if (correct) {
// Check Columns
for (let c = 0; c < size.value; c++) {
const targetHints = calculateHints(solutionCols[c]);
const playerLine = playerGrid.value.map(row => row[c]);
if (!validateLine(playerLine, targetHints)) {
correct = false; correct = false;
break; break;
} }
} }
if (!correct) break;
} }
if (correct) { if (correct) {