70 lines
2.1 KiB
JavaScript
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
|
|
};
|
|
}
|
|
|