Files
2025-04-13 17:31:30 +02:00

70 lines
2.1 KiB
JavaScript

import { SHAPES } from "./emoji.js";
export function generateRandomTiles(gridSize = 4, shapePoolSize = 4, numberPoolSize = 5) {
const totalTiles = gridSize * gridSize;
const shapes = SHAPES.sort(() => 0.5 - Math.random()).slice(0, shapePoolSize);
const numbers = Array.from({ length: numberPoolSize }, (_, i) => i + 1);
const positions = getGridPositions(gridSize);
const tiles = Array.from({ length: totalTiles }, (_, i) => ({
shape: shapes[Math.floor(Math.random() * shapes.length)],
number: numbers[Math.floor(Math.random() * numbers.length)],
position: positions[i]
}));
return tiles;
}
export function createModifiedTiles(originalTiles, changes = 2) {
const newTiles = originalTiles.map(t => ({ ...t }));
const changeIndices = new Set();
while (changeIndices.size < changes) {
changeIndices.add(Math.floor(Math.random() * newTiles.length));
}
for (const index of changeIndices) {
let newShape;
do {
newShape = SHAPES[Math.floor(Math.random() * SHAPES.length)];
} while (newShape === newTiles[index].shape);
newTiles[index].shape = newShape;
}
return { modifiedTiles: newTiles, changedIndices: [...changeIndices] };
}
export function getGridPositions(gridSize) {
const positions = [];
for (let row = 0; row < gridSize; row++) {
for (let col = 0; col < gridSize; col++) {
positions.push([row, col]);
}
}
return positions;
}
export function getTileFeedback(index, selected, changed) {
if (selected.includes(index) && changed.includes(index)) return "correct";
if (selected.includes(index) && !changed.includes(index)) return "wrong";
if (!selected.includes(index) && changed.includes(index)) return "missed";
return null;
}
export function calculateScore(selected, correct) {
const correctSet = new Set(correct);
const selectedSet = new Set(selected);
const correctGuesses = selected.filter(i => correctSet.has(i));
const wrongGuesses = selected.filter(i => !correctSet.has(i));
const missed = correct.filter(i => !selectedSet.has(i));
return {
correctGuesses,
wrongGuesses,
missed,
score: correctGuesses.length - wrongGuesses.length
};
}