82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import { SHAPES, shapeToEmoji } from "./emoji.js";
 | 
						|
import { COLORS } from "./color.js";
 | 
						|
import { numberToEmoji } from "./number.js";
 | 
						|
 | 
						|
export let level = 1;
 | 
						|
 | 
						|
export function nextLevel() {
 | 
						|
  level = Math.min(level + 1, 3);
 | 
						|
}
 | 
						|
 | 
						|
export function resetLevel() {
 | 
						|
  level = 1;
 | 
						|
}
 | 
						|
 | 
						|
export function getGridSize(lvl = level) {
 | 
						|
  if (lvl <= 1) return 2;
 | 
						|
  if (lvl === 2) return 3;
 | 
						|
  return 4;
 | 
						|
}
 | 
						|
 | 
						|
export function getGridPositions(size) {
 | 
						|
  const positions = [];
 | 
						|
  for (let y = 0; y < size; y++) {
 | 
						|
    for (let x = 0; x < size; x++) {
 | 
						|
      positions.push([y, x]);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return positions;
 | 
						|
}
 | 
						|
 | 
						|
export function generateRandomTile(lvl = level) {
 | 
						|
  const gridSize = getGridSize(lvl);
 | 
						|
  const POSITIONS = getGridPositions(gridSize);
 | 
						|
  const index = Math.floor(Math.random() * POSITIONS.length);
 | 
						|
  const position = POSITIONS[index];
 | 
						|
 | 
						|
  return {
 | 
						|
    shape: SHAPES[Math.floor(Math.random() * SHAPES.length)],
 | 
						|
    color: COLORS[Math.floor(Math.random() * COLORS.length)],
 | 
						|
    number: Math.floor(Math.random() * 10),
 | 
						|
    position
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
export function mutateTile(tile, lvl = level) {
 | 
						|
  const dimensions = ["shape", "color", "number", "position"];
 | 
						|
  const changes = dimensions.filter(() => Math.random() < 0.5);
 | 
						|
 | 
						|
  const newTile = { ...tile };
 | 
						|
  const POSITIONS = getGridPositions(getGridSize(lvl));
 | 
						|
 | 
						|
  for (const dim of changes) {
 | 
						|
    switch (dim) {
 | 
						|
      case "shape":
 | 
						|
        newTile.shape = pickOther(SHAPES, tile.shape);
 | 
						|
        break;
 | 
						|
      case "color":
 | 
						|
        newTile.color = pickOther(COLORS, tile.color);
 | 
						|
        break;
 | 
						|
      case "number":
 | 
						|
        newTile.number = pickOther([...Array(10).keys()], tile.number);
 | 
						|
        break;
 | 
						|
      case "position":
 | 
						|
        newTile.position = pickOther(POSITIONS, tile.position);
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return newTile;
 | 
						|
}
 | 
						|
 | 
						|
function pickOther(arr, exclude) {
 | 
						|
  const options = arr.filter(x => JSON.stringify(x) !== JSON.stringify(exclude));
 | 
						|
  return options[Math.floor(Math.random() * options.length)];
 | 
						|
}
 | 
						|
 | 
						|
export function getChangedDimensions(a, b) {
 | 
						|
  return ["shape", "color", "number", "position"].filter(dim => {
 | 
						|
    return JSON.stringify(a[dim]) !== JSON.stringify(b[dim]);
 | 
						|
  });
 | 
						|
}
 | 
						|
 |