From fefe437f0f0b35c9e9725d41c45c6e4dffc2a4de Mon Sep 17 00:00:00 2001 From: R524809 Date: Mon, 15 Dec 2025 17:00:06 +0800 Subject: [PATCH] =?UTF-8?q?feat:2.5.0=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=93?= =?UTF-8?q?=E6=B3=A8=E5=90=AF=E8=92=99=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- miniprogram/app.json | 15 +- miniprogram/constants/colors.ts | 34 - miniprogram/constants/focusFunctions.ts | 32 +- miniprogram/constants/mathFunctions.ts | 34 + .../focusPages/gridDrawing/gridDrawing.ts | 66 +- .../shape/shape.json} | 2 +- .../shape/shape.less} | 0 .../index.ts => focusPages/shape/shape.ts} | 0 .../shape/shape.wxml} | 2 +- .../shared/common/focusPageMixin.ts | 20 +- .../focusPages/shared/service/gridDraw.ts | 101 +- .../focusPages/shared/shapes/gridShapes3x3.ts | 775 ++++++- .../focusPages/shared/shapes/gridShapes5x5.ts | 1148 +++++++++-- .../focusPages/shared/shapes/gridShapes7x7.ts | 1822 ++++++++++++++--- .../focusPages/shared/types/gridTypes.ts | 14 - .../focusPages/shared/utils/gridUtils.ts | 11 +- .../mathPages/missingNumber/missingNumber.ts | 2 +- .../shared/service/countMatchContentDraw.ts | 2 +- .../service/countingSelectContentDraw.ts | 2 +- .../shared/service/numberColorContentDraw.ts | 2 +- .../service/numberDecomposeContentDraw.ts | 2 +- .../shared/service/numberPreviewDraw.ts | 14 +- miniprogram/pages/focusIndex/focusIndex.json | 2 +- miniprogram/pages/focusIndex/focusIndex.ts | 7 +- miniprogram/pages/focusIndex/focusIndex.wxml | 4 +- miniprogram/pages/mathIndex/mathIndex.json | 2 +- miniprogram/service/README.md | 2 +- miniprogram/utils/tracker.ts | 30 +- project.private.config.json | 18 +- 29 files changed, 3465 insertions(+), 700 deletions(-) rename miniprogram/{pages/shape/index.json => focusPages/shape/shape.json} (92%) rename miniprogram/{pages/shape/index.less => focusPages/shape/shape.less} (100%) rename miniprogram/{pages/shape/index.ts => focusPages/shape/shape.ts} (100%) rename miniprogram/{pages/shape/index.wxml => focusPages/shape/shape.wxml} (97%) diff --git a/miniprogram/app.json b/miniprogram/app.json index 63b59a8..ac75aa0 100644 --- a/miniprogram/app.json +++ b/miniprogram/app.json @@ -3,7 +3,6 @@ "pages/mathIndex/mathIndex", "pages/focusIndex/focusIndex", "pages/index/index", - "pages/shape/index", "pages/copyBook/copyBook", "pages/debug/debug" ], @@ -25,7 +24,7 @@ { "root": "focusPages", "name": "focusPages", - "pages": ["gridDrawing/gridDrawing"], + "pages": ["gridDrawing/gridDrawing", "shape/shape"], "independent": false } ], @@ -71,9 +70,9 @@ }, { "pagePath": "pages/focusIndex/focusIndex", - "iconPath": "assets/tabBar/icon-word.png", - "selectedIconPath": "assets/tabBar/icon-word-active.png", - "text": "专注力" + "iconPath": "assets/tabBar/icon-shape.png", + "selectedIconPath": "assets/tabBar/icon-shape-active.png", + "text": "专注启蒙" }, { "pagePath": "pages/index/index", @@ -81,12 +80,6 @@ "selectedIconPath": "assets/tabBar/icon-word-active.png", "text": "识字" }, - { - "pagePath": "pages/shape/index", - "iconPath": "assets/tabBar/icon-shape.png", - "selectedIconPath": "assets/tabBar/icon-shape-active.png", - "text": "图形" - }, { "pagePath": "pages/copyBook/copyBook", "iconPath": "assets/tabBar/icon-edit.png", diff --git a/miniprogram/constants/colors.ts b/miniprogram/constants/colors.ts index c31e12e..cd0689c 100644 --- a/miniprogram/constants/colors.ts +++ b/miniprogram/constants/colors.ts @@ -85,40 +85,6 @@ export const WATER_COLORS = { ], }; -/** - * 数字颜色映射(柔和12色) - * 用于数学页面的数字显示和涂色 - */ -export const NUMBER_COLORS: Record = { - 1: '#ED6D50', // 柔和红色 - 2: '#F9A857', // 柔和橙色 - 3: '#FFE176', // 柔和黄色 - 4: '#B2D94B', // 柔和黄绿色 - 5: '#53D1B6', // 柔和绿色 - 6: '#6CD2EA', // 柔和青色 - 7: '#79A7ED', // 柔和蓝色 - 8: '#9C98DE', // 柔和紫色 - 9: '#F2A4C0', // 柔和粉色 - 10: '#FC9B6C', // 柔和橙红色 - 11: '#BC8F71', // 柔和棕色 - 12: '#666666', // 柔和黑灰 -}; - -/** - * 获取所有数字颜色数组 - */ -export function getNumberColors(): string[] { - return Object.values(NUMBER_COLORS); -} - -/** - * 随机获取一个数字颜色 - */ -export function getRandomNumberColor(): string { - const colors = getNumberColors(); - return colors[Math.floor(Math.random() * colors.length)]; -} - export const PAPER_SIZE = { A4: { // width: 2480, diff --git a/miniprogram/constants/focusFunctions.ts b/miniprogram/constants/focusFunctions.ts index 55f67ea..953a074 100644 --- a/miniprogram/constants/focusFunctions.ts +++ b/miniprogram/constants/focusFunctions.ts @@ -4,15 +4,41 @@ export interface FocusFunctionType { title: string; desc: string; icon: string; + mode?: string; // 用于传递默认模式参数,如 '3x3', '5x5', '7x7' } export const FOCUS_FUNCTION_TYPES: FocusFunctionType[] = [ + // 形状识别 + { + id: 'shape-recognition', + page: 'shape', + title: '识别形状', + desc: '识别形状,涂一涂', + icon: '🔍', + }, // 格子仿画 { - id: 'grid-drawing', + id: 'grid-drawing-3x3', page: 'gridDrawing', - title: '格子仿画', - desc: '在网格中填充颜色,形成各种形状', + title: '格子仿画 3x3', + desc: '🎯 简单有趣,培养专注力', icon: '🎨', + mode: '3x3', + }, + { + id: 'grid-drawing-5x5', + page: 'gridDrawing', + title: '格子仿画 5x5', + desc: '✨ 创意挑战,提升观察力', + icon: '🎨', + mode: '5x5', + }, + { + id: 'grid-drawing-7x7', + page: 'gridDrawing', + title: '格子仿画 7x7', + desc: '🌟 大师挑战,锻炼耐心', + icon: '🎨', + mode: '7x7', }, ]; diff --git a/miniprogram/constants/mathFunctions.ts b/miniprogram/constants/mathFunctions.ts index d586c6f..e5eb920 100644 --- a/miniprogram/constants/mathFunctions.ts +++ b/miniprogram/constants/mathFunctions.ts @@ -110,3 +110,37 @@ export const MATH_FUNCTION_TYPES: MathFunctionType[] = [ icon: '🔢', }, ]; + +/** + * 数字颜色映射(柔和12色) + * 用于数学页面的数字显示和涂色 + */ +export const NUMBER_COLORS: Record = { + 1: '#ED6D50', // 柔和红色 + 2: '#F9A857', // 柔和橙色 + 3: '#FFE176', // 柔和黄色 + 4: '#B2D94B', // 柔和黄绿色 + 5: '#53D1B6', // 柔和绿色 + 6: '#6CD2EA', // 柔和青色 + 7: '#79A7ED', // 柔和蓝色 + 8: '#9C98DE', // 柔和紫色 + 9: '#F2A4C0', // 柔和粉色 + 10: '#FC9B6C', // 柔和橙红色 + 11: '#BC8F71', // 柔和棕色 + 12: '#666666', // 柔和黑灰 +}; + +/** + * 获取所有数字颜色数组 + */ +export function getNumberColors(): string[] { + return Object.values(NUMBER_COLORS); +} + +/** + * 随机获取一个数字颜色 + */ +export function getRandomNumberColor(): string { + const colors = getNumberColors(); + return colors[Math.floor(Math.random() * colors.length)]; +} diff --git a/miniprogram/focusPages/gridDrawing/gridDrawing.ts b/miniprogram/focusPages/gridDrawing/gridDrawing.ts index 81039b5..eef48f1 100644 --- a/miniprogram/focusPages/gridDrawing/gridDrawing.ts +++ b/miniprogram/focusPages/gridDrawing/gridDrawing.ts @@ -7,6 +7,7 @@ import { ALL_5X5_SHAPES } from '../shared/shapes/gridShapes5x5'; import { ALL_7X7_SHAPES } from '../shared/shapes/gridShapes7x7'; import { ShapeTemplate, GridCell } from '../shared/types/gridTypes'; import { GridConfig } from '../shared/types/gridTypes'; +import { FOCUS_FUNCTION_TYPES } from '../../constants/focusFunctions'; createFocusPage({ canvas: null as Canvas | null, @@ -17,12 +18,13 @@ createFocusPage({ gridData: null as GridDrawingData | null, data: { - pageTitle: '格子仿画', + pageTitle: '格子仿画 5×5', functionId: '', hasContent: false, showShareDialog: false, currentMode: '3x3', // '3x3', '5x5', '7x7' currentModeName: '3×3', + subTitle: '', // 副标题,从配置中获取 typeActions: [ { name: '3×3', value: '3x3' }, { name: '5×5', value: '5x5' }, @@ -30,10 +32,30 @@ createFocusPage({ ], }, - onLoad(options: { id?: string }) { + onLoad(options: { id?: string; mode?: string }) { const functionId = options.id || 'grid-drawing'; + const mode = options.mode || '3x3'; // 从参数中读取 mode,默认为 '3x3' + + // 根据 mode 设置对应的模式名称 + const modeNameMap: Record = { + '3x3': '3×3', + '5x5': '5×5', + '7x7': '7×7', + }; + const currentModeName = modeNameMap[mode] || '3×3'; + + // 根据 mode 查找配置,获取 desc 作为 subTitle + const configItem = FOCUS_FUNCTION_TYPES.find( + (item) => item.mode === mode && item.id?.startsWith('grid-drawing'), + ); + const subTitle = configItem?.desc || '在网格中填充颜色,形成各种形状'; + this.setData({ + pageTitle: `格子仿画 ${mode}`, functionId, + currentMode: mode, + currentModeName, + subTitle, }); this.initPageInfo(functionId, '格子仿画'); }, @@ -48,7 +70,9 @@ createFocusPage({ return new GridDraw(canvas, ctx, options); }, drawServiceOptions: { - subTitle: '在网格中填充颜色,形成各种形状', + title: this.data.pageTitle, + subTitle: + this.data.subTitle || '在网格中填充颜色,形成各种形状', functionId: this.data.functionId, }, onCanvasReady: () => { @@ -67,11 +91,6 @@ createFocusPage({ } try { - // 更新 Header 的 Title - if (this.drawService) { - this.drawService.options.title = this.data.currentModeName; - } - await this.drawService.draw(this.gridData); this.setData({ hasContent: true }); } catch (error) { @@ -129,7 +148,7 @@ createFocusPage({ for (let i = 0; i < count; i++) { const shapeIndex = i % availableShapes.length; const shape = availableShapes[shapeIndex]; - const cells = generateCompletePattern(shape); + const cells = generateCompletePattern(shape, config); // 生成图案签名 const patternSignature = cells @@ -152,7 +171,10 @@ createFocusPage({ let found = false; for (let j = 0; j < availableShapes.length; j++) { const nextShape = availableShapes[j]; - const nextCells = generateCompletePattern(nextShape); + const nextCells = generateCompletePattern( + nextShape, + config, + ); const nextSignature = nextCells .map((c) => `${c.x},${c.y},${c.color}`) .sort() @@ -205,12 +227,12 @@ createFocusPage({ allShapes = ALL_3X3_SHAPES; config = { rows: 3, cols: 3 }; groupsPerRow = 2; // 每行2组 - totalRows = 3; // 总共3行 + totalRows = 4; // 总共3行 } else if (mode === '5x5') { allShapes = ALL_5X5_SHAPES; config = { rows: 5, cols: 5 }; groupsPerRow = 2; - totalRows = 2; // 5x5可以展示2行 + totalRows = 4; // 5x5可以展示2行 } else { // 7x7 allShapes = ALL_7X7_SHAPES; @@ -240,10 +262,30 @@ createFocusPage({ /** 选择类型 */ onSelectType(event: any) { const { name, value } = event.detail; + + // 根据 mode 查找配置,获取 desc 作为 subTitle + const configItem = FOCUS_FUNCTION_TYPES.find( + (item) => + item.mode === value && item.id?.startsWith('grid-drawing'), + ); + + const pageTitle = `格子仿画 ${value}`; + const subTitle = configItem?.desc || '在网格中填充颜色,形成各种形状'; + + // 更新 pageTitle、currentMode、currentModeName 和 subTitle this.setData({ + pageTitle, currentMode: value, currentModeName: name, + subTitle, }); + + // 更新绘制服务的 title 和 subTitle + if (this.drawService) { + this.drawService.options.title = pageTitle; + this.drawService.options.subTitle = subTitle; + } + // 重新生成数据 this.onRandom(); }, diff --git a/miniprogram/pages/shape/index.json b/miniprogram/focusPages/shape/shape.json similarity index 92% rename from miniprogram/pages/shape/index.json rename to miniprogram/focusPages/shape/shape.json index 9010176..ff5baac 100644 --- a/miniprogram/pages/shape/index.json +++ b/miniprogram/focusPages/shape/shape.json @@ -1,5 +1,5 @@ { - "navigationBarTitleText": "涂鸦丫-认识图形", + "navigationBarTitleText": "识别图形,涂一涂", "navigationBarBackgroundColor": "#FFD719", "homeButton": true, "backgroundColor": "#F6F6F6", diff --git a/miniprogram/pages/shape/index.less b/miniprogram/focusPages/shape/shape.less similarity index 100% rename from miniprogram/pages/shape/index.less rename to miniprogram/focusPages/shape/shape.less diff --git a/miniprogram/pages/shape/index.ts b/miniprogram/focusPages/shape/shape.ts similarity index 100% rename from miniprogram/pages/shape/index.ts rename to miniprogram/focusPages/shape/shape.ts diff --git a/miniprogram/pages/shape/index.wxml b/miniprogram/focusPages/shape/shape.wxml similarity index 97% rename from miniprogram/pages/shape/index.wxml rename to miniprogram/focusPages/shape/shape.wxml index bf4b6a9..fd0a296 100644 --- a/miniprogram/pages/shape/index.wxml +++ b/miniprogram/focusPages/shape/shape.wxml @@ -1,6 +1,6 @@ - 自定义涂鸦卡 + 识别图形,涂一涂 { - const { ctx, gridData, canvasWidth, startY } = params; + const { ctx, gridData, canvasWidth } = params; + let { startY } = params; const { config, groups, groupsPerRow, totalRows } = gridData; const { rows, cols } = config; + startY = startY + 30; + // 计算网格尺寸 const margin = 40; // 左右边距 - const groupSpacing = 20; // 组之间的间距 - const rowSpacing = 30; // 行之间的间距 - const dividerWidth = 2; // 分割线宽度 + const gridSpacing = 20; // 填充网格和空网格之间的间距 + const groupSpacing = 40; // 两组之间的间距(一行中两组格子仿画中间) + const rowSpacing = 50; // 行之间的间距 + const dividerWidth = 1; // 分割线宽度 // 计算每组网格的尺寸 const availableWidth = canvasWidth - margin * 2; - const totalGroupsPerRow = groupsPerRow * 2; // 每组包含填充和空两个网格 - const groupWidth = + const totalGridsPerRow = groupsPerRow * 2; // 每组包含填充和空两个网格 + const gridWidth = (availableWidth - - (groupsPerRow - 1) * dividerWidth - - (totalGroupsPerRow - 1) * groupSpacing) / - totalGroupsPerRow; - const cellSize = Math.floor(groupWidth / cols); - const gridWidth = cellSize * cols; + (groupsPerRow - 1) * groupSpacing - + (totalGridsPerRow - 1) * gridSpacing) / + totalGridsPerRow; + const cellSize = Math.floor(gridWidth / cols); + const actualGridWidth = cellSize * cols; const gridHeight = cellSize * rows; - let currentY = startY + 30; // 顶部间距 + const firstRowStartY = startY + 30; // 顶部间距 + const lastRowEndY = + firstRowStartY + + totalRows * gridHeight + + (totalRows - 1) * rowSpacing; + + // 计算第一行的起始X位置(居中) + const rowTotalWidth = + totalGridsPerRow * actualGridWidth + + (totalGridsPerRow - 1) * gridSpacing + + (groupsPerRow - 1) * groupSpacing; + const rowStartX = margin + (availableWidth - rowTotalWidth) / 2; + + // 计算中间垂直分割线的X位置(两组之间的位置) + const middleDividerX = + groupsPerRow > 1 + ? rowStartX + + actualGridWidth + + gridSpacing + + actualGridWidth + + groupSpacing / 2 + : null; // 遍历每一行 for (let rowIndex = 0; rowIndex < totalRows; rowIndex++) { @@ -116,13 +141,8 @@ class GridDraw extends BaseDrawService { rowStartIndex + groupsPerRow, ); - // 计算当前行的起始X位置(居中) - const rowTotalWidth = - totalGroupsPerRow * gridWidth + - (totalGroupsPerRow - 1) * groupSpacing + - (groupsPerRow - 1) * dividerWidth; - const rowStartX = margin + (availableWidth - rowTotalWidth) / 2; - + const currentY = + firstRowStartY + rowIndex * (gridHeight + rowSpacing); let currentX = rowStartX; // 遍历当前行的每一组 @@ -138,7 +158,7 @@ class GridDraw extends BaseDrawService { ctx, gridStartX: currentX, gridStartY: currentY, - gridWidth, + gridWidth: actualGridWidth, gridHeight, cellSize, rows, @@ -147,14 +167,14 @@ class GridDraw extends BaseDrawService { config, }); - currentX += gridWidth + groupSpacing; + currentX += actualGridWidth + gridSpacing; // 绘制空的网格(右侧) this.drawSingleGrid({ ctx, gridStartX: currentX, gridStartY: currentY, - gridWidth, + gridWidth: actualGridWidth, gridHeight, cellSize, rows, @@ -163,32 +183,39 @@ class GridDraw extends BaseDrawService { config, }); - currentX += gridWidth; + currentX += actualGridWidth; - // 如果不是最后一组,绘制垂直分割线 + // 如果不是最后一组,添加组间距 if (groupIndex < rowGroups.length - 1) { - ctx.strokeStyle = '#000000'; - ctx.lineWidth = dividerWidth; - ctx.beginPath(); - ctx.moveTo(currentX, currentY); - ctx.lineTo(currentX, currentY + gridHeight); - ctx.stroke(); - currentX += dividerWidth; + currentX += groupSpacing; } } - currentY += gridHeight + rowSpacing; - // 如果不是最后一行,绘制水平分割线 if (rowIndex < totalRows - 1) { - ctx.strokeStyle = '#000000'; + const lineY = currentY + gridHeight + rowSpacing / 2; + ctx.strokeStyle = '#999'; ctx.lineWidth = dividerWidth; + ctx.setLineDash([4, 4]); // 虚线 ctx.beginPath(); - ctx.moveTo(margin, currentY - rowSpacing / 2); - ctx.lineTo(canvasWidth - margin, currentY - rowSpacing / 2); + ctx.moveTo(margin, lineY); + ctx.lineTo(canvasWidth - margin, lineY); ctx.stroke(); + ctx.setLineDash([]); // 重置为实线 } } + + // 绘制中间垂直分割线(贯穿所有行) + if (middleDividerX !== null && groupsPerRow > 1) { + ctx.strokeStyle = '#999'; + ctx.lineWidth = dividerWidth; + ctx.setLineDash([4, 4]); // 虚线 + ctx.beginPath(); + ctx.moveTo(middleDividerX, firstRowStartY); + ctx.lineTo(middleDividerX, lastRowEndY); + ctx.stroke(); + ctx.setLineDash([]); // 重置为实线 + } } /** @@ -220,7 +247,7 @@ class GridDraw extends BaseDrawService { } = params; // 绘制网格线 - ctx.strokeStyle = config.gridLineColor || '#000000'; + ctx.strokeStyle = config.gridLineColor || '#999'; ctx.lineWidth = config.gridLineWidth || 1; ctx.setLineDash([]); // 实线 diff --git a/miniprogram/focusPages/shared/shapes/gridShapes3x3.ts b/miniprogram/focusPages/shared/shapes/gridShapes3x3.ts index ea96a5e..26c8164 100644 --- a/miniprogram/focusPages/shared/shapes/gridShapes3x3.ts +++ b/miniprogram/focusPages/shared/shapes/gridShapes3x3.ts @@ -3,109 +3,686 @@ * 适用于入门级,低龄儿童 */ -import { GridCell, ShapeTemplate } from '../types/gridTypes'; +import { ShapeTemplate } from '../types/gridTypes'; // ==================== 3x3 形状模板 ==================== -/** 简单十字形 */ -export const CROSS_3X3: ShapeTemplate = { - id: 'cross-3x3-001', - name: '十字形', - recommendedSize: { rows: 3, cols: 3 }, - category: 'geometric', - difficulty: 1, - supportSymmetry: true, - symmetryType: 'both', - isComplete: true, - cells: [ - { x: 1, y: 0, color: '#FFFF00' }, // 顶部 - { x: 0, y: 1, color: '#FFFF00' }, // 左侧 - { x: 1, y: 1, color: '#FFFF00' }, // 中心 - { x: 2, y: 1, color: '#FFFF00' }, // 右侧 - { x: 1, y: 2, color: '#FFFF00' }, // 底部 - ], -}; - -/** L形 */ -export const L_SHAPE_3X3: ShapeTemplate = { - id: 'l-3x3-001', - name: 'L形', - recommendedSize: { rows: 3, cols: 3 }, - category: 'geometric', - difficulty: 1, - supportSymmetry: false, - isComplete: true, - cells: [ - { x: 0, y: 0, color: '#0000FF' }, - { x: 0, y: 1, color: '#0000FF' }, - { x: 0, y: 2, color: '#0000FF' }, - { x: 1, y: 2, color: '#0000FF' }, - { x: 2, y: 2, color: '#0000FF' }, - ], -}; - -/** 对角线 */ -export const DIAGONAL_3X3: ShapeTemplate = { - id: 'diagonal-3x3-001', - name: '对角线', - recommendedSize: { rows: 3, cols: 3 }, - category: 'geometric', - difficulty: 1, - supportSymmetry: true, - symmetryType: 'both', - isComplete: true, - cells: [ - { x: 0, y: 0, color: '#FF0000' }, - { x: 1, y: 1, color: '#FF0000' }, - { x: 2, y: 2, color: '#FF0000' }, - ], -}; - -/** 小房子 */ -export const HOUSE_3X3: ShapeTemplate = { - id: 'house-3x3-001', - name: '小房子', - recommendedSize: { rows: 3, cols: 3 }, - category: 'object', - difficulty: 1, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: true, - cells: [ - { x: 1, y: 0, color: '#FF0000' }, // 屋顶 - { x: 0, y: 1, color: '#FFFF00' }, // 左侧墙 - { x: 1, y: 1, color: '#FFFF00' }, // 中间墙 - { x: 2, y: 1, color: '#FFFF00' }, // 右侧墙 - { x: 1, y: 2, color: '#8B4513' }, // 门 - ], -}; - -/** 小星星 */ -export const STAR_3X3: ShapeTemplate = { - id: 'star-3x3-001', - name: '小星星', - recommendedSize: { rows: 3, cols: 3 }, - category: 'geometric', - difficulty: 1, - supportSymmetry: true, - symmetryType: 'both', - isComplete: true, - cells: [ - { x: 1, y: 0, color: '#FFD700' }, // 顶部 - { x: 0, y: 1, color: '#FFD700' }, - { x: 1, y: 1, color: '#FFD700' }, // 中心 - { x: 2, y: 1, color: '#FFD700' }, - { x: 1, y: 2, color: '#FFD700' }, // 底部 - ], -}; - -/** 所有 3x3 形状模板 */ +/** 所有 3x3 形状模板 总共39个形状模板 */ export const ALL_3X3_SHAPES: ShapeTemplate[] = [ - CROSS_3X3, - L_SHAPE_3X3, - DIAGONAL_3X3, - HOUSE_3X3, - STAR_3X3, + /** 简单十字形 */ + { + id: 'cross-3x3-001', + name: '十字形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 左侧 - 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 中心 - 红色 + { x: 2, y: 1, color: '#F9A857' }, // 右侧 - 橙色 + { x: 1, y: 2, color: '#FFE176' }, // 底部 - 黄色 + ], + }, + /** L形 */ + { + id: 'l-3x3-001', + name: 'L形', + category: 'geometric', + difficulty: 1, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#53D1B6' }, // 青色 + { x: 1, y: 2, color: '#B2D94B' }, // 绿色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + ], + }, + /** 对角线 */ + { + id: 'diagonal-3x3-001', + name: '对角线', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#ED6D50' }, // 红色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + ], + }, + + /** 反向对角线 */ + { + id: 'reverse-diagonal-3x3-001', + name: '反向对角线', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 2, color: '#F2A4C0' }, + { x: 1, y: 1, color: '#79A7ED' }, + { x: 2, y: 0, color: '#B2D94B' }, + ], + }, + + /** 小房子 */ + { + id: 'house-3x3-001', + name: '小房子', + category: 'object', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#ED6D50' }, // 屋顶 + { x: 0, y: 1, color: '#FFE176' }, // 左侧墙 + { x: 1, y: 1, color: '#FFE176' }, // 中间墙 + { x: 2, y: 1, color: '#FFE176' }, // 右侧墙 + { x: 1, y: 2, color: '#BC8F71' }, // 门 + ], + }, + + /** 小星星 */ + { + id: 'star-3x3-001', + name: '小星星', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 左侧 - 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 中心 - 红色 + { x: 2, y: 1, color: '#F9A857' }, // 右侧 - 橙色 + { x: 1, y: 2, color: '#FFE176' }, // 底部 - 黄色 + ], + }, + + /** T形 */ + { + id: 't-3x3-001', + name: 'T形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#53D1B6' }, // 青色 + { x: 1, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 0, color: '#53D1B6' }, // 青色 + { x: 1, y: 1, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#6CD2EA' }, // 浅蓝 + ], + }, + + /** 倒T形 */ + { + id: 'reverse-t-3x3-001', + name: '倒T形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 2, color: '#ED6D50' }, + { x: 1, y: 2, color: '#F9A857' }, + { x: 2, y: 2, color: '#FFE176' }, + { x: 1, y: 1, color: '#B2D94B' }, + { x: 1, y: 0, color: '#79A7ED' }, + ], + }, + + /** 三角形 */ + { + id: 'triangle-3x3-001', + name: '三角形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 左侧 - 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 中心 - 红色 + { x: 2, y: 1, color: '#F9A857' }, // 右侧 - 橙色 + { x: 0, y: 2, color: '#F2A4C0' }, // 左下 - 粉色 + { x: 1, y: 2, color: '#ED6D50' }, // 中下 - 红色 + { x: 2, y: 2, color: '#F2A4C0' }, // 右下 - 粉色 + ], + }, + + /** 正方形 */ + { + id: 'square-3x3-001', + name: '正方形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#9C98DE' }, // 紫色 + { x: 1, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 1, color: '#9C98DE' }, // 紫色 + ], + }, + + /** 向上箭头 */ + { + id: 'arrow-up-3x3-001', + name: '向上箭头', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#6CD2EA' }, // 箭头顶部 - 浅蓝 + { x: 0, y: 1, color: '#53D1B6' }, // 左侧 - 青色 + { x: 1, y: 1, color: '#79A7ED' }, // 中心 - 蓝色 + { x: 2, y: 1, color: '#53D1B6' }, // 右侧 - 青色 + { x: 1, y: 2, color: '#6CD2EA' }, // 箭头杆 - 浅蓝 + ], + }, + + /** 数字7 */ + { + id: 'number-7-3x3-001', + name: '数字7', + category: 'geometric', + difficulty: 1, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#FC9B6C' }, // 橙色 + { x: 1, y: 0, color: '#F9A857' }, // 浅橙 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#F9A857' }, // 浅橙 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#FC9B6C' }, // 橙色 + ], + }, + + /** 边框 */ + { + id: 'frame-3x3-001', + name: '边框', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#B2D94B' }, // 绿色 + { x: 1, y: 0, color: '#53D1B6' }, // 青色 + { x: 2, y: 0, color: '#B2D94B' }, // 绿色 + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#B2D94B' }, // 绿色 + { x: 1, y: 2, color: '#53D1B6' }, // 青色 + { x: 2, y: 2, color: '#B2D94B' }, // 绿色 + ], + }, + + /** 加号(大) */ + { + id: 'plus-3x3-001', + name: '加号', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 0, y: 1, color: '#ED6D50' }, // 红色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#ED6D50' }, // 红色 + { x: 1, y: 2, color: '#F2A4C0' }, // 粉色 + ], + }, + + /** 点阵 */ + { + id: 'dots-3x3-001', + name: '点阵', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 1, color: '#53D1B6' }, // 青色 + { x: 0, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 2, color: '#79A7ED' }, // 蓝色 + ], + }, + + /** 向下箭头 */ + { + id: 'arrow-down-3x3-001', + name: '向下箭头', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#6CD2EA' }, // 箭头杆 - 浅蓝 + { x: 0, y: 1, color: '#53D1B6' }, // 左侧 - 青色 + { x: 1, y: 1, color: '#79A7ED' }, // 中心 - 蓝色 + { x: 2, y: 1, color: '#53D1B6' }, // 右侧 - 青色 + { x: 1, y: 2, color: '#6CD2EA' }, // 箭头底部 - 浅蓝 + ], + }, + + /** 菱形 */ + { + id: 'diamond-3x3-001', + name: '菱形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 左侧 - 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 中心 - 红色 + { x: 2, y: 1, color: '#F9A857' }, // 右侧 - 橙色 + { x: 1, y: 2, color: '#FFE176' }, // 底部 - 黄色 + ], + }, + + /** U形 */ + { + id: 'u-3x3-001', + name: 'U形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#53D1B6' }, // 青色 + { x: 2, y: 0, color: '#53D1B6' }, // 青色 + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#B2D94B' }, // 绿色 + { x: 2, y: 2, color: '#79A7ED' }, // 蓝色 + ], + }, + + /** C形 */ + { + id: 'c-3x3-001', + name: 'C形', + category: 'geometric', + difficulty: 1, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#ED6D50' }, // 红色 + { x: 1, y: 0, color: '#F9A857' }, // 橙色 + { x: 0, y: 1, color: '#FFE176' }, // 黄色 + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + ], + }, + + /** 倒三角形 */ + { + id: 'inverted-triangle-3x3-001', + name: '倒三角形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#B2D94B' }, // 绿色 + { x: 1, y: 0, color: '#53D1B6' }, // 青色 + { x: 2, y: 0, color: '#B2D94B' }, // 绿色 + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 1, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 2, color: '#53D1B6' }, // 底部 - 青色 + ], + }, + + /** 数字1 */ + { + id: 'number-1-3x3-001', + name: '数字1', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FC9B6C' }, // 橙色 + { x: 1, y: 1, color: '#F9A857' }, // 浅橙 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + ], + }, + + /** 数字4 */ + { + id: 'number-4-3x3-001', + name: '数字4', + category: 'geometric', + difficulty: 1, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 0, color: '#ED6D50' }, // 红色 + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 1, y: 1, color: '#FFE176' }, // 黄色 + { x: 2, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + ], + }, + + /** 圆形(3x3近似) */ + { + id: 'circle-3x3-001', + name: '圆形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#9C98DE' }, // 紫色 + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 2, color: '#9C98DE' }, // 紫色 + ], + }, + + /** 数字0 */ + { + id: 'number-0-3x3-001', + name: '数字0', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#FFE176' }, // 黄色 + { x: 1, y: 0, color: '#F9A857' }, // 橙色 + { x: 2, y: 0, color: '#FFE176' }, // 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#F9A857' }, // 橙色 + { x: 0, y: 2, color: '#FFE176' }, // 黄色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + ], + }, + + /** 数字8 */ + { + id: 'number-8-3x3-001', + name: '数字8', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 1, color: '#53D1B6' }, // 青色 + { x: 1, y: 1, color: '#B2D94B' }, // 绿色 + { x: 2, y: 1, color: '#53D1B6' }, // 青色 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 2, color: '#79A7ED' }, // 蓝色 + ], + }, + + /** 多色十字形 */ + { + id: 'colorful-cross-3x3-001', + name: '多色十字形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 左侧 - 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 中心 - 红色 + { x: 2, y: 1, color: '#F9A857' }, // 右侧 - 橙色 + { x: 1, y: 2, color: '#FFE176' }, // 底部 - 黄色 + ], + }, + + /** 多色L形 */ + { + id: 'colorful-l-3x3-001', + name: '多色L形', + category: 'geometric', + difficulty: 1, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#53D1B6' }, // 青色 + { x: 1, y: 2, color: '#B2D94B' }, // 绿色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + ], + }, + + /** 多色星星 */ + { + id: 'colorful-star-3x3-001', + name: '多色星星', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 左侧 - 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 中心 - 红色 + { x: 2, y: 1, color: '#F9A857' }, // 右侧 - 橙色 + { x: 1, y: 2, color: '#FFE176' }, // 底部 - 黄色 + ], + }, + + /** 多色小房子 */ + { + id: 'colorful-house-3x3-001', + name: '多色小房子', + category: 'object', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#ED6D50' }, // 屋顶 - 红色 + { x: 0, y: 1, color: '#FFE176' }, // 左侧墙 - 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 中间墙 - 橙色 + { x: 2, y: 1, color: '#FFE176' }, // 右侧墙 - 黄色 + { x: 1, y: 2, color: '#BC8F71' }, // 门 - 棕色 + ], + }, + + /** 数字2 */ + { + id: 'number-2-3x3-001', + name: '数字2', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 0, color: '#53D1B6' }, // 青色 + { x: 2, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#53D1B6' }, // 青色 + { x: 1, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 2, color: '#79A7ED' }, // 蓝色 + ], + }, + /** 数字3 */ + { + id: 'number-3-3x3-001', + name: '数字3', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 0, color: '#53D1B6' }, // 青色 + { x: 2, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 1, color: '#53D1B6' }, // 青色 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#53D1B6' }, // 青色 + { x: 2, y: 2, color: '#6CD2EA' }, // 浅蓝 + ], + }, + + /** 数字5 */ + { + id: 'number-5-3x3-001', + name: '数字5', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#53D1B6' }, // 青色 + { x: 1, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 2, color: '#53D1B6' }, // 青色 + ], + }, + + /** 数字6 */ + { + id: 'number-6-3x3-001', + name: '数字6', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#B2D94B' }, // 绿色 + { x: 1, y: 0, color: '#53D1B6' }, // 青色 + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 2, color: '#53D1B6' }, // 青色 + ], + }, + + /** 数字9 */ + { + id: 'number-9-3x3-001', + name: '数字9', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 0, color: '#ED6D50' }, // 红色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 0, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#FFE176' }, // 黄色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + ], + }, + /** 字母A */ + { + id: 'letter-a-3x3-001', + name: '字母A', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 黄色 + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#F9A857' }, // 橙色 + { x: 0, y: 2, color: '#FFE176' }, // 黄色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + ], + }, + /** 字母H */ + { + id: 'letter-h-3x3-001', + name: '字母H', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#F9A857' }, // 橙色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 0, y: 1, color: '#ED6D50' }, // 红色 + { x: 1, y: 1, color: '#FFE176' }, // 黄色 + { x: 2, y: 1, color: '#ED6D50' }, // 红色 + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + ], + }, + /** 字母O */ + { + id: 'letter-o-3x3-001', + name: '字母O', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#ED6D50' }, // 红色 + { x: 1, y: 0, color: '#F9A857' }, // 橙色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#F9A857' }, // 橙色 + { x: 0, y: 2, color: '#ED6D50' }, // 红色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + ], + }, ]; /** diff --git a/miniprogram/focusPages/shared/shapes/gridShapes5x5.ts b/miniprogram/focusPages/shared/shapes/gridShapes5x5.ts index d20728c..243e6a5 100644 --- a/miniprogram/focusPages/shared/shapes/gridShapes5x5.ts +++ b/miniprogram/focusPages/shared/shapes/gridShapes5x5.ts @@ -3,210 +3,960 @@ * 适用于常用尺寸,适中难度 */ -import { GridCell, ShapeTemplate } from '../types/gridTypes'; +import { ShapeTemplate } from '../types/gridTypes'; // ==================== 5x5 形状模板 ==================== -/** 十字形 */ -export const CROSS_5X5: ShapeTemplate = { - id: 'cross-5x5-001', - name: '十字形', - recommendedSize: { rows: 5, cols: 5 }, - category: 'geometric', - difficulty: 1, - supportSymmetry: true, - symmetryType: 'both', - isComplete: true, - cells: [ - { x: 2, y: 0, color: '#FFFF00' }, // 顶部 - { x: 2, y: 1, color: '#FFFF00' }, - { x: 0, y: 2, color: '#FFFF00' }, // 左侧 - { x: 1, y: 2, color: '#FFFF00' }, - { x: 2, y: 2, color: '#FFFF00' }, // 中心 - { x: 3, y: 2, color: '#FFFF00' }, - { x: 4, y: 2, color: '#FFFF00' }, // 右侧 - { x: 2, y: 3, color: '#FFFF00' }, - { x: 2, y: 4, color: '#FFFF00' }, // 底部 - ], -}; - -/** X形 */ -export const X_SHAPE_5X5: ShapeTemplate = { - id: 'x-5x5-001', - name: 'X形', - recommendedSize: { rows: 5, cols: 5 }, - category: 'geometric', - difficulty: 2, - supportSymmetry: true, - symmetryType: 'both', - isComplete: true, - cells: [ - { x: 0, y: 0, color: '#0000FF' }, - { x: 1, y: 1, color: '#0000FF' }, - { x: 2, y: 2, color: '#0000FF' }, - { x: 3, y: 3, color: '#0000FF' }, - { x: 4, y: 4, color: '#0000FF' }, - { x: 4, y: 0, color: '#0000FF' }, - { x: 3, y: 1, color: '#0000FF' }, - { x: 1, y: 3, color: '#0000FF' }, - { x: 0, y: 4, color: '#0000FF' }, - ], -}; - -/** 星星 */ -export const STAR_5X5: ShapeTemplate = { - id: 'star-5x5-001', - name: '星星', - recommendedSize: { rows: 5, cols: 5 }, - category: 'geometric', - difficulty: 3, - supportSymmetry: true, - symmetryType: 'both', - isComplete: true, - cells: [ - { x: 2, y: 0, color: '#FFD700' }, // 顶部 - { x: 1, y: 1, color: '#FFD700' }, - { x: 3, y: 1, color: '#FFD700' }, - { x: 0, y: 2, color: '#FFD700' }, - { x: 2, y: 2, color: '#FFD700' }, // 中心 - { x: 4, y: 2, color: '#FFD700' }, - { x: 1, y: 3, color: '#FFD700' }, - { x: 3, y: 3, color: '#FFD700' }, - { x: 2, y: 4, color: '#FFD700' }, // 底部 - ], -}; - -/** Z字形 */ -export const ZIGZAG_5X5: ShapeTemplate = { - id: 'zigzag-5x5-001', - name: 'Z字形', - recommendedSize: { rows: 5, cols: 5 }, - category: 'geometric', - difficulty: 2, - supportSymmetry: false, - isComplete: true, - cells: [ - { x: 0, y: 0, color: '#800080' }, - { x: 1, y: 0, color: '#800080' }, - { x: 2, y: 0, color: '#800080' }, - { x: 2, y: 1, color: '#800080' }, - { x: 1, y: 2, color: '#800080' }, - { x: 0, y: 2, color: '#800080' }, - { x: 0, y: 3, color: '#800080' }, - { x: 1, y: 3, color: '#800080' }, - { x: 2, y: 4, color: '#800080' }, - { x: 3, y: 4, color: '#800080' }, - { x: 4, y: 4, color: '#800080' }, - ], -}; - -/** V字形 */ -export const V_SHAPE_5X5: ShapeTemplate = { - id: 'v-5x5-001', - name: 'V字形', - recommendedSize: { rows: 5, cols: 5 }, - category: 'geometric', - difficulty: 2, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: true, - cells: [ - { x: 0, y: 0, color: '#00FF00' }, - { x: 4, y: 0, color: '#00FF00' }, - { x: 0, y: 1, color: '#00FF00' }, - { x: 4, y: 1, color: '#00FF00' }, - { x: 1, y: 2, color: '#00FF00' }, - { x: 3, y: 2, color: '#00FF00' }, - { x: 2, y: 3, color: '#00FF00' }, - { x: 2, y: 4, color: '#00FF00' }, - ], -}; - -/** I字形 */ -export const I_SHAPE_5X5: ShapeTemplate = { - id: 'i-5x5-001', - name: 'I字形', - recommendedSize: { rows: 5, cols: 5 }, - category: 'geometric', - difficulty: 1, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: true, - cells: [ - { x: 1, y: 0, color: '#FF7F00' }, - { x: 2, y: 0, color: '#FF7F00' }, - { x: 3, y: 0, color: '#FF7F00' }, - { x: 2, y: 1, color: '#FF7F00' }, - { x: 2, y: 2, color: '#FF7F00' }, - { x: 2, y: 3, color: '#FF7F00' }, - { x: 2, y: 4, color: '#FF7F00' }, - { x: 1, y: 4, color: '#FF7F00' }, - { x: 3, y: 4, color: '#FF7F00' }, - ], -}; - -/** 棋盘格 */ -export const CHECKERBOARD_5X5: ShapeTemplate = { - id: 'checkerboard-5x5-001', - name: '棋盘格', - recommendedSize: { rows: 5, cols: 5 }, - category: 'geometric', - difficulty: 3, - supportSymmetry: true, - symmetryType: 'both', - isComplete: true, - cells: [ - { x: 0, y: 0, color: '#FFFF00' }, - { x: 2, y: 0, color: '#FFFF00' }, - { x: 4, y: 0, color: '#FFFF00' }, - { x: 1, y: 1, color: '#FFFF00' }, - { x: 3, y: 1, color: '#FFFF00' }, - { x: 0, y: 2, color: '#FFFF00' }, - { x: 2, y: 2, color: '#FFFF00' }, - { x: 4, y: 2, color: '#FFFF00' }, - { x: 1, y: 3, color: '#FFFF00' }, - { x: 3, y: 3, color: '#FFFF00' }, - { x: 0, y: 4, color: '#FFFF00' }, - { x: 2, y: 4, color: '#FFFF00' }, - { x: 4, y: 4, color: '#FFFF00' }, - ], -}; - -/** 心形(简化版) */ -export const HEART_5X5: ShapeTemplate = { - id: 'heart-5x5-001', - name: '心形', - recommendedSize: { rows: 5, cols: 5 }, - category: 'object', - difficulty: 2, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: true, - cells: [ - { x: 1, y: 0, color: '#FF69B4' }, - { x: 2, y: 0, color: '#FF69B4' }, - { x: 3, y: 0, color: '#FF69B4' }, - { x: 0, y: 1, color: '#FF69B4' }, - { x: 2, y: 1, color: '#FF69B4' }, - { x: 4, y: 1, color: '#FF69B4' }, - { x: 1, y: 2, color: '#FF69B4' }, - { x: 2, y: 2, color: '#FF69B4' }, - { x: 3, y: 2, color: '#FF69B4' }, - { x: 2, y: 3, color: '#FF69B4' }, - { x: 2, y: 4, color: '#FF69B4' }, - ], -}; - /** 所有 5x5 形状模板 */ export const ALL_5X5_SHAPES: ShapeTemplate[] = [ - CROSS_5X5, - X_SHAPE_5X5, - STAR_5X5, - ZIGZAG_5X5, - V_SHAPE_5X5, - I_SHAPE_5X5, - CHECKERBOARD_5X5, - HEART_5X5, + /** 十字形 */ + { + id: 'cross-5x5-001', + name: '十字形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 2, y: 0, color: '#FFE176' }, // 顶部 + { x: 2, y: 1, color: '#FFE176' }, + { x: 0, y: 2, color: '#FFE176' }, // 左侧 + { x: 1, y: 2, color: '#FFE176' }, + { x: 2, y: 2, color: '#FFE176' }, // 中心 + { x: 3, y: 2, color: '#FFE176' }, + { x: 4, y: 2, color: '#FFE176' }, // 右侧 + { x: 2, y: 3, color: '#FFE176' }, + { x: 2, y: 4, color: '#FFE176' }, // 底部 + ], + }, + + /** X形 */ + { + id: 'x-5x5-001', + name: 'X形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, + { x: 1, y: 1, color: '#79A7ED' }, + { x: 2, y: 2, color: '#79A7ED' }, + { x: 3, y: 3, color: '#79A7ED' }, + { x: 4, y: 4, color: '#79A7ED' }, + { x: 4, y: 0, color: '#79A7ED' }, + { x: 3, y: 1, color: '#79A7ED' }, + { x: 1, y: 3, color: '#79A7ED' }, + { x: 0, y: 4, color: '#79A7ED' }, + ], + }, + + /** 星星 */ + { + id: 'star-5x5-001', + name: '星星', + category: 'geometric', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 2, y: 0, color: '#FFE176' }, // 顶部 + { x: 1, y: 1, color: '#FFE176' }, + { x: 3, y: 1, color: '#FFE176' }, + { x: 0, y: 2, color: '#FFE176' }, + { x: 2, y: 2, color: '#FFE176' }, // 中心 + { x: 4, y: 2, color: '#FFE176' }, + { x: 1, y: 3, color: '#FFE176' }, + { x: 3, y: 3, color: '#FFE176' }, + { x: 2, y: 4, color: '#FFE176' }, // 底部 + ], + }, + + /** Z字形 */ + { + id: 'zigzag-5x5-001', + name: 'Z字形', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#9C98DE' }, + { x: 1, y: 0, color: '#9C98DE' }, + { x: 2, y: 0, color: '#9C98DE' }, + { x: 2, y: 1, color: '#9C98DE' }, + { x: 1, y: 2, color: '#9C98DE' }, + { x: 0, y: 2, color: '#9C98DE' }, + { x: 0, y: 3, color: '#9C98DE' }, + { x: 1, y: 3, color: '#9C98DE' }, + { x: 2, y: 4, color: '#9C98DE' }, + { x: 3, y: 4, color: '#9C98DE' }, + { x: 4, y: 4, color: '#9C98DE' }, + ], + }, + + /** V字形 */ + { + id: 'v-5x5-001', + name: 'V字形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#53D1B6' }, + { x: 4, y: 0, color: '#53D1B6' }, + { x: 0, y: 1, color: '#53D1B6' }, + { x: 4, y: 1, color: '#53D1B6' }, + { x: 1, y: 2, color: '#53D1B6' }, + { x: 3, y: 2, color: '#53D1B6' }, + { x: 2, y: 3, color: '#53D1B6' }, + { x: 2, y: 4, color: '#53D1B6' }, + ], + }, + + /** I字形 */ + { + id: 'i-5x5-001', + name: 'I字形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#F9A857' }, + { x: 2, y: 0, color: '#F9A857' }, + { x: 3, y: 0, color: '#F9A857' }, + { x: 2, y: 1, color: '#F9A857' }, + { x: 2, y: 2, color: '#F9A857' }, + { x: 2, y: 3, color: '#F9A857' }, + { x: 2, y: 4, color: '#F9A857' }, + { x: 1, y: 4, color: '#F9A857' }, + { x: 3, y: 4, color: '#F9A857' }, + ], + }, + + /** 棋盘格 */ + { + id: 'checkerboard-5x5-001', + name: '棋盘格', + category: 'geometric', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#FFE176' }, + { x: 2, y: 0, color: '#FFE176' }, + { x: 4, y: 0, color: '#FFE176' }, + { x: 1, y: 1, color: '#FFE176' }, + { x: 3, y: 1, color: '#FFE176' }, + { x: 0, y: 2, color: '#FFE176' }, + { x: 2, y: 2, color: '#FFE176' }, + { x: 4, y: 2, color: '#FFE176' }, + { x: 1, y: 3, color: '#FFE176' }, + { x: 3, y: 3, color: '#FFE176' }, + { x: 0, y: 4, color: '#FFE176' }, + { x: 2, y: 4, color: '#FFE176' }, + { x: 4, y: 4, color: '#FFE176' }, + ], + }, + + /** 心形(简化版) */ + { + id: 'heart-5x5-001', + name: '心形', + category: 'object', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#F2A4C0' }, + { x: 2, y: 0, color: '#F2A4C0' }, + { x: 3, y: 0, color: '#F2A4C0' }, + { x: 0, y: 1, color: '#F2A4C0' }, + { x: 2, y: 1, color: '#F2A4C0' }, + { x: 4, y: 1, color: '#F2A4C0' }, + { x: 1, y: 2, color: '#F2A4C0' }, + { x: 2, y: 2, color: '#F2A4C0' }, + { x: 3, y: 2, color: '#F2A4C0' }, + { x: 2, y: 3, color: '#F2A4C0' }, + { x: 2, y: 4, color: '#F2A4C0' }, + ], + }, + + /** 菱形 */ + { + id: 'diamond-5x5-001', + name: '菱形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 2, y: 0, color: '#F9A857' }, + { x: 1, y: 1, color: '#F9A857' }, + { x: 2, y: 1, color: '#F9A857' }, + { x: 3, y: 1, color: '#F9A857' }, + { x: 0, y: 2, color: '#F9A857' }, + { x: 1, y: 2, color: '#F9A857' }, + { x: 2, y: 2, color: '#F9A857' }, + { x: 3, y: 2, color: '#F9A857' }, + { x: 4, y: 2, color: '#F9A857' }, + { x: 1, y: 3, color: '#F9A857' }, + { x: 2, y: 3, color: '#F9A857' }, + { x: 3, y: 3, color: '#F9A857' }, + { x: 2, y: 4, color: '#F9A857' }, + ], + }, + + /** T形 */ + { + id: 't-5x5-001', + name: 'T形', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#53D1B6' }, + { x: 1, y: 0, color: '#53D1B6' }, + { x: 2, y: 0, color: '#53D1B6' }, + { x: 3, y: 0, color: '#53D1B6' }, + { x: 4, y: 0, color: '#53D1B6' }, + { x: 2, y: 1, color: '#53D1B6' }, + { x: 2, y: 2, color: '#53D1B6' }, + { x: 2, y: 3, color: '#53D1B6' }, + { x: 2, y: 4, color: '#53D1B6' }, + ], + }, + + /** U形 */ + { + id: 'u-5x5-001', + name: 'U形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#6CD2EA' }, + { x: 4, y: 0, color: '#6CD2EA' }, + { x: 0, y: 1, color: '#6CD2EA' }, + { x: 4, y: 1, color: '#6CD2EA' }, + { x: 0, y: 2, color: '#6CD2EA' }, + { x: 4, y: 2, color: '#6CD2EA' }, + { x: 0, y: 3, color: '#6CD2EA' }, + { x: 1, y: 3, color: '#6CD2EA' }, + { x: 2, y: 3, color: '#6CD2EA' }, + { x: 3, y: 3, color: '#6CD2EA' }, + { x: 4, y: 3, color: '#6CD2EA' }, + ], + }, + + /** 圆形(5x5近似) */ + { + id: 'circle-5x5-001', + name: '圆形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#9C98DE' }, + { x: 2, y: 0, color: '#9C98DE' }, + { x: 3, y: 0, color: '#9C98DE' }, + { x: 0, y: 1, color: '#9C98DE' }, + { x: 4, y: 1, color: '#9C98DE' }, + { x: 0, y: 2, color: '#9C98DE' }, + { x: 4, y: 2, color: '#9C98DE' }, + { x: 0, y: 3, color: '#9C98DE' }, + { x: 4, y: 3, color: '#9C98DE' }, + { x: 1, y: 4, color: '#9C98DE' }, + { x: 2, y: 4, color: '#9C98DE' }, + { x: 3, y: 4, color: '#9C98DE' }, + ], + }, + + /** 三角形 */ + { + id: 'triangle-5x5-001', + name: '三角形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 2, y: 0, color: '#F9A857' }, + { x: 1, y: 1, color: '#F9A857' }, + { x: 2, y: 1, color: '#F9A857' }, + { x: 3, y: 1, color: '#F9A857' }, + { x: 0, y: 2, color: '#F9A857' }, + { x: 1, y: 2, color: '#F9A857' }, + { x: 2, y: 2, color: '#F9A857' }, + { x: 3, y: 2, color: '#F9A857' }, + { x: 4, y: 2, color: '#F9A857' }, + { x: 0, y: 3, color: '#F9A857' }, + { x: 1, y: 3, color: '#F9A857' }, + { x: 2, y: 3, color: '#F9A857' }, + { x: 3, y: 3, color: '#F9A857' }, + { x: 4, y: 3, color: '#F9A857' }, + { x: 0, y: 4, color: '#F9A857' }, + { x: 1, y: 4, color: '#F9A857' }, + { x: 2, y: 4, color: '#F9A857' }, + { x: 3, y: 4, color: '#F9A857' }, + { x: 4, y: 4, color: '#F9A857' }, + ], + }, + + /** 多色星星 */ + { + id: 'colorful-star-5x5-001', + name: '多色星星', + category: 'geometric', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 2, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 左上 - 橙色 + { x: 3, y: 1, color: '#F9A857' }, // 右上 - 橙色 + { x: 0, y: 2, color: '#ED6D50' }, // 左 - 红色 + { x: 2, y: 2, color: '#FFE176' }, // 中心 - 黄色 + { x: 4, y: 2, color: '#ED6D50' }, // 右 - 红色 + { x: 1, y: 3, color: '#F9A857' }, // 左下 - 橙色 + { x: 3, y: 3, color: '#F9A857' }, // 右下 - 橙色 + { x: 2, y: 4, color: '#FFE176' }, // 底部 - 黄色 + ], + }, + + /** 多色心形 */ + { + id: 'colorful-heart-5x5-001', + name: '多色心形', + category: 'object', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 1, color: '#ED6D50' }, // 红色 + { x: 4, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + { x: 3, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#ED6D50' }, // 红色 + ], + }, + + /** 边框 */ + { + id: 'frame-5x5-001', + name: '边框', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#B2D94B' }, + { x: 1, y: 0, color: '#B2D94B' }, + { x: 2, y: 0, color: '#B2D94B' }, + { x: 3, y: 0, color: '#B2D94B' }, + { x: 4, y: 0, color: '#B2D94B' }, + { x: 0, y: 1, color: '#B2D94B' }, + { x: 4, y: 1, color: '#B2D94B' }, + { x: 0, y: 2, color: '#B2D94B' }, + { x: 4, y: 2, color: '#B2D94B' }, + { x: 0, y: 3, color: '#B2D94B' }, + { x: 4, y: 3, color: '#B2D94B' }, + { x: 0, y: 4, color: '#B2D94B' }, + { x: 1, y: 4, color: '#B2D94B' }, + { x: 2, y: 4, color: '#B2D94B' }, + { x: 3, y: 4, color: '#B2D94B' }, + { x: 4, y: 4, color: '#B2D94B' }, + ], + }, + + /** 加号 */ + { + id: 'plus-5x5-001', + name: '加号', + category: 'geometric', + difficulty: 1, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 2, y: 0, color: '#F2A4C0' }, + { x: 0, y: 2, color: '#F2A4C0' }, + { x: 1, y: 2, color: '#F2A4C0' }, + { x: 2, y: 2, color: '#F2A4C0' }, + { x: 3, y: 2, color: '#F2A4C0' }, + { x: 4, y: 2, color: '#F2A4C0' }, + { x: 2, y: 4, color: '#F2A4C0' }, + ], + }, + + /** 点阵 */ + { + id: 'dots-5x5-001', + name: '点阵', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, + { x: 2, y: 0, color: '#79A7ED' }, + { x: 4, y: 0, color: '#79A7ED' }, + { x: 1, y: 2, color: '#79A7ED' }, + { x: 3, y: 2, color: '#79A7ED' }, + { x: 0, y: 4, color: '#79A7ED' }, + { x: 2, y: 4, color: '#79A7ED' }, + { x: 4, y: 4, color: '#79A7ED' }, + ], + }, + + /** 数字5 */ + { + id: 'number-5-5x5-001', + name: '数字5', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#FC9B6C' }, + { x: 1, y: 0, color: '#FC9B6C' }, + { x: 2, y: 0, color: '#FC9B6C' }, + { x: 0, y: 1, color: '#FC9B6C' }, + { x: 0, y: 2, color: '#FC9B6C' }, + { x: 1, y: 2, color: '#FC9B6C' }, + { x: 2, y: 2, color: '#FC9B6C' }, + { x: 2, y: 3, color: '#FC9B6C' }, + { x: 0, y: 4, color: '#FC9B6C' }, + { x: 1, y: 4, color: '#FC9B6C' }, + { x: 2, y: 4, color: '#FC9B6C' }, + ], + }, + + /** 数字6 */ + { + id: 'number-6-5x5-001', + name: '数字6', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#6CD2EA' }, + { x: 2, y: 0, color: '#6CD2EA' }, + { x: 0, y: 1, color: '#6CD2EA' }, + { x: 0, y: 2, color: '#6CD2EA' }, + { x: 1, y: 2, color: '#6CD2EA' }, + { x: 2, y: 2, color: '#6CD2EA' }, + { x: 0, y: 3, color: '#6CD2EA' }, + { x: 2, y: 3, color: '#6CD2EA' }, + { x: 1, y: 4, color: '#6CD2EA' }, + { x: 2, y: 4, color: '#6CD2EA' }, + ], + }, + + /** 数字9 */ + { + id: 'number-9-5x5-001', + name: '数字9', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#B2D94B' }, + { x: 2, y: 0, color: '#B2D94B' }, + { x: 0, y: 1, color: '#B2D94B' }, + { x: 2, y: 1, color: '#B2D94B' }, + { x: 0, y: 2, color: '#B2D94B' }, + { x: 1, y: 2, color: '#B2D94B' }, + { x: 2, y: 2, color: '#B2D94B' }, + { x: 2, y: 3, color: '#B2D94B' }, + { x: 1, y: 4, color: '#B2D94B' }, + { x: 2, y: 4, color: '#B2D94B' }, + ], + }, + + /** 多色棋盘格 */ + { + id: 'colorful-checkerboard-5x5-001', + name: '多色棋盘格', + category: 'geometric', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#FFE176' }, + { x: 2, y: 0, color: '#FFE176' }, + { x: 4, y: 0, color: '#FFE176' }, + { x: 1, y: 1, color: '#F9A857' }, + { x: 3, y: 1, color: '#F9A857' }, + { x: 0, y: 2, color: '#ED6D50' }, + { x: 2, y: 2, color: '#ED6D50' }, + { x: 4, y: 2, color: '#ED6D50' }, + { x: 1, y: 3, color: '#F9A857' }, + { x: 3, y: 3, color: '#F9A857' }, + { x: 0, y: 4, color: '#FFE176' }, + { x: 2, y: 4, color: '#FFE176' }, + { x: 4, y: 4, color: '#FFE176' }, + ], + }, + + /** 多色X形 */ + { + id: 'colorful-x-5x5-001', + name: '多色X形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#79A7ED' }, + { x: 1, y: 1, color: '#6CD2EA' }, + { x: 2, y: 2, color: '#53D1B6' }, + { x: 3, y: 3, color: '#6CD2EA' }, + { x: 4, y: 4, color: '#79A7ED' }, + { x: 4, y: 0, color: '#79A7ED' }, + { x: 3, y: 1, color: '#6CD2EA' }, + { x: 1, y: 3, color: '#6CD2EA' }, + { x: 0, y: 4, color: '#79A7ED' }, + ], + }, + + /** 箭头(向右) */ + { + id: 'arrow-right-5x5-001', + name: '向右箭头', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 0, y: 2, color: '#6CD2EA' }, + { x: 1, y: 1, color: '#6CD2EA' }, + { x: 1, y: 2, color: '#6CD2EA' }, + { x: 1, y: 3, color: '#6CD2EA' }, + { x: 2, y: 0, color: '#6CD2EA' }, + { x: 2, y: 1, color: '#6CD2EA' }, + { x: 2, y: 2, color: '#6CD2EA' }, + { x: 2, y: 3, color: '#6CD2EA' }, + { x: 2, y: 4, color: '#6CD2EA' }, + { x: 3, y: 1, color: '#6CD2EA' }, + { x: 3, y: 2, color: '#6CD2EA' }, + { x: 3, y: 3, color: '#6CD2EA' }, + { x: 4, y: 2, color: '#6CD2EA' }, + ], + }, + + /** 箭头(向左) */ + { + id: 'arrow-left-5x5-001', + name: '向左箭头', + category: 'geometric', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + { x: 4, y: 2, color: '#6CD2EA' }, + { x: 3, y: 1, color: '#6CD2EA' }, + { x: 3, y: 2, color: '#6CD2EA' }, + { x: 3, y: 3, color: '#6CD2EA' }, + { x: 2, y: 0, color: '#6CD2EA' }, + { x: 2, y: 1, color: '#6CD2EA' }, + { x: 2, y: 2, color: '#6CD2EA' }, + { x: 2, y: 3, color: '#6CD2EA' }, + { x: 2, y: 4, color: '#6CD2EA' }, + { x: 1, y: 1, color: '#6CD2EA' }, + { x: 1, y: 2, color: '#6CD2EA' }, + { x: 1, y: 3, color: '#6CD2EA' }, + { x: 0, y: 2, color: '#6CD2EA' }, + ], + }, + + /** 多色圆形 */ + { + id: 'colorful-circle-5x5-001', + name: '多色圆形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, + { x: 2, y: 0, color: '#F9A857' }, + { x: 3, y: 0, color: '#FFE176' }, + { x: 0, y: 1, color: '#F9A857' }, + { x: 4, y: 1, color: '#F9A857' }, + { x: 0, y: 2, color: '#ED6D50' }, + { x: 4, y: 2, color: '#ED6D50' }, + { x: 0, y: 3, color: '#F9A857' }, + { x: 4, y: 3, color: '#F9A857' }, + { x: 1, y: 4, color: '#FFE176' }, + { x: 2, y: 4, color: '#F9A857' }, + { x: 3, y: 4, color: '#FFE176' }, + ], + }, + + /** 多色十字 */ + { + id: 'colorful-cross-5x5-001', + name: '多色十字', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + { x: 2, y: 0, color: '#FFE176' }, + { x: 2, y: 1, color: '#F9A857' }, + { x: 0, y: 2, color: '#ED6D50' }, + { x: 1, y: 2, color: '#F9A857' }, + { x: 2, y: 2, color: '#FFE176' }, + { x: 3, y: 2, color: '#F9A857' }, + { x: 4, y: 2, color: '#ED6D50' }, + { x: 2, y: 3, color: '#F9A857' }, + { x: 2, y: 4, color: '#FFE176' }, + ], + }, + + /** 多色V形 */ + { + id: 'colorful-v-5x5-001', + name: '多色V形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#ED6D50' }, + { x: 4, y: 0, color: '#ED6D50' }, + { x: 0, y: 1, color: '#F9A857' }, + { x: 4, y: 1, color: '#F9A857' }, + { x: 1, y: 2, color: '#FFE176' }, + { x: 3, y: 2, color: '#FFE176' }, + { x: 2, y: 3, color: '#B2D94B' }, + { x: 2, y: 4, color: '#53D1B6' }, + ], + }, + + /** 简化小猫 */ + { + id: 'simple-cat-5x5-001', + name: '简化小猫', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#F2A4C0' }, // 粉色(耳朵) + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#F2A4C0' }, // 粉色(耳朵) + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#ED6D50' }, // 红色 + { x: 4, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 0, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 2, color: '#ED6D50' }, // 红色 + { x: 4, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色(腿) + { x: 2, y: 4, color: '#F2A4C0' }, // 粉色(尾巴) + { x: 3, y: 4, color: '#ED6D50' }, // 红色(腿) + ], + }, + + /** 简化小狗 */ + { + id: 'simple-dog-5x5-001', + name: '简化小狗', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#F9A857' }, // 橙色(耳朵) + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#F9A857' }, // 橙色(耳朵) + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#ED6D50' }, // 红色 + { x: 4, y: 1, color: '#F9A857' }, // 橙色 + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + { x: 3, y: 2, color: '#ED6D50' }, // 红色 + { x: 4, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 3, color: '#F9A857' }, // 橙色 + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#F9A857' }, // 橙色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色(腿) + { x: 2, y: 4, color: '#F9A857' }, // 橙色(尾巴) + { x: 3, y: 4, color: '#ED6D50' }, // 红色(腿) + ], + }, + + /** 简化小鸟 */ + { + id: 'simple-bird-5x5-001', + name: '简化小鸟', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 黄色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 3, y: 0, color: '#ED6D50' }, // 红色(嘴巴) + { x: 0, y: 1, color: '#FFE176' }, // 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#F9A857' }, // 橙色 + { x: 4, y: 1, color: '#FFE176' }, // 黄色 + { x: 0, y: 2, color: '#FFE176' }, // 黄色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + { x: 3, y: 2, color: '#F9A857' }, // 橙色 + { x: 4, y: 2, color: '#FFE176' }, // 黄色 + { x: 1, y: 3, color: '#F9A857' }, // 橙色(翅膀) + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#F9A857' }, // 橙色(翅膀) + { x: 2, y: 4, color: '#ED6D50' }, // 红色(脚) + ], + }, + + /** 简化小鱼 */ + { + id: 'simple-fish-5x5-001', + name: '简化小鱼', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 1, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 1, color: '#53D1B6' }, // 青色 + { x: 3, y: 1, color: '#53D1B6' }, // 青色 + { x: 4, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#53D1B6' }, // 青色 + { x: 2, y: 2, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 2, color: '#53D1B6' }, // 青色 + { x: 4, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 3, color: '#53D1B6' }, // 青色 + { x: 3, y: 3, color: '#53D1B6' }, // 青色 + { x: 4, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 4, color: '#6CD2EA' }, // 浅蓝(尾巴) + { x: 2, y: 4, color: '#79A7ED' }, // 蓝色(尾巴) + { x: 3, y: 4, color: '#6CD2EA' }, // 浅蓝(尾巴) + ], + }, + + /** 简化小兔子 */ + { + id: 'simple-rabbit-5x5-001', + name: '简化小兔子', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#F2A4C0' }, // 粉色(左耳) + { x: 1, y: 0, color: '#ED6D50' }, // 红色 + { x: 2, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 0, color: '#ED6D50' }, // 红色 + { x: 4, y: 0, color: '#F2A4C0' }, // 粉色(右耳) + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 1, color: '#ED6D50' }, // 红色 + { x: 4, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 2, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 3, color: '#ED6D50' }, // 红色(鼻子) + { x: 3, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色(腿) + { x: 2, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 4, color: '#ED6D50' }, // 红色(腿) + ], + }, + + /** 简化小鸭子 */ + { + id: 'simple-duck-5x5-001', + name: '简化小鸭子', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#FFE176' }, // 黄色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 3, y: 0, color: '#ED6D50' }, // 红色(嘴巴) + { x: 0, y: 1, color: '#FFE176' }, // 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#F9A857' }, // 橙色 + { x: 4, y: 1, color: '#FFE176' }, // 黄色 + { x: 0, y: 2, color: '#FFE176' }, // 黄色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + { x: 3, y: 2, color: '#F9A857' }, // 橙色 + { x: 4, y: 2, color: '#FFE176' }, // 黄色 + { x: 1, y: 3, color: '#F9A857' }, // 橙色(翅膀) + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#F9A857' }, // 橙色(翅膀) + { x: 1, y: 4, color: '#ED6D50' }, // 红色(脚) + { x: 2, y: 4, color: '#ED6D50' }, // 红色(脚) + { x: 3, y: 4, color: '#ED6D50' }, // 红色(脚) + ], + }, + + /** 简化小熊 */ + { + id: 'simple-bear-5x5-001', + name: '简化小熊', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#F9A857' }, // 橙色(左耳) + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#F9A857' }, // 橙色(右耳) + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#ED6D50' }, // 红色 + { x: 4, y: 1, color: '#F9A857' }, // 橙色 + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + { x: 3, y: 2, color: '#ED6D50' }, // 红色 + { x: 4, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 3, color: '#F9A857' }, // 橙色 + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#F9A857' }, // 橙色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色(腿) + { x: 2, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 4, color: '#ED6D50' }, // 红色(腿) + ], + }, + + /** 简化小象 */ + { + id: 'simple-elephant-5x5-001', + name: '简化小象', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 1, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 1, color: '#79A7ED' }, // 蓝色(鼻子) + { x: 1, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 4, y: 1, color: '#79A7ED' }, // 蓝色(鼻子) + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 4, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 4, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 4, color: '#79A7ED' }, // 蓝色(腿) + { x: 1, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 4, y: 4, color: '#79A7ED' }, // 蓝色(腿) + ], + }, + + /** 简化小蝴蝶 */ + { + id: 'simple-butterfly-5x5-001', + name: '简化小蝴蝶', + category: 'animal', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + { x: 0, y: 0, color: '#F2A4C0' }, // 粉色(左翅膀) + { x: 1, y: 0, color: '#ED6D50' }, // 红色 + { x: 2, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 0, color: '#ED6D50' }, // 红色 + { x: 4, y: 0, color: '#F2A4C0' }, // 粉色(右翅膀) + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#666666' }, // 黑色(身体) + { x: 3, y: 1, color: '#ED6D50' }, // 红色 + { x: 4, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 0, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#666666' }, // 黑色(身体) + { x: 3, y: 2, color: '#ED6D50' }, // 红色 + { x: 4, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#F2A4C0' }, // 粉色(左翅膀) + { x: 2, y: 3, color: '#666666' }, // 黑色(身体) + { x: 3, y: 3, color: '#F2A4C0' }, // 粉色(右翅膀) + { x: 2, y: 4, color: '#666666' }, // 黑色(身体) + ], + }, ]; /** diff --git a/miniprogram/focusPages/shared/shapes/gridShapes7x7.ts b/miniprogram/focusPages/shared/shapes/gridShapes7x7.ts index 4612f39..2a8815c 100644 --- a/miniprogram/focusPages/shared/shapes/gridShapes7x7.ts +++ b/miniprogram/focusPages/shared/shapes/gridShapes7x7.ts @@ -3,239 +3,1605 @@ * 适用于中等难度,复杂图案 */ -import { GridCell, ShapeTemplate } from '../types/gridTypes'; +import { ShapeTemplate } from '../types/gridTypes'; // ==================== 7x7 形状模板 ==================== -/** 南瓜头 - 对称涂色(仅存储左半部分) */ -export const PUMPKIN_HEAD_7X7: ShapeTemplate = { - id: 'pumpkin-7x7-001', - name: '南瓜头', - recommendedSize: { rows: 7, cols: 7 }, - category: 'character', - difficulty: 4, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: false, // 只存储了左半部分 - colorSchemeId: 'halloween', - cells: [ - // 茎(在对称轴上) - { x: 3, y: 0, color: '#FF7F00' }, - - // 脸部轮廓(浅绿色)- 左半部分 - { x: 0, y: 1, color: '#90EE90' }, - { x: 1, y: 1, color: '#90EE90' }, - { x: 0, y: 2, color: '#90EE90' }, - { x: 1, y: 2, color: '#90EE90' }, - { x: 0, y: 3, color: '#90EE90' }, - { x: 1, y: 3, color: '#90EE90' }, - { x: 0, y: 4, color: '#90EE90' }, - { x: 1, y: 4, color: '#90EE90' }, - { x: 0, y: 5, color: '#90EE90' }, - { x: 1, y: 5, color: '#90EE90' }, - { x: 0, y: 6, color: '#90EE90' }, - { x: 1, y: 6, color: '#90EE90' }, - - // 脸部(黄色) - { x: 2, y: 1, color: '#FFFF00' }, - { x: 3, y: 1, color: '#FFFF00' }, // 对称轴上的点 - { x: 2, y: 2, color: '#FFFF00' }, - { x: 2, y: 3, color: '#FFFF00' }, - { x: 3, y: 3, color: '#FFFF00' }, - { x: 2, y: 4, color: '#FFFF00' }, - { x: 2, y: 5, color: '#FFFF00' }, - { x: 3, y: 5, color: '#FFFF00' }, - - // 眼睛(黑色)- 左眼 - { x: 2, y: 2, color: '#000000' }, - ], -}; - -/** 卡通恐龙 - 对称涂色(仅存储左半部分) */ -export const DINOSAUR_7X7: ShapeTemplate = { - id: 'dinosaur-7x7-001', - name: '卡通恐龙', - recommendedSize: { rows: 7, cols: 7 }, - category: 'animal', - difficulty: 4, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: false, // 只存储了左半部分 - cells: [ - // 身体(浅绿色) - { x: 1, y: 1, color: '#90EE90' }, - { x: 2, y: 1, color: '#90EE90' }, - { x: 1, y: 2, color: '#90EE90' }, - { x: 2, y: 2, color: '#90EE90' }, - { x: 0, y: 3, color: '#90EE90' }, - { x: 1, y: 3, color: '#90EE90' }, - { x: 2, y: 3, color: '#90EE90' }, - { x: 0, y: 4, color: '#90EE90' }, - { x: 1, y: 4, color: '#90EE90' }, - { x: 2, y: 4, color: '#90EE90' }, - { x: 0, y: 5, color: '#90EE90' }, - { x: 1, y: 5, color: '#90EE90' }, - { x: 2, y: 5, color: '#90EE90' }, - { x: 0, y: 6, color: '#90EE90' }, - { x: 1, y: 6, color: '#90EE90' }, - - // 眼睛(黑色) - { x: 2, y: 1, color: '#000000' }, - - // 嘴巴(红色) - { x: 2, y: 2, color: '#FF0000' }, - { x: 0, y: 3, color: '#FF0000' }, - - // 脚(黄色) - { x: 2, y: 5, color: '#FFFF00' }, - { x: 0, y: 6, color: '#FFFF00' }, - { x: 1, y: 6, color: '#FFFF00' }, - ], -}; - -/** 心形 - 对称涂色(仅存储左半部分,对称轴在x=3) */ -export const HEART_7X7: ShapeTemplate = { - id: 'heart-7x7-001', - name: '心形', - recommendedSize: { rows: 7, cols: 7 }, - category: 'object', - difficulty: 3, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: false, - colorSchemeId: 'warm', - cells: [ - // 左上半部分 - { x: 1, y: 0, color: '#FF69B4' }, - { x: 2, y: 0, color: '#FF69B4' }, - { x: 0, y: 1, color: '#FF69B4' }, - { x: 3, y: 1, color: '#FF69B4' }, // 对称轴上的点 - { x: 0, y: 2, color: '#FF69B4' }, - { x: 1, y: 3, color: '#FF69B4' }, - { x: 2, y: 4, color: '#FF69B4' }, - { x: 3, y: 5, color: '#FF69B4' }, // 对称轴上的点 - { x: 3, y: 6, color: '#FF69B4' }, // 对称轴上的点(底部尖端) - ], -}; - -/** 房子 */ -export const HOUSE_7X7: ShapeTemplate = { - id: 'house-7x7-001', - name: '小房子', - recommendedSize: { rows: 7, cols: 7 }, - category: 'object', - difficulty: 3, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: false, - cells: [ - // 屋顶(三角形)- 左半部分 - { x: 2, y: 0, color: '#FF0000' }, - { x: 1, y: 1, color: '#FF0000' }, - { x: 2, y: 1, color: '#FF0000' }, - { x: 3, y: 1, color: '#FF0000' }, // 对称轴上的点 - { x: 0, y: 2, color: '#FF0000' }, - { x: 1, y: 2, color: '#FF0000' }, - { x: 2, y: 2, color: '#FF0000' }, - { x: 3, y: 2, color: '#FF0000' }, - - // 墙体(黄色)- 左半部分 - { x: 1, y: 3, color: '#FFFF00' }, - { x: 2, y: 3, color: '#FFFF00' }, - { x: 3, y: 3, color: '#FFFF00' }, - { x: 1, y: 4, color: '#FFFF00' }, - { x: 2, y: 4, color: '#FFFF00' }, - { x: 3, y: 4, color: '#FFFF00' }, - { x: 1, y: 5, color: '#FFFF00' }, - { x: 2, y: 5, color: '#FFFF00' }, - { x: 3, y: 5, color: '#FFFF00' }, - - // 门(棕色)- 在对称轴上 - { x: 3, y: 4, color: '#8B4513' }, - { x: 3, y: 5, color: '#8B4513' }, - - // 窗户(蓝色) - { x: 1, y: 3, color: '#0000FF' }, - ], -}; - -/** 蝴蝶 */ -export const BUTTERFLY_7X7: ShapeTemplate = { - id: 'butterfly-7x7-001', - name: '蝴蝶', - recommendedSize: { rows: 7, cols: 7 }, - category: 'animal', - difficulty: 4, - supportSymmetry: true, - symmetryType: 'vertical', - isComplete: false, - cells: [ - // 左翅膀 - { x: 0, y: 1, color: '#FF69B4' }, - { x: 1, y: 1, color: '#FF69B4' }, - { x: 0, y: 2, color: '#FF69B4' }, - { x: 1, y: 2, color: '#FF69B4' }, - { x: 2, y: 2, color: '#FF69B4' }, - { x: 0, y: 3, color: '#FF69B4' }, - { x: 1, y: 3, color: '#FF69B4' }, - { x: 2, y: 3, color: '#FF69B4' }, - - // 身体(在对称轴上) - { x: 3, y: 1, color: '#000000' }, - { x: 3, y: 2, color: '#000000' }, - { x: 3, y: 3, color: '#000000' }, - { x: 3, y: 4, color: '#000000' }, - { x: 3, y: 5, color: '#000000' }, - - // 左下半翅膀 - { x: 1, y: 4, color: '#FF69B4' }, - { x: 2, y: 4, color: '#FF69B4' }, - { x: 0, y: 5, color: '#FF69B4' }, - { x: 1, y: 5, color: '#FF69B4' }, - { x: 2, y: 5, color: '#FF69B4' }, - ], -}; - -/** 花朵 */ -export const FLOWER_7X7: ShapeTemplate = { - id: 'flower-7x7-001', - name: '花朵', - recommendedSize: { rows: 7, cols: 7 }, - category: 'nature', - difficulty: 3, - supportSymmetry: true, - symmetryType: 'both', - isComplete: false, - cells: [ - // 花瓣(左上半部分) - { x: 1, y: 0, color: '#FF69B4' }, - { x: 2, y: 0, color: '#FF69B4' }, - { x: 0, y: 1, color: '#FF69B4' }, - { x: 1, y: 1, color: '#FF69B4' }, - { x: 2, y: 1, color: '#FF69B4' }, - { x: 3, y: 1, color: '#FF69B4' }, // 对称轴上的点 - - // 花心(中心) - { x: 2, y: 2, color: '#FFFF00' }, - { x: 3, y: 2, color: '#FFFF00' }, // 对称轴上的点 - { x: 2, y: 3, color: '#FFFF00' }, - { x: 3, y: 3, color: '#FFFF00' }, // 对称轴上的点 - - // 茎(在对称轴上) - { x: 3, y: 4, color: '#00FF00' }, - { x: 3, y: 5, color: '#00FF00' }, - { x: 3, y: 6, color: '#00FF00' }, - ], -}; - /** 所有 7x7 形状模板 */ export const ALL_7X7_SHAPES: ShapeTemplate[] = [ - PUMPKIN_HEAD_7X7, - DINOSAUR_7X7, - HEART_7X7, - HOUSE_7X7, - BUTTERFLY_7X7, - FLOWER_7X7, + // 南瓜头 - 对称涂色(仅存储左半部分) + { + id: 'pumpkin-7x7-001', + name: '南瓜头', + category: 'character', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, // 只存储了左半部分 + cells: [ + // 茎(在对称轴上) + { x: 3, y: 0, color: '#F9A857' }, + + // 脸部轮廓(浅绿色)- 左半部分 + { x: 0, y: 1, color: '#B2D94B' }, + { x: 1, y: 1, color: '#B2D94B' }, + { x: 0, y: 2, color: '#B2D94B' }, + { x: 1, y: 2, color: '#B2D94B' }, + { x: 0, y: 3, color: '#B2D94B' }, + { x: 1, y: 3, color: '#B2D94B' }, + { x: 0, y: 4, color: '#B2D94B' }, + { x: 1, y: 4, color: '#B2D94B' }, + { x: 0, y: 5, color: '#B2D94B' }, + { x: 1, y: 5, color: '#B2D94B' }, + { x: 0, y: 6, color: '#B2D94B' }, + { x: 1, y: 6, color: '#B2D94B' }, + + // 脸部(黄色) + { x: 2, y: 1, color: '#FFE176' }, + { x: 3, y: 1, color: '#FFE176' }, // 对称轴上的点 + { x: 2, y: 2, color: '#FFE176' }, + { x: 2, y: 3, color: '#FFE176' }, + { x: 3, y: 3, color: '#FFE176' }, + { x: 2, y: 4, color: '#FFE176' }, + { x: 2, y: 5, color: '#FFE176' }, + { x: 3, y: 5, color: '#FFE176' }, + + // 眼睛(黑色)- 左眼 + { x: 2, y: 2, color: '#666666' }, + ], + }, + // 卡通恐龙 - 对称涂色(仅存储左半部分) + { + id: 'dinosaur-7x7-001', + name: '卡通恐龙', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, // 只存储了左半部分 + cells: [ + // 身体(浅绿色) + { x: 1, y: 1, color: '#B2D94B' }, + { x: 2, y: 1, color: '#B2D94B' }, + { x: 1, y: 2, color: '#B2D94B' }, + { x: 2, y: 2, color: '#B2D94B' }, + { x: 0, y: 3, color: '#B2D94B' }, + { x: 1, y: 3, color: '#B2D94B' }, + { x: 2, y: 3, color: '#B2D94B' }, + { x: 0, y: 4, color: '#B2D94B' }, + { x: 1, y: 4, color: '#B2D94B' }, + { x: 2, y: 4, color: '#B2D94B' }, + { x: 0, y: 5, color: '#B2D94B' }, + { x: 1, y: 5, color: '#B2D94B' }, + { x: 2, y: 5, color: '#B2D94B' }, + { x: 0, y: 6, color: '#B2D94B' }, + { x: 1, y: 6, color: '#B2D94B' }, + + // 眼睛(黑色) + { x: 2, y: 1, color: '#666666' }, + + // 嘴巴(红色) + { x: 2, y: 2, color: '#ED6D50' }, + { x: 0, y: 3, color: '#ED6D50' }, + + // 脚(黄色) + { x: 2, y: 5, color: '#FFE176' }, + { x: 0, y: 6, color: '#FFE176' }, + { x: 1, y: 6, color: '#FFE176' }, + ], + }, + // 心形 - 对称涂色(仅存储左半部分,对称轴在x=3) + { + id: 'heart-7x7-001', + name: '心形', + category: 'object', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 左上半部分 + { x: 1, y: 0, color: '#F2A4C0' }, + { x: 2, y: 0, color: '#F2A4C0' }, + { x: 0, y: 1, color: '#F2A4C0' }, + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴上的点 + { x: 0, y: 2, color: '#F2A4C0' }, + { x: 1, y: 3, color: '#F2A4C0' }, + { x: 2, y: 4, color: '#F2A4C0' }, + { x: 3, y: 5, color: '#F2A4C0' }, // 对称轴上的点 + { x: 3, y: 6, color: '#F2A4C0' }, // 对称轴上的点(底部尖端) + ], + }, + // 房子 + { + id: 'house-7x7-001', + name: '小房子', + category: 'object', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 屋顶(三角形)- 左半部分 + { x: 2, y: 0, color: '#ED6D50' }, + { x: 1, y: 1, color: '#ED6D50' }, + { x: 2, y: 1, color: '#ED6D50' }, + { x: 3, y: 1, color: '#ED6D50' }, // 对称轴上的点 + { x: 0, y: 2, color: '#ED6D50' }, + { x: 1, y: 2, color: '#ED6D50' }, + { x: 2, y: 2, color: '#ED6D50' }, + { x: 3, y: 2, color: '#ED6D50' }, + + // 墙体(黄色)- 左半部分 + { x: 1, y: 3, color: '#FFE176' }, + { x: 2, y: 3, color: '#FFE176' }, + { x: 3, y: 3, color: '#FFE176' }, + { x: 1, y: 4, color: '#FFE176' }, + { x: 2, y: 4, color: '#FFE176' }, + { x: 3, y: 4, color: '#FFE176' }, + { x: 1, y: 5, color: '#FFE176' }, + { x: 2, y: 5, color: '#FFE176' }, + { x: 3, y: 5, color: '#FFE176' }, + + // 门(棕色)- 在对称轴上 + { x: 3, y: 4, color: '#BC8F71' }, + { x: 3, y: 5, color: '#BC8F71' }, + + // 窗户(蓝色) + { x: 1, y: 3, color: '#6CD2EA' }, + ], + }, + // 蝴蝶 + { + id: 'butterfly-7x7-001', + name: '蝴蝶', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 左翅膀 + { x: 0, y: 1, color: '#F2A4C0' }, + { x: 1, y: 1, color: '#F2A4C0' }, + { x: 0, y: 2, color: '#F2A4C0' }, + { x: 1, y: 2, color: '#F2A4C0' }, + { x: 2, y: 2, color: '#F2A4C0' }, + { x: 0, y: 3, color: '#F2A4C0' }, + { x: 1, y: 3, color: '#F2A4C0' }, + { x: 2, y: 3, color: '#F2A4C0' }, + + // 身体(在对称轴上) + { x: 3, y: 1, color: '#666666' }, + { x: 3, y: 2, color: '#666666' }, + { x: 3, y: 3, color: '#666666' }, + { x: 3, y: 4, color: '#666666' }, + { x: 3, y: 5, color: '#666666' }, + + // 左下半翅膀 + { x: 1, y: 4, color: '#F2A4C0' }, + { x: 2, y: 4, color: '#F2A4C0' }, + { x: 0, y: 5, color: '#F2A4C0' }, + { x: 1, y: 5, color: '#F2A4C0' }, + { x: 2, y: 5, color: '#F2A4C0' }, + ], + }, + // 花朵 + { + id: 'flower-7x7-001', + name: '花朵', + category: 'nature', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 花瓣(左上半部分) + { x: 1, y: 0, color: '#F2A4C0' }, + { x: 2, y: 0, color: '#F2A4C0' }, + { x: 0, y: 1, color: '#F2A4C0' }, + { x: 1, y: 1, color: '#F2A4C0' }, + { x: 2, y: 1, color: '#F2A4C0' }, + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴上的点 + + // 花心(中心) + { x: 2, y: 2, color: '#FFE176' }, + { x: 3, y: 2, color: '#FFE176' }, // 对称轴上的点 + { x: 2, y: 3, color: '#FFE176' }, + { x: 3, y: 3, color: '#FFE176' }, // 对称轴上的点 + + // 茎(在对称轴上) + { x: 3, y: 4, color: '#53D1B6' }, + { x: 3, y: 5, color: '#53D1B6' }, + { x: 3, y: 6, color: '#53D1B6' }, + ], + }, + // 多色星星 + { + id: 'colorful-star-7x7-001', + name: '多色星星', + category: 'geometric', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + { x: 3, y: 0, color: '#FFE176' }, // 顶部 - 黄色 + { x: 2, y: 1, color: '#F9A857' }, // 左上 - 橙色 + { x: 3, y: 1, color: '#F9A857' }, // 对称轴 + { x: 1, y: 2, color: '#ED6D50' }, // 左 - 红色 + { x: 2, y: 2, color: '#ED6D50' }, + { x: 3, y: 2, color: '#FFE176' }, // 中心 - 黄色 + { x: 0, y: 3, color: '#ED6D50' }, // 最左 - 红色 + { x: 3, y: 3, color: '#FFE176' }, // 对称轴中心 - 黄色 + { x: 1, y: 4, color: '#ED6D50' }, // 左下 - 红色 + { x: 2, y: 4, color: '#ED6D50' }, + { x: 3, y: 4, color: '#FFE176' }, // 中心 - 黄色 + { x: 2, y: 5, color: '#F9A857' }, // 左下 - 橙色 + { x: 3, y: 5, color: '#F9A857' }, // 对称轴 + { x: 3, y: 6, color: '#FFE176' }, // 底部 - 黄色 + ], + }, + // 多色心形 + { + id: 'colorful-heart-7x7-001', + name: '多色心形', + category: 'object', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + { x: 2, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 0, color: '#ED6D50' }, // 红色 - 对称轴 + { x: 1, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 1, color: '#ED6D50' }, // 红色 + { x: 3, y: 1, color: '#ED6D50' }, // 对称轴 + { x: 0, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 2, color: '#ED6D50' }, // 对称轴 + { x: 0, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#ED6D50' }, // 红色 + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴 + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴底部 + ], + }, + // 多色房子 + { + id: 'colorful-house-7x7-001', + name: '多色房子', + category: 'object', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 屋顶(三角形)- 左半部分,多色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#FFE176' }, // 黄色 + { x: 3, y: 1, color: '#FFE176' }, // 对称轴 + { x: 0, y: 2, color: '#ED6D50' }, // 红色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + { x: 3, y: 2, color: '#FFE176' }, // 对称轴 + + // 墙体(多色)- 左半部分 + { x: 1, y: 3, color: '#FFE176' }, // 黄色 + { x: 2, y: 3, color: '#F9A857' }, // 橙色 + { x: 3, y: 3, color: '#FFE176' }, // 对称轴 + { x: 1, y: 4, color: '#FFE176' }, // 黄色 + { x: 2, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 4, color: '#ED6D50' }, // 门 - 红色 + { x: 1, y: 5, color: '#FFE176' }, // 黄色 + { x: 2, y: 5, color: '#F9A857' }, // 橙色 + { x: 3, y: 5, color: '#ED6D50' }, // 门 - 红色 + + // 窗户(蓝色) + { x: 1, y: 3, color: '#6CD2EA' }, + ], + }, + // 多色蝴蝶 + { + id: 'colorful-butterfly-7x7-001', + name: '多色蝴蝶', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 左翅膀 - 多色 + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 2, color: '#FFE176' }, // 黄色 + { x: 2, y: 2, color: '#B2D94B' }, // 绿色 + { x: 0, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#ED6D50' }, // 红色 + { x: 2, y: 3, color: '#F9A857' }, // 橙色 + + // 身体(在对称轴上)- 黑色 + { x: 3, y: 1, color: '#666666' }, + { x: 3, y: 2, color: '#666666' }, + { x: 3, y: 3, color: '#666666' }, + { x: 3, y: 4, color: '#666666' }, + { x: 3, y: 5, color: '#666666' }, + + // 左下半翅膀 - 多色 + { x: 1, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 4, color: '#ED6D50' }, // 红色 + { x: 0, y: 5, color: '#F9A857' }, // 橙色 + { x: 1, y: 5, color: '#FFE176' }, // 黄色 + { x: 2, y: 5, color: '#B2D94B' }, // 绿色 + ], + }, + // 多色花朵 + { + id: 'colorful-flower-7x7-001', + name: '多色花朵', + category: 'nature', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 花瓣(左上半部分)- 多色 + { x: 1, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#FFE176' }, // 黄色 + { x: 3, y: 1, color: '#FFE176' }, // 对称轴 + + // 花心(中心)- 多色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + { x: 3, y: 2, color: '#F9A857' }, // 橙色 - 对称轴 + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#F9A857' }, // 橙色 - 对称轴 + + // 茎(在对称轴上)- 绿色 + { x: 3, y: 4, color: '#53D1B6' }, + { x: 3, y: 5, color: '#53D1B6' }, + { x: 3, y: 6, color: '#53D1B6' }, + ], + }, + // 太阳 - 对称涂色(仅存储左半部分) + { + id: 'sun-7x7-001', + name: '太阳', + category: 'nature', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 光线(顶部)- 左半部分 + { x: 1, y: 0, color: '#FFE176' }, // 黄色光线 + { x: 2, y: 0, color: '#F9A857' }, // 橙色光线 + { x: 3, y: 0, color: '#FFE176' }, // 对称轴 - 黄色光线 + { x: 0, y: 1, color: '#FFE176' }, // 黄色光线 + { x: 3, y: 1, color: '#F9A857' }, // 对称轴 - 橙色光线 + + // 太阳主体(圆形)- 左半部分 + { x: 1, y: 2, color: '#FFE176' }, // 黄色 + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + { x: 3, y: 2, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 0, y: 3, color: '#F9A857' }, // 橙色 + { x: 1, y: 3, color: '#FFE176' }, // 黄色 + { x: 2, y: 3, color: '#F9A857' }, // 橙色 + { x: 3, y: 3, color: '#ED6D50' }, // 对称轴中心 - 红色(太阳中心) + { x: 0, y: 4, color: '#F9A857' }, // 橙色 + { x: 1, y: 4, color: '#FFE176' }, // 黄色 + { x: 2, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 4, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 1, y: 5, color: '#FFE176' }, // 黄色 + { x: 2, y: 5, color: '#F9A857' }, // 橙色 + { x: 3, y: 5, color: '#FFE176' }, // 对称轴 - 黄色 + + // 光线(底部)- 左半部分 + { x: 0, y: 6, color: '#FFE176' }, // 黄色光线 + { x: 1, y: 6, color: '#F9A857' }, // 橙色光线 + { x: 2, y: 6, color: '#FFE176' }, // 黄色光线 + { x: 3, y: 6, color: '#F9A857' }, // 对称轴 - 橙色光线 + ], + }, + // 多色圆形 + { + id: 'colorful-circle-7x7-001', + name: '多色圆形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + { x: 2, y: 0, color: '#FFE176' }, + { x: 3, y: 0, color: '#F9A857' }, // 对称轴 + { x: 1, y: 1, color: '#F9A857' }, + { x: 3, y: 1, color: '#ED6D50' }, // 对称轴 + { x: 0, y: 2, color: '#ED6D50' }, + { x: 3, y: 2, color: '#F2A4C0' }, // 对称轴 + { x: 0, y: 3, color: '#F2A4C0' }, + { x: 3, y: 3, color: '#79A7ED' }, // 对称轴 + { x: 0, y: 4, color: '#79A7ED' }, + { x: 3, y: 4, color: '#6CD2EA' }, // 对称轴 + { x: 1, y: 5, color: '#6CD2EA' }, + { x: 3, y: 5, color: '#53D1B6' }, // 对称轴 + { x: 2, y: 6, color: '#53D1B6' }, + { x: 3, y: 6, color: '#B2D94B' }, // 对称轴 + ], + }, + // 风车 - 对称涂色(仅存储左半部分) + { + id: 'windmill-7x7-001', + name: '风车', + category: 'object', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 顶部叶片 - 左半部分 + { x: 2, y: 0, color: '#FFE176' }, // 黄色 + { x: 3, y: 0, color: '#F9A857' }, // 对称轴 - 橙色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#ED6D50' }, // 红色 + { x: 3, y: 1, color: '#FFE176' }, // 对称轴 - 黄色 + + // 左侧叶片 - 左半部分 + { x: 0, y: 2, color: '#ED6D50' }, // 红色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + { x: 3, y: 2, color: '#F9A857' }, // 对称轴 - 橙色 + + // 中心 + { x: 1, y: 3, color: '#FFE176' }, // 黄色 + { x: 2, y: 3, color: '#F9A857' }, // 橙色 + { x: 3, y: 3, color: '#666666' }, // 对称轴中心 - 黑色(中心点) + + // 右侧叶片 - 左半部分(对称后会成为左侧) + { x: 1, y: 4, color: '#F9A857' }, // 橙色 + { x: 2, y: 4, color: '#ED6D50' }, // 红色 + { x: 3, y: 4, color: '#FFE176' }, // 对称轴 - 黄色 + + // 底部叶片 - 左半部分 + { x: 1, y: 5, color: '#FFE176' }, // 黄色 + { x: 2, y: 5, color: '#F9A857' }, // 橙色 + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴 - 红色 + { x: 2, y: 6, color: '#F9A857' }, // 橙色 + { x: 3, y: 6, color: '#FFE176' }, // 对称轴 - 黄色 + ], + }, + // 多色十字 + { + id: 'colorful-cross-7x7-001', + name: '多色十字', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + { x: 3, y: 0, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 3, y: 1, color: '#F9A857' }, // 橙色 + { x: 0, y: 3, color: '#ED6D50' }, // 红色 + { x: 1, y: 3, color: '#F9A857' }, // 橙色 + { x: 2, y: 3, color: '#FFE176' }, // 黄色 + { x: 3, y: 3, color: '#B2D94B' }, // 对称轴中心 - 绿色 + { x: 3, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 5, color: '#ED6D50' }, // 红色 + { x: 3, y: 6, color: '#FFE176' }, // 对称轴 - 黄色 + ], + }, + // 蝴蝶结 - 对称涂色(仅存储左半部分) + { + id: 'bow-7x7-001', + name: '蝴蝶结', + category: 'object', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 顶部蝴蝶结 - 左半部分 + { x: 1, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#F2A4C0' }, // 对称轴 - 粉色 + { x: 0, y: 1, color: '#ED6D50' }, // 红色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#FFE176' }, // 黄色 + { x: 3, y: 1, color: '#F9A857' }, // 对称轴 - 橙色 + { x: 0, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + { x: 3, y: 2, color: '#ED6D50' }, // 对称轴 - 红色 + + // 中心结 - 左半部分 + { x: 1, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#F9A857' }, // 对称轴中心 - 橙色 + + // 底部蝴蝶结 - 左半部分 + { x: 0, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 4, color: '#ED6D50' }, // 对称轴 - 红色 + { x: 0, y: 5, color: '#ED6D50' }, // 红色 + { x: 1, y: 5, color: '#F9A857' }, // 橙色 + { x: 2, y: 5, color: '#FFE176' }, // 黄色 + { x: 3, y: 5, color: '#F9A857' }, // 对称轴 - 橙色 + { x: 1, y: 6, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 6, color: '#ED6D50' }, // 红色 + { x: 3, y: 6, color: '#F2A4C0' }, // 对称轴 - 粉色 + ], + }, + // 多色X形 + { + id: 'colorful-x-7x7-001', + name: '多色X形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + { x: 0, y: 0, color: '#ED6D50' }, // 红色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#FFE176' }, // 黄色 + { x: 3, y: 3, color: '#B2D94B' }, // 对称轴中心 - 绿色 + { x: 2, y: 4, color: '#53D1B6' }, // 青色 + { x: 1, y: 5, color: '#6CD2EA' }, // 蓝色 + { x: 0, y: 6, color: '#79A7ED' }, // 深蓝 + { x: 3, y: 0, color: '#ED6D50' }, // 对称轴 - 红色 + { x: 3, y: 6, color: '#79A7ED' }, // 对称轴 - 深蓝 + ], + }, + // 小树 - 对称涂色(仅存储左半部分) + { + id: 'tree-7x7-001', + name: '小树', + category: 'nature', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 树顶(三角形)- 左半部分 + { x: 2, y: 0, color: '#B2D94B' }, // 绿色 + { x: 3, y: 0, color: '#53D1B6' }, // 对称轴 - 青色 + { x: 1, y: 1, color: '#B2D94B' }, // 绿色 + { x: 2, y: 1, color: '#53D1B6' }, // 青色 + { x: 3, y: 1, color: '#B2D94B' }, // 对称轴 - 绿色 + { x: 0, y: 2, color: '#B2D94B' }, // 绿色 + { x: 1, y: 2, color: '#53D1B6' }, // 青色 + { x: 2, y: 2, color: '#B2D94B' }, // 绿色 + { x: 3, y: 2, color: '#53D1B6' }, // 对称轴 - 青色 + + // 树干 - 左半部分 + { x: 0, y: 3, color: '#BC8F71' }, // 棕色 + { x: 1, y: 3, color: '#BC8F71' }, // 棕色 + { x: 2, y: 3, color: '#BC8F71' }, // 棕色 + { x: 3, y: 3, color: '#BC8F71' }, // 对称轴 - 棕色 + { x: 0, y: 4, color: '#BC8F71' }, // 棕色 + { x: 1, y: 4, color: '#BC8F71' }, // 棕色 + { x: 2, y: 4, color: '#BC8F71' }, // 棕色 + { x: 3, y: 4, color: '#BC8F71' }, // 对称轴 - 棕色 + { x: 1, y: 5, color: '#BC8F71' }, // 棕色 + { x: 2, y: 5, color: '#BC8F71' }, // 棕色 + { x: 3, y: 5, color: '#BC8F71' }, // 对称轴 - 棕色 + { x: 1, y: 6, color: '#BC8F71' }, // 棕色 + { x: 2, y: 6, color: '#BC8F71' }, // 棕色 + { x: 3, y: 6, color: '#BC8F71' }, // 对称轴 - 棕色 + ], + }, + // 多色三角形 + { + id: 'colorful-triangle-7x7-001', + name: '多色三角形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + { x: 3, y: 0, color: '#FFE176' }, // 对称轴顶部 - 黄色 + { x: 2, y: 1, color: '#F9A857' }, // 橙色 + { x: 3, y: 1, color: '#ED6D50' }, // 对称轴 - 红色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 2, color: '#F9A857' }, // 对称轴 - 橙色 + { x: 0, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 3, color: '#53D1B6' }, // 对称轴 - 青色 + { x: 0, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 4, color: '#53D1B6' }, // 青色 + { x: 3, y: 4, color: '#B2D94B' }, // 对称轴 - 绿色 + { x: 0, y: 5, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 5, color: '#53D1B6' }, // 青色 + { x: 2, y: 5, color: '#B2D94B' }, // 绿色 + { x: 3, y: 5, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 0, y: 6, color: '#53D1B6' }, // 青色 + { x: 1, y: 6, color: '#B2D94B' }, // 绿色 + { x: 2, y: 6, color: '#FFE176' }, // 黄色 + { x: 3, y: 6, color: '#F9A857' }, // 对称轴 - 橙色 + ], + }, + // 钻石 - 对称涂色(仅存储左半部分) + { + id: 'diamond-gem-7x7-001', + name: '钻石', + category: 'object', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 顶部尖端 - 左半部分 + { x: 2, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 0, color: '#79A7ED' }, // 对称轴 - 蓝色 + + // 上半部分 - 左半部分 + { x: 1, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 1, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 1, color: '#6CD2EA' }, // 对称轴 - 浅蓝 + { x: 0, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 2, color: '#53D1B6' }, // 青色 + { x: 3, y: 2, color: '#79A7ED' }, // 对称轴 - 蓝色 + + // 中心(最宽部分)- 左半部分 + { x: 0, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 3, color: '#53D1B6' }, // 青色 + { x: 2, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 3, color: '#FFE176' }, // 对称轴中心 - 黄色(高光) + + // 下半部分 - 左半部分 + { x: 0, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 4, color: '#53D1B6' }, // 青色 + { x: 3, y: 4, color: '#79A7ED' }, // 对称轴 - 蓝色 + { x: 1, y: 5, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 5, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 5, color: '#6CD2EA' }, // 对称轴 - 浅蓝 + + // 底部尖端 - 左半部分 + { x: 2, y: 6, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 6, color: '#79A7ED' }, // 对称轴 - 蓝色 + ], + }, + // 多色菱形 + { + id: 'colorful-diamond-7x7-001', + name: '多色菱形', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + { x: 3, y: 0, color: '#FFE176' }, // 对称轴顶部 - 黄色 + { x: 2, y: 1, color: '#F9A857' }, // 橙色 + { x: 3, y: 1, color: '#ED6D50' }, // 对称轴 - 红色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 2, color: '#79A7ED' }, // 对称轴 - 蓝色 + { x: 0, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 3, color: '#53D1B6' }, // 对称轴中心 - 青色 + { x: 1, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 4, color: '#53D1B6' }, // 青色 + { x: 3, y: 4, color: '#B2D94B' }, // 对称轴 - 绿色 + { x: 2, y: 5, color: '#B2D94B' }, // 绿色 + { x: 3, y: 5, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 3, y: 6, color: '#F9A857' }, // 对称轴底部 - 橙色 + ], + }, + // 边框 + { + id: 'frame-7x7-001', + name: '边框', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 顶部 + { x: 0, y: 0, color: '#B2D94B' }, + { x: 1, y: 0, color: '#B2D94B' }, + { x: 2, y: 0, color: '#B2D94B' }, + { x: 3, y: 0, color: '#B2D94B' }, // 对称轴 + // 左侧 + { x: 0, y: 1, color: '#B2D94B' }, + { x: 0, y: 2, color: '#B2D94B' }, + { x: 0, y: 3, color: '#B2D94B' }, + { x: 0, y: 4, color: '#B2D94B' }, + { x: 0, y: 5, color: '#B2D94B' }, + // 右侧 + { x: 3, y: 1, color: '#B2D94B' }, // 对称轴 + { x: 3, y: 2, color: '#B2D94B' }, // 对称轴 + { x: 3, y: 3, color: '#B2D94B' }, // 对称轴 + { x: 3, y: 4, color: '#B2D94B' }, // 对称轴 + { x: 3, y: 5, color: '#B2D94B' }, // 对称轴 + // 底部 + { x: 0, y: 6, color: '#B2D94B' }, + { x: 1, y: 6, color: '#B2D94B' }, + { x: 2, y: 6, color: '#B2D94B' }, + { x: 3, y: 6, color: '#B2D94B' }, // 对称轴 + ], + }, + // 多色边框 + { + id: 'colorful-frame-7x7-001', + name: '多色边框', + category: 'geometric', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + // 顶部 - 多色 + { x: 0, y: 0, color: '#FFE176' }, // 黄色 + { x: 1, y: 0, color: '#F9A857' }, // 橙色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#F2A4C0' }, // 对称轴 - 粉色 + // 左侧 - 多色 + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 0, y: 2, color: '#ED6D50' }, // 红色 + { x: 0, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 0, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 0, y: 5, color: '#6CD2EA' }, // 浅蓝 + // 右侧 - 多色 + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴 - 粉色 + { x: 3, y: 2, color: '#79A7ED' }, // 对称轴 - 蓝色 + { x: 3, y: 3, color: '#6CD2EA' }, // 对称轴 - 浅蓝 + { x: 3, y: 4, color: '#53D1B6' }, // 对称轴 - 青色 + { x: 3, y: 5, color: '#B2D94B' }, // 对称轴 - 绿色 + // 底部 - 多色 + { x: 0, y: 6, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 6, color: '#53D1B6' }, // 青色 + { x: 2, y: 6, color: '#B2D94B' }, // 绿色 + { x: 3, y: 6, color: '#FFE176' }, // 对称轴 - 黄色 + ], + }, + // 棋盘格 + { + id: 'checkerboard-7x7-001', + name: '棋盘格', + category: 'geometric', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + { x: 0, y: 0, color: '#FFE176' }, + { x: 2, y: 0, color: '#FFE176' }, + { x: 3, y: 0, color: '#FFE176' }, // 对称轴 + { x: 1, y: 1, color: '#FFE176' }, + { x: 3, y: 1, color: '#FFE176' }, // 对称轴 + { x: 0, y: 2, color: '#FFE176' }, + { x: 2, y: 2, color: '#FFE176' }, + { x: 3, y: 2, color: '#FFE176' }, // 对称轴 + { x: 1, y: 3, color: '#FFE176' }, + { x: 3, y: 3, color: '#FFE176' }, // 对称轴中心 + { x: 0, y: 4, color: '#FFE176' }, + { x: 2, y: 4, color: '#FFE176' }, + { x: 3, y: 4, color: '#FFE176' }, // 对称轴 + { x: 1, y: 5, color: '#FFE176' }, + { x: 3, y: 5, color: '#FFE176' }, // 对称轴 + { x: 0, y: 6, color: '#FFE176' }, + { x: 2, y: 6, color: '#FFE176' }, + { x: 3, y: 6, color: '#FFE176' }, // 对称轴 + ], + }, + // 多色棋盘格 + { + id: 'colorful-checkerboard-7x7-001', + name: '多色棋盘格', + category: 'geometric', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'both', + isComplete: false, + cells: [ + { x: 0, y: 0, color: '#FFE176' }, // 黄色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 3, y: 0, color: '#ED6D50' }, // 对称轴 - 红色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴 - 粉色 + { x: 0, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 2, color: '#6CD2EA' }, // 对称轴 - 浅蓝 + { x: 1, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 3, color: '#53D1B6' }, // 对称轴中心 - 青色 + { x: 0, y: 4, color: '#53D1B6' }, // 青色 + { x: 2, y: 4, color: '#B2D94B' }, // 绿色 + { x: 3, y: 4, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 1, y: 5, color: '#FFE176' }, // 黄色 + { x: 3, y: 5, color: '#F9A857' }, // 对称轴 - 橙色 + { x: 0, y: 6, color: '#F9A857' }, // 橙色 + { x: 2, y: 6, color: '#ED6D50' }, // 红色 + { x: 3, y: 6, color: '#F2A4C0' }, // 对称轴 - 粉色 + ], + }, + // 鹦鹉 + { + id: 'parrot-7x7-001', + name: '鹦鹉', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部(左半部分) + { x: 1, y: 0, color: '#FFE176' }, // 黄色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 3, y: 0, color: '#ED6D50' }, // 对称轴 - 红色 + { x: 0, y: 1, color: '#FFE176' }, // 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#ED6D50' }, // 红色 + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴 - 粉色 + + // 身体(左半部分) + { x: 0, y: 2, color: '#B2D94B' }, // 绿色 + { x: 1, y: 2, color: '#53D1B6' }, // 青色 + { x: 2, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 2, color: '#79A7ED' }, // 对称轴 - 蓝色 + { x: 0, y: 3, color: '#B2D94B' }, // 绿色 + { x: 1, y: 3, color: '#53D1B6' }, // 青色 + { x: 2, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 3, color: '#79A7ED' }, // 对称轴 - 蓝色 + + // 翅膀(左半部分) + { x: 0, y: 4, color: '#B2D94B' }, // 绿色 + { x: 1, y: 4, color: '#53D1B6' }, // 青色 + { x: 2, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 4, color: '#79A7ED' }, // 对称轴 - 蓝色 + + // 尾巴和脚 + { x: 1, y: 5, color: '#B2D94B' }, // 绿色 + { x: 2, y: 5, color: '#53D1B6' }, // 青色 + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴 - 红色(脚) + { x: 2, y: 6, color: '#B2D94B' }, // 绿色 + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴 - 红色(脚) + ], + }, + // 小狗 + { + id: 'dog-7x7-001', + name: '小狗', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部(左半部分) + { x: 1, y: 0, color: '#F9A857' }, // 橙色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#ED6D50' }, // 对称轴 + { x: 0, y: 1, color: '#F9A857' }, // 橙色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#F9A857' }, // 对称轴 + + // 身体(左半部分) + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + { x: 3, y: 2, color: '#F9A857' }, // 对称轴 + { x: 0, y: 3, color: '#F9A857' }, // 橙色 + { x: 1, y: 3, color: '#ED6D50' }, // 红色 + { x: 2, y: 3, color: '#F9A857' }, // 橙色 + { x: 3, y: 3, color: '#F9A857' }, // 对称轴 + + // 腿和尾巴 + { x: 0, y: 4, color: '#F9A857' }, // 橙色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 4, color: '#ED6D50' }, // 对称轴(腿) + { x: 0, y: 5, color: '#ED6D50' }, // 红色(腿) + { x: 1, y: 5, color: '#F9A857' }, // 橙色 + { x: 2, y: 5, color: '#ED6D50' }, // 红色(腿) + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴(腿) + { x: 0, y: 6, color: '#ED6D50' }, // 红色(腿) + { x: 2, y: 6, color: '#F9A857' }, // 橙色(尾巴) + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴(腿) + ], + }, + // 小猫 + { + id: 'cat-7x7-001', + name: '小猫', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部和耳朵(左半部分) + { x: 1, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#ED6D50' }, // 对称轴 + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色(耳朵) + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴 + + // 身体(左半部分) + { x: 0, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 2, color: '#F2A4C0' }, // 对称轴 + { x: 0, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#ED6D50' }, // 红色 + { x: 2, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 3, color: '#F2A4C0' }, // 对称轴 + + // 腿和尾巴 + { x: 0, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 4, color: '#ED6D50' }, // 对称轴(腿) + { x: 0, y: 5, color: '#ED6D50' }, // 红色(腿) + { x: 1, y: 5, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 5, color: '#ED6D50' }, // 红色(腿) + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴(腿) + { x: 0, y: 6, color: '#ED6D50' }, // 红色(腿) + { x: 1, y: 6, color: '#F2A4C0' }, // 粉色(尾巴) + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴(腿) + ], + }, + // 小鸟 + { + id: 'bird-7x7-001', + name: '小鸟', + category: 'animal', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部(左半部分) + { x: 1, y: 0, color: '#FFE176' }, // 黄色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 3, y: 0, color: '#ED6D50' }, // 对称轴 - 红色(嘴巴) + { x: 0, y: 1, color: '#FFE176' }, // 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#FFE176' }, // 对称轴 + + // 身体和翅膀(左半部分) + { x: 0, y: 2, color: '#FFE176' }, // 黄色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + { x: 3, y: 2, color: '#FFE176' }, // 对称轴 + { x: 0, y: 3, color: '#F9A857' }, // 橙色(翅膀) + { x: 1, y: 3, color: '#ED6D50' }, // 红色 + { x: 2, y: 3, color: '#FFE176' }, // 黄色 + { x: 3, y: 3, color: '#F9A857' }, // 对称轴 + + // 尾巴和脚 + { x: 1, y: 4, color: '#F9A857' }, // 橙色 + { x: 2, y: 4, color: '#ED6D50' }, // 红色 + { x: 3, y: 4, color: '#FFE176' }, // 对称轴 + { x: 2, y: 5, color: '#ED6D50' }, // 红色(脚) + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴(脚) + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴(脚) + ], + }, + // 兔子 + { + id: 'rabbit-7x7-001', + name: '兔子', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 耳朵(左半部分) + { x: 0, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 0, color: '#ED6D50' }, // 红色 + { x: 2, y: 0, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 0, color: '#F2A4C0' }, // 对称轴 + { x: 0, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴 + + // 头部(左半部分) + { x: 1, y: 2, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 2, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 2, color: '#F2A4C0' }, // 对称轴 + { x: 0, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 3, color: '#ED6D50' }, // 红色(鼻子) + { x: 2, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 3, color: '#F2A4C0' }, // 对称轴 + + // 身体(左半部分) + { x: 0, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 3, y: 4, color: '#F2A4C0' }, // 对称轴 + { x: 1, y: 5, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 5, color: '#ED6D50' }, // 红色 + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴(腿) + { x: 1, y: 6, color: '#ED6D50' }, // 红色(腿) + { x: 2, y: 6, color: '#ED6D50' }, // 红色(腿) + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴(腿) + ], + }, + // 鱼 + { + id: 'fish-7x7-001', + name: '鱼', + category: 'animal', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部和身体(左半部分) + { x: 0, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 1, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 1, color: '#53D1B6' }, // 青色 + { x: 3, y: 1, color: '#53D1B6' }, // 对称轴 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 2, color: '#53D1B6' }, // 青色 + { x: 2, y: 2, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 2, color: '#6CD2EA' }, // 对称轴 + { x: 0, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 1, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 3, color: '#53D1B6' }, // 青色 + { x: 3, y: 3, color: '#53D1B6' }, // 对称轴 + + // 尾巴(左半部分) + { x: 1, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 4, color: '#53D1B6' }, // 对称轴 + { x: 2, y: 5, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 5, color: '#79A7ED' }, // 对称轴 + ], + }, + // 多色鱼 + { + id: 'colorful-fish-7x7-001', + name: '多色鱼', + category: 'animal', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部和身体(左半部分)- 多色 + { x: 0, y: 1, color: '#FFE176' }, // 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#ED6D50' }, // 红色 + { x: 3, y: 1, color: '#F2A4C0' }, // 对称轴 - 粉色 + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 2, color: '#79A7ED' }, // 对称轴 - 蓝色 + { x: 0, y: 3, color: '#ED6D50' }, // 红色 + { x: 1, y: 3, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 3, color: '#6CD2EA' }, // 对称轴 - 浅蓝 + + // 尾巴(左半部分)- 多色 + { x: 1, y: 4, color: '#F2A4C0' }, // 粉色 + { x: 2, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 4, color: '#6CD2EA' }, // 对称轴 - 浅蓝 + { x: 2, y: 5, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 5, color: '#53D1B6' }, // 对称轴 - 青色 + ], + }, + // 小熊 + { + id: 'bear-7x7-001', + name: '小熊', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部和耳朵(左半部分) + { x: 1, y: 0, color: '#F9A857' }, // 橙色 + { x: 2, y: 0, color: '#ED6D50' }, // 红色 + { x: 3, y: 0, color: '#F9A857' }, // 对称轴 + { x: 0, y: 1, color: '#F9A857' }, // 橙色(耳朵) + { x: 1, y: 1, color: '#ED6D50' }, // 红色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#F9A857' }, // 对称轴 + + // 身体(左半部分) + { x: 0, y: 2, color: '#F9A857' }, // 橙色 + { x: 1, y: 2, color: '#ED6D50' }, // 红色 + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + { x: 3, y: 2, color: '#F9A857' }, // 对称轴 + { x: 0, y: 3, color: '#F9A857' }, // 橙色 + { x: 1, y: 3, color: '#ED6D50' }, // 红色 + { x: 2, y: 3, color: '#F9A857' }, // 橙色 + { x: 3, y: 3, color: '#F9A857' }, // 对称轴 + + // 腿 + { x: 0, y: 4, color: '#F9A857' }, // 橙色 + { x: 1, y: 4, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 4, color: '#ED6D50' }, // 对称轴(腿) + { x: 0, y: 5, color: '#ED6D50' }, // 红色(腿) + { x: 1, y: 5, color: '#F9A857' }, // 橙色 + { x: 2, y: 5, color: '#ED6D50' }, // 红色(腿) + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴(腿) + { x: 0, y: 6, color: '#ED6D50' }, // 红色(腿) + { x: 2, y: 6, color: '#ED6D50' }, // 红色(腿) + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴(腿) + ], + }, + // 小鸭子 + { + id: 'duck-7x7-001', + name: '小鸭子', + category: 'animal', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部(左半部分) + { x: 1, y: 0, color: '#FFE176' }, // 黄色 + { x: 2, y: 0, color: '#F9A857' }, // 橙色 + { x: 3, y: 0, color: '#ED6D50' }, // 对称轴 - 红色(嘴巴) + { x: 0, y: 1, color: '#FFE176' }, // 黄色 + { x: 1, y: 1, color: '#F9A857' }, // 橙色 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#FFE176' }, // 对称轴 + + // 身体(左半部分) + { x: 0, y: 2, color: '#FFE176' }, // 黄色 + { x: 1, y: 2, color: '#F9A857' }, // 橙色 + { x: 2, y: 2, color: '#ED6D50' }, // 红色 + { x: 3, y: 2, color: '#FFE176' }, // 对称轴 + { x: 0, y: 3, color: '#FFE176' }, // 黄色 + { x: 1, y: 3, color: '#F9A857' }, // 橙色 + { x: 2, y: 3, color: '#ED6D50' }, // 红色 + { x: 3, y: 3, color: '#FFE176' }, // 对称轴 + + // 翅膀和脚 + { x: 0, y: 4, color: '#F9A857' }, // 橙色(翅膀) + { x: 1, y: 4, color: '#ED6D50' }, // 红色 + { x: 2, y: 4, color: '#FFE176' }, // 黄色 + { x: 3, y: 4, color: '#F9A857' }, // 对称轴 + { x: 1, y: 5, color: '#ED6D50' }, // 红色(脚) + { x: 2, y: 5, color: '#ED6D50' }, // 红色(脚) + { x: 3, y: 5, color: '#ED6D50' }, // 对称轴(脚) + { x: 2, y: 6, color: '#ED6D50' }, // 红色(脚) + { x: 3, y: 6, color: '#ED6D50' }, // 对称轴(脚) + ], + }, + // 小象 + { + id: 'elephant-7x7-001', + name: '小象', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, + cells: [ + // 头部和鼻子(左半部分) + { x: 1, y: 0, color: '#79A7ED' }, // 蓝色 + { x: 2, y: 0, color: '#6CD2EA' }, // 浅蓝 + { x: 3, y: 0, color: '#6CD2EA' }, // 对称轴 + { x: 0, y: 1, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 1, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 1, color: '#666666' }, // 黑色(眼睛) + { x: 3, y: 1, color: '#79A7ED' }, // 对称轴 + { x: 0, y: 2, color: '#79A7ED' }, // 蓝色(鼻子) + { x: 1, y: 2, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 2, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 2, color: '#6CD2EA' }, // 对称轴 + + // 身体(左半部分) + { x: 0, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 3, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 3, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 3, color: '#6CD2EA' }, // 对称轴 + { x: 0, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 1, y: 4, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 4, color: '#79A7ED' }, // 蓝色 + { x: 3, y: 4, color: '#6CD2EA' }, // 对称轴 + + // 腿 + { x: 0, y: 5, color: '#79A7ED' }, // 蓝色(腿) + { x: 1, y: 5, color: '#6CD2EA' }, // 浅蓝 + { x: 2, y: 5, color: '#79A7ED' }, // 蓝色(腿) + { x: 3, y: 5, color: '#6CD2EA' }, // 对称轴(腿) + { x: 0, y: 6, color: '#79A7ED' }, // 蓝色(腿) + { x: 2, y: 6, color: '#79A7ED' }, // 蓝色(腿) + { x: 3, y: 6, color: '#6CD2EA' }, // 对称轴(腿) + ], + }, + // 香蕉/玉米角色 - 对称涂色(仅存储左半部分) + { + id: 'banana-corn-7x7-001', + name: '香蕉/玉米角色', + category: 'character', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, // 只存储了左半部分 + cells: [ + // 顶部(绿色)- 左半部分 + { x: 0, y: 0, color: '#B2D94B' }, + { x: 1, y: 0, color: '#B2D94B' }, + { x: 2, y: 0, color: '#B2D94B' }, + { x: 3, y: 0, color: '#F9A857' }, // 对称轴 - 橙色 + { x: 0, y: 1, color: '#B2D94B' }, + { x: 1, y: 1, color: '#B2D94B' }, + { x: 2, y: 1, color: '#B2D94B' }, + { x: 3, y: 1, color: '#F9A857' }, // 对称轴 - 橙色 + + // 中间部分(绿色和橙色)- 左半部分 + { x: 0, y: 2, color: '#B2D94B' }, + { x: 1, y: 2, color: '#B2D94B' }, + { x: 2, y: 2, color: '#F9A857' }, // 橙色 + { x: 3, y: 2, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 0, y: 3, color: '#B2D94B' }, + { x: 1, y: 3, color: '#B2D94B' }, + { x: 2, y: 3, color: '#F9A857' }, // 橙色 + { x: 3, y: 3, color: '#666666' }, // 对称轴 - 黑色(眼睛) + { x: 0, y: 4, color: '#B2D94B' }, + { x: 1, y: 4, color: '#B2D94B' }, + { x: 2, y: 4, color: '#F9A857' }, // 橙色 + { x: 3, y: 4, color: '#FFE176' }, // 对称轴 - 黄色 + + // 底部(绿色和橙色)- 左半部分 + { x: 0, y: 5, color: '#B2D94B' }, + { x: 1, y: 5, color: '#B2D94B' }, + { x: 2, y: 5, color: '#B2D94B' }, + { x: 3, y: 5, color: '#F9A857' }, // 对称轴 - 橙色 + { x: 0, y: 6, color: '#B2D94B' }, + { x: 1, y: 6, color: '#B2D94B' }, + { x: 2, y: 6, color: '#B2D94B' }, + { x: 3, y: 6, color: '#F9A857' }, // 对称轴 - 橙色 + ], + }, + // 青蛙/恐龙头 - 对称涂色(仅存储左半部分) + { + id: 'frog-dinosaur-head-7x7-001', + name: '青蛙/恐龙头', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: false, // 只存储了左半部分 + cells: [ + // 顶部(绿色和黄色)- 左半部分 + { x: 0, y: 0, color: '#B2D94B' }, + { x: 1, y: 0, color: '#B2D94B' }, + { x: 2, y: 0, color: '#B2D94B' }, + { x: 3, y: 0, color: '#FFE176' }, // 对称轴 - 黄色 + { x: 0, y: 1, color: '#B2D94B' }, + { x: 1, y: 1, color: '#B2D94B' }, + { x: 2, y: 1, color: '#FFE176' }, // 黄色 + { x: 3, y: 1, color: '#B2D94B' }, // 对称轴 + + // 眼睛部分(绿色和黑色)- 左半部分 + { x: 0, y: 2, color: '#B2D94B' }, + { x: 1, y: 2, color: '#B2D94B' }, + { x: 2, y: 2, color: '#666666' }, // 黑色(左眼) + { x: 3, y: 2, color: '#666666' }, // 对称轴 - 黑色(右眼) + + // 嘴巴部分(绿色和红色)- 左半部分 + { x: 0, y: 3, color: '#B2D94B' }, + { x: 1, y: 3, color: '#B2D94B' }, + { x: 2, y: 3, color: '#ED6D50' }, // 红色(舌头) + { x: 3, y: 3, color: '#ED6D50' }, // 对称轴 - 红色(舌头) + + // 下巴部分(绿色)- 左半部分 + { x: 0, y: 4, color: '#B2D94B' }, + { x: 1, y: 4, color: '#B2D94B' }, + { x: 2, y: 4, color: '#B2D94B' }, + { x: 3, y: 4, color: '#B2D94B' }, // 对称轴 + + // 底部(绿色)- 左半部分 + { x: 0, y: 5, color: '#B2D94B' }, + { x: 1, y: 5, color: '#B2D94B' }, + { x: 2, y: 5, color: '#B2D94B' }, + { x: 3, y: 5, color: '#B2D94B' }, // 对称轴 + { x: 0, y: 6, color: '#B2D94B' }, + { x: 1, y: 6, color: '#B2D94B' }, + { x: 2, y: 6, color: '#B2D94B' }, + { x: 3, y: 6, color: '#B2D94B' }, // 对称轴 + ], + }, + // 树(完整版) + { + id: 'tree-7x7-002', + name: '树', + category: 'nature', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + // 树冠(绿色) + { x: 3, y: 0, color: '#B2D94B' }, + { x: 2, y: 1, color: '#B2D94B' }, + { x: 3, y: 1, color: '#B2D94B' }, + { x: 4, y: 1, color: '#B2D94B' }, + { x: 1, y: 2, color: '#B2D94B' }, + { x: 2, y: 2, color: '#B2D94B' }, + { x: 3, y: 2, color: '#B2D94B' }, + { x: 4, y: 2, color: '#B2D94B' }, + { x: 5, y: 2, color: '#B2D94B' }, + // 树干(棕色) + { x: 3, y: 3, color: '#BC8F71' }, + { x: 3, y: 4, color: '#BC8F71' }, + { x: 3, y: 5, color: '#BC8F71' }, + { x: 3, y: 6, color: '#BC8F71' }, + ], + }, + // 心形(完整版) + { + id: 'heart-7x7-002', + name: '心形', + category: 'object', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + // 心形顶部 + { x: 2, y: 0, color: '#F2A4C0' }, + { x: 3, y: 0, color: '#F2A4C0' }, + { x: 4, y: 0, color: '#F2A4C0' }, + { x: 1, y: 1, color: '#F2A4C0' }, + { x: 2, y: 1, color: '#F2A4C0' }, + { x: 3, y: 1, color: '#F2A4C0' }, + { x: 4, y: 1, color: '#F2A4C0' }, + { x: 5, y: 1, color: '#F2A4C0' }, + { x: 1, y: 2, color: '#F2A4C0' }, + { x: 2, y: 2, color: '#F2A4C0' }, + { x: 3, y: 2, color: '#F2A4C0' }, + { x: 4, y: 2, color: '#F2A4C0' }, + { x: 5, y: 2, color: '#F2A4C0' }, + // 心形底部 + { x: 2, y: 3, color: '#F2A4C0' }, + { x: 3, y: 3, color: '#F2A4C0' }, + { x: 4, y: 3, color: '#F2A4C0' }, + { x: 3, y: 4, color: '#F2A4C0' }, + { x: 3, y: 5, color: '#F2A4C0' }, + ], + }, + // 星星(完整版) + { + id: 'star-7x7-003', + name: '星星', + category: 'geometric', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + // 星星顶点 + { x: 3, y: 0, color: '#FFE176' }, + // 星星臂膀 + { x: 1, y: 1, color: '#FFE176' }, + { x: 3, y: 1, color: '#FFE176' }, + { x: 5, y: 1, color: '#FFE176' }, + { x: 2, y: 2, color: '#FFE176' }, + { x: 3, y: 2, color: '#FFE176' }, + { x: 4, y: 2, color: '#FFE176' }, + // 星星中心 + { x: 3, y: 3, color: '#FFE176' }, + // 星星底部 + { x: 0, y: 4, color: '#FFE176' }, + { x: 3, y: 4, color: '#FFE176' }, + { x: 6, y: 4, color: '#FFE176' }, + { x: 2, y: 5, color: '#FFE176' }, + { x: 4, y: 5, color: '#FFE176' }, + { x: 3, y: 6, color: '#FFE176' }, + ], + }, + // 鱼(完整版,非对称) + { + id: 'fish-7x7-004', + name: '鱼', + category: 'animal', + difficulty: 3, + supportSymmetry: false, + isComplete: true, + cells: [ + // 鱼身体(蓝色) + { x: 2, y: 1, color: '#79A7ED' }, + { x: 3, y: 1, color: '#79A7ED' }, + { x: 4, y: 1, color: '#79A7ED' }, + { x: 1, y: 2, color: '#79A7ED' }, + { x: 2, y: 2, color: '#79A7ED' }, + { x: 3, y: 2, color: '#79A7ED' }, + { x: 4, y: 2, color: '#666666' }, // 眼睛 + { x: 5, y: 2, color: '#79A7ED' }, + { x: 2, y: 3, color: '#79A7ED' }, + { x: 3, y: 3, color: '#79A7ED' }, + { x: 4, y: 3, color: '#79A7ED' }, + // 鱼尾 + { x: 5, y: 3, color: '#79A7ED' }, + { x: 6, y: 4, color: '#79A7ED' }, + ], + }, + // 小船 + { + id: 'boat-7x7-005', + name: '小船', + category: 'object', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + // 船身(棕色) + { x: 1, y: 3, color: '#BC8F71' }, + { x: 2, y: 3, color: '#BC8F71' }, + { x: 3, y: 3, color: '#BC8F71' }, + { x: 4, y: 3, color: '#BC8F71' }, + { x: 5, y: 3, color: '#BC8F71' }, + { x: 2, y: 4, color: '#BC8F71' }, + { x: 3, y: 4, color: '#BC8F71' }, + { x: 4, y: 4, color: '#BC8F71' }, + { x: 3, y: 5, color: '#BC8F71' }, + // 帆(浅色) + { x: 3, y: 0, color: '#F2F2F2' }, + { x: 3, y: 1, color: '#F2F2F2' }, + { x: 4, y: 1, color: '#F2F2F2' }, + { x: 3, y: 2, color: '#F2F2F2' }, + { x: 4, y: 2, color: '#F2F2F2' }, + { x: 5, y: 2, color: '#F2F2F2' }, + ], + }, + // 汽车 + { + id: 'car-7x7-006', + name: '汽车', + category: 'object', + difficulty: 3, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + // 车身(红色) + { x: 1, y: 2, color: '#ED6D50' }, + { x: 2, y: 2, color: '#ED6D50' }, + { x: 3, y: 2, color: '#ED6D50' }, + { x: 4, y: 2, color: '#ED6D50' }, + { x: 5, y: 2, color: '#ED6D50' }, + { x: 0, y: 3, color: '#ED6D50' }, + { x: 1, y: 3, color: '#ED6D50' }, + { x: 2, y: 3, color: '#ED6D50' }, + { x: 3, y: 3, color: '#ED6D50' }, + { x: 4, y: 3, color: '#ED6D50' }, + { x: 5, y: 3, color: '#ED6D50' }, + { x: 6, y: 3, color: '#ED6D50' }, + { x: 1, y: 4, color: '#ED6D50' }, + { x: 2, y: 4, color: '#ED6D50' }, + { x: 3, y: 4, color: '#ED6D50' }, + { x: 4, y: 4, color: '#ED6D50' }, + { x: 5, y: 4, color: '#ED6D50' }, + // 车轮(深灰色) + { x: 1, y: 5, color: '#666666' }, + { x: 5, y: 5, color: '#666666' }, + ], + }, + // 云 + { + id: 'cloud-7x7-007', + name: '云', + category: 'nature', + difficulty: 2, + supportSymmetry: false, + isComplete: true, + cells: [ + // 云朵形状(浅灰色) + { x: 2, y: 1, color: '#E0E0E0' }, + { x: 3, y: 1, color: '#E0E0E0' }, + { x: 4, y: 1, color: '#E0E0E0' }, + { x: 1, y: 2, color: '#E0E0E0' }, + { x: 2, y: 2, color: '#E0E0E0' }, + { x: 3, y: 2, color: '#E0E0E0' }, + { x: 4, y: 2, color: '#E0E0E0' }, + { x: 5, y: 2, color: '#E0E0E0' }, + { x: 2, y: 3, color: '#E0E0E0' }, + { x: 3, y: 3, color: '#E0E0E0' }, + { x: 4, y: 3, color: '#E0E0E0' }, + ], + }, + // 太阳(完整版) + { + id: 'sun-7x7-008', + name: '太阳', + category: 'nature', + difficulty: 2, + supportSymmetry: true, + symmetryType: 'both', + isComplete: true, + cells: [ + // 太阳中心(黄色) + { x: 3, y: 3, color: '#FFE176' }, + // 太阳光线 + { x: 3, y: 0, color: '#FFE176' }, + { x: 3, y: 6, color: '#FFE176' }, + { x: 0, y: 3, color: '#FFE176' }, + { x: 6, y: 3, color: '#FFE176' }, + { x: 1, y: 1, color: '#FFE176' }, + { x: 5, y: 5, color: '#FFE176' }, + { x: 1, y: 5, color: '#FFE176' }, + { x: 5, y: 1, color: '#FFE176' }, + ], + }, + // 月亮 + { + id: 'moon-7x7-009', + name: '月亮', + category: 'nature', + difficulty: 3, + supportSymmetry: false, + isComplete: true, + cells: [ + // 新月形状(黄色) + { x: 3, y: 0, color: '#FFE176' }, + { x: 2, y: 1, color: '#FFE176' }, + { x: 3, y: 1, color: '#FFE176' }, + { x: 4, y: 1, color: '#FFE176' }, + { x: 1, y: 2, color: '#FFE176' }, + { x: 2, y: 2, color: '#FFE176' }, + { x: 3, y: 2, color: '#FFE176' }, + { x: 4, y: 2, color: '#FFE176' }, + { x: 5, y: 2, color: '#FFE176' }, + { x: 2, y: 3, color: '#FFE176' }, + { x: 3, y: 3, color: '#FFE176' }, + { x: 4, y: 3, color: '#FFE176' }, + { x: 3, y: 4, color: '#FFE176' }, + ], + }, + // 蝴蝶(完整版) + { + id: 'butterfly-7x7-010', + name: '蝴蝶', + category: 'animal', + difficulty: 4, + supportSymmetry: true, + symmetryType: 'vertical', + isComplete: true, + cells: [ + // 蝴蝶身体(棕色) + { x: 3, y: 2, color: '#BC8F71' }, + { x: 3, y: 3, color: '#BC8F71' }, + { x: 3, y: 4, color: '#BC8F71' }, + // 蝴蝶翅膀(粉色,对称) + { x: 1, y: 0, color: '#F2A4C0' }, + { x: 2, y: 0, color: '#F2A4C0' }, + { x: 4, y: 0, color: '#F2A4C0' }, + { x: 5, y: 0, color: '#F2A4C0' }, + { x: 0, y: 1, color: '#F2A4C0' }, + { x: 1, y: 1, color: '#F2A4C0' }, + { x: 2, y: 1, color: '#F2A4C0' }, + { x: 3, y: 1, color: '#F2A4C0' }, + { x: 4, y: 1, color: '#F2A4C0' }, + { x: 5, y: 1, color: '#F2A4C0' }, + { x: 6, y: 1, color: '#F2A4C0' }, + { x: 1, y: 2, color: '#F2A4C0' }, + { x: 2, y: 2, color: '#F2A4C0' }, + { x: 4, y: 2, color: '#F2A4C0' }, + { x: 5, y: 2, color: '#F2A4C0' }, + ], + }, ]; /** diff --git a/miniprogram/focusPages/shared/types/gridTypes.ts b/miniprogram/focusPages/shared/types/gridTypes.ts index 2c880ff..d588678 100644 --- a/miniprogram/focusPages/shared/types/gridTypes.ts +++ b/miniprogram/focusPages/shared/types/gridTypes.ts @@ -30,12 +30,8 @@ export interface ShapeTemplate { id: string; /** 形状名称 */ name: string; - /** 推荐网格尺寸 */ - recommendedSize: { rows: number; cols: number }; /** 形状数据(如果是对称形状,这里存储的是左半部分或上半部分) */ cells: GridCell[]; - /** 颜色方案ID */ - colorSchemeId?: string; /** 分类 */ category: 'animal' | 'object' | 'geometric' | 'character' | 'nature'; /** 难度等级 1-5 */ @@ -47,13 +43,3 @@ export interface ShapeTemplate { /** 是否已经是对称完整的图案(false表示只存储了半边) */ isComplete?: boolean; } - -/** 颜色方案 */ -export const COLOR_SCHEMES: Record = { - basic: ['#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF'], - warm: ['#FF0000', '#FF7F00', '#FFFF00', '#FF69B4', '#FF4500'], - cool: ['#00FFFF', '#0000FF', '#8A2BE2', '#00FF00', '#87CEEB'], - halloween: ['#FF7F00', '#FFFF00', '#000000', '#90EE90', '#FF0000'], - nature: ['#00FF00', '#90EE90', '#006400', '#FFFF00', '#8B4513'], - rainbow: ['#FF0000', '#FF7F00', '#FFFF00', '#00FF00', '#0000FF', '#8A2BE2'], -}; diff --git a/miniprogram/focusPages/shared/utils/gridUtils.ts b/miniprogram/focusPages/shared/utils/gridUtils.ts index dbdd30b..3d90d19 100644 --- a/miniprogram/focusPages/shared/utils/gridUtils.ts +++ b/miniprogram/focusPages/shared/utils/gridUtils.ts @@ -83,9 +83,13 @@ export function generateSymmetricalPattern( /** * 从形状模板生成完整的格子数据 * @param template 形状模板 + * @param config 网格配置(用于对称生成) * @returns 完整的格子数据 */ -export function generateCompletePattern(template: ShapeTemplate): GridCell[] { +export function generateCompletePattern( + template: ShapeTemplate, + config: GridConfig, +): GridCell[] { if (template.isComplete) { // 如果已经是完整图案,直接返回 return [...template.cells]; @@ -95,10 +99,7 @@ export function generateCompletePattern(template: ShapeTemplate): GridCell[] { // 使用对称生成完整图案 return generateSymmetricalPattern( template.cells, - { - rows: template.recommendedSize.rows, - cols: template.recommendedSize.cols, - }, + config, template.symmetryType, ); } diff --git a/miniprogram/mathPages/missingNumber/missingNumber.ts b/miniprogram/mathPages/missingNumber/missingNumber.ts index c4bf62f..f92c411 100644 --- a/miniprogram/mathPages/missingNumber/missingNumber.ts +++ b/miniprogram/mathPages/missingNumber/missingNumber.ts @@ -1,4 +1,4 @@ -import { getRandomNumberColor } from '../../constants/colors'; +import { getRandomNumberColor } from '../../constants/mathFunctions'; import MissingNumberDraw from '../shared/service/missingNumberDraw'; import { createMathPage, diff --git a/miniprogram/mathPages/shared/service/countMatchContentDraw.ts b/miniprogram/mathPages/shared/service/countMatchContentDraw.ts index 10546c5..a51ca72 100644 --- a/miniprogram/mathPages/shared/service/countMatchContentDraw.ts +++ b/miniprogram/mathPages/shared/service/countMatchContentDraw.ts @@ -1,5 +1,5 @@ import { getImage } from '../../../utils/index'; -import { getRandomNumberColor } from '../../../constants/colors'; +import { getRandomNumberColor } from '../../../constants/mathFunctions'; interface DrawCountMatchContentParams { canvas: WechatMiniprogram.Canvas; diff --git a/miniprogram/mathPages/shared/service/countingSelectContentDraw.ts b/miniprogram/mathPages/shared/service/countingSelectContentDraw.ts index 448050a..0ca74c3 100644 --- a/miniprogram/mathPages/shared/service/countingSelectContentDraw.ts +++ b/miniprogram/mathPages/shared/service/countingSelectContentDraw.ts @@ -1,5 +1,5 @@ import { getImage } from '../../../utils/index'; -import { getRandomNumberColor } from '../../../constants/colors'; +import { getRandomNumberColor } from '../../../constants/mathFunctions'; interface DrawCountingSelectContentParams { canvas: WechatMiniprogram.Canvas; diff --git a/miniprogram/mathPages/shared/service/numberColorContentDraw.ts b/miniprogram/mathPages/shared/service/numberColorContentDraw.ts index 4718c46..13cb4ec 100644 --- a/miniprogram/mathPages/shared/service/numberColorContentDraw.ts +++ b/miniprogram/mathPages/shared/service/numberColorContentDraw.ts @@ -1,4 +1,4 @@ -import { getNumberColors } from '../../../constants/colors'; +import { getNumberColors } from '../../../constants/mathFunctions'; interface DrawNumberColorContentParams { canvas: WechatMiniprogram.Canvas; diff --git a/miniprogram/mathPages/shared/service/numberDecomposeContentDraw.ts b/miniprogram/mathPages/shared/service/numberDecomposeContentDraw.ts index 157fac1..0a3f59d 100644 --- a/miniprogram/mathPages/shared/service/numberDecomposeContentDraw.ts +++ b/miniprogram/mathPages/shared/service/numberDecomposeContentDraw.ts @@ -1,5 +1,5 @@ import { getImage } from '../../../utils/index'; -import { getRandomNumberColor } from '../../../constants/colors'; +import { getRandomNumberColor } from '../../../constants/mathFunctions'; interface DrawNumberDecomposeContentParams { canvas: WechatMiniprogram.Canvas; diff --git a/miniprogram/mathPages/shared/service/numberPreviewDraw.ts b/miniprogram/mathPages/shared/service/numberPreviewDraw.ts index cd45348..e5c46ac 100644 --- a/miniprogram/mathPages/shared/service/numberPreviewDraw.ts +++ b/miniprogram/mathPages/shared/service/numberPreviewDraw.ts @@ -1,4 +1,5 @@ import { getImage } from '../../../utils/index'; +import { NUMBER_COLORS } from '../../../constants/mathFunctions'; /** * 数字到英文单词的映射 @@ -16,19 +17,6 @@ const NUMBER_WORDS: Record = { 10: 'ten', }; -const NUMBER_COLORS: Record = { - 1: '#9FC558', - 2: '#CDB984', - 3: '#B393B8', - 4: '#ED7E97', - 5: '#53B5B9', - 6: '#B3B3B3', - 7: '#EE8B7A', - 8: '#F6C644', - 9: '#99C1F4', - 10: '#F5D25C', -}; - /** * 绘制预览区域的参数接口 */ diff --git a/miniprogram/pages/focusIndex/focusIndex.json b/miniprogram/pages/focusIndex/focusIndex.json index 8376a1d..b9a043d 100644 --- a/miniprogram/pages/focusIndex/focusIndex.json +++ b/miniprogram/pages/focusIndex/focusIndex.json @@ -1,5 +1,5 @@ { - "navigationBarTitleText": "涂鸦丫-专注力", + "navigationBarTitleText": "专注启蒙", "navigationBarBackgroundColor": "#FFD719", "homeButton": true, "backgroundColor": "#F6F6F6", diff --git a/miniprogram/pages/focusIndex/focusIndex.ts b/miniprogram/pages/focusIndex/focusIndex.ts index d53262d..0cd2a41 100644 --- a/miniprogram/pages/focusIndex/focusIndex.ts +++ b/miniprogram/pages/focusIndex/focusIndex.ts @@ -24,8 +24,13 @@ Page({ // 如果有page字段,跳转到对应页面 if (functionItem.page) { + let url = `/focusPages/${functionItem.page}/${functionItem.page}?id=${functionId}`; + // 如果有 mode 参数,添加到 URL 中 + if (functionItem.mode) { + url += `&mode=${functionItem.mode}`; + } wx.navigateTo({ - url: `/focusPages/${functionItem.page}/${functionItem.page}?id=${functionId}`, + url, }); } else { wx.showToast({ diff --git a/miniprogram/pages/focusIndex/focusIndex.wxml b/miniprogram/pages/focusIndex/focusIndex.wxml index ee4c702..3e20955 100644 --- a/miniprogram/pages/focusIndex/focusIndex.wxml +++ b/miniprogram/pages/focusIndex/focusIndex.wxml @@ -1,9 +1,9 @@ - 专注力训练 + 专注启蒙 - 选择功能,生成可打印的专注力训练涂鸦卡 + 选择功能,生成可打印的专注力、观察力启蒙涂鸦卡 diff --git a/miniprogram/pages/mathIndex/mathIndex.json b/miniprogram/pages/mathIndex/mathIndex.json index 96d223c..01d1c09 100644 --- a/miniprogram/pages/mathIndex/mathIndex.json +++ b/miniprogram/pages/mathIndex/mathIndex.json @@ -1,5 +1,5 @@ { - "navigationBarTitleText": "涂鸦丫-数学", + "navigationBarTitleText": "数感启蒙", "navigationBarBackgroundColor": "#FFD719", "homeButton": true, "backgroundColor": "#F6F6F6", diff --git a/miniprogram/service/README.md b/miniprogram/service/README.md index 8290cc5..e647be2 100644 --- a/miniprogram/service/README.md +++ b/miniprogram/service/README.md @@ -86,4 +86,4 @@ this.shapeDrawService = new ShapeDrawService(canvas, ctx, options); ## 示例 -参考 `miniprogram/pages/shape/index.ts` 中的实现,展示了如何在页面中使用 ShapeDrawService。 +参考 `miniprogram/pages/shape/shape.ts` 中的实现,展示了如何在页面中使用 ShapeDrawService。 diff --git a/miniprogram/utils/tracker.ts b/miniprogram/utils/tracker.ts index bcdd7b4..c5624b5 100644 --- a/miniprogram/utils/tracker.ts +++ b/miniprogram/utils/tracker.ts @@ -123,8 +123,7 @@ class Tracker { try { const params = this.getCommonEventParams('share_click', pageName); - this.printLog('分享事件', params); - wx.reportEvent('share_click', params); + this.sendEvent('share_click', params); } catch (error) { console.error('上报分享事件失败:', error); } @@ -141,12 +140,35 @@ class Tracker { ...(mode && { mode }), }); - this.printLog('下载事件', params); - wx.reportEvent('download', params); + this.sendEvent('download', params); } catch (error) { console.error('上报下载事件失败:', error); } } + + /** + * 发送事件(仅在线上环境上报) + * @param eventName 事件名称 + * @param params 事件参数 + */ + sendEvent(eventName: string, params: Record): void { + try { + // 获取当前环境,只在 release 环境下上报 + const accountInfo = wx.getAccountInfoSync(); + const env = accountInfo.miniProgram.envVersion || 'release'; + + if (env === 'release') { + this.printLog(`[${env}] 事件上报`, { eventName, params }); + wx.reportEvent(eventName, params); + } else { + // 非线上环境,只打印日志,不上报 + this.printLog(`[${env}] 事件上报已跳过`, { eventName, params }); + } + } catch (error) { + console.error('获取环境信息失败:', error); + // 如果获取环境信息失败,为了安全起见不上报 + } + } } // 导出 Tracker 单例实例 diff --git a/project.private.config.json b/project.private.config.json index 112bdf2..b863764 100644 --- a/project.private.config.json +++ b/project.private.config.json @@ -23,6 +23,13 @@ "condition": { "miniprogram": { "list": [ + { + "name": "pages/focusIndex/focusIndex", + "pathName": "pages/focusIndex/focusIndex", + "query": "", + "launchMode": "default", + "scene": null + }, { "name": "focusPages/gridDrawing/gridDrawing", "pathName": "focusPages/gridDrawing/gridDrawing", @@ -31,8 +38,8 @@ "scene": null }, { - "name": "pages/shape/index", - "pathName": "pages/shape/index", + "name": "focusPages/shape/shape", + "pathName": "focusPages/shape/shape", "query": "", "launchMode": "default", "scene": null @@ -113,13 +120,6 @@ "query": "", "launchMode": "default", "scene": null - }, - { - "name": "pages/copyBook/copyBook", - "pathName": "pages/copyBook/copyBook", - "query": "", - "launchMode": "default", - "scene": null } ] }