Files
doodle-mini/miniprogram/mathPages/compare/compare.ts
T
2025-12-11 13:02:44 +08:00

125 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import CompareDraw from '../shared/service/compareDraw';
import {
createMathPage,
CanvasDataState,
} from '../shared/common/mathPageMixin';
// 获取公共方
createMathPage({
canvas: null as Canvas | null,
ctx: null as RenderingContext | null,
boxHeight: 0,
boxWidth: 0,
drawService: null as CompareDraw | null,
compareData: null as {
problems: Array<{
leftCount: number;
rightCount: number;
leftImageIndex: number;
rightImageIndex: number;
imageType: 'fruits' | 'twelve-animals';
}>;
} | null,
data: {
pageTitle: '数一数,比大小',
subTitle: '数一数,比较数量,在⭕️中填入>、<、=',
functionId: '',
hasContent: false,
showShareDialog: false,
} as CanvasDataState,
onLoad(options: { id?: string }) {
const functionId = options.id || 'compare';
this.initPageInfo(functionId, '数一数,比大小');
},
onReady() {
this.initCanvas({
createDrawService: (
canvas: Canvas,
ctx: RenderingContext,
options?: Record<string, any>,
) => {
return new CompareDraw(canvas, ctx, options);
},
drawServiceOptions: {
subTitle: this.data.subTitle,
},
onCanvasReady: () => {
// Canvas 初始化完成后,生成初始数据
this.onRandom();
},
});
},
/**
* 绘制Canvas内容
*/
async drawCanvas() {
if (!this.ctx || !this.drawService || !this.compareData) {
return;
}
try {
await this.drawService.draw(this.compareData);
this.setData({ hasContent: true });
} catch (error) {
console.error('绘制失败:', error);
this.setData({ hasContent: false });
}
},
/**
* 随机生成
*/
onRandom() {
this.generateCompareData();
this.drawCanvas();
},
/**
* 生成比较数据
*/
generateCompareData() {
const problems: Array<{
leftCount: number;
rightCount: number;
leftImageIndex: number;
rightImageIndex: number;
imageType: 'fruits' | 'twelve-animals';
}> = [];
// 生成6道题目
for (let i = 0; i < 12; i++) {
// 随机选择图片类型
const imageType: 'fruits' | 'twelve-animals' =
Math.random() < 0.5 ? 'fruits' : 'twelve-animals';
// 根据图片类型确定最大索引
const maxImageIndex = imageType === 'fruits' ? 22 : 12;
// 生成左右两边的数量(1-10
const leftCount = Math.floor(Math.random() * 10) + 1;
const rightCount = Math.floor(Math.random() * 10) + 1;
// 随机选择图片索引
const leftImageIndex =
Math.floor(Math.random() * maxImageIndex) + 1;
const rightImageIndex =
Math.floor(Math.random() * maxImageIndex) + 1;
problems.push({
leftCount,
rightCount,
leftImageIndex,
rightImageIndex,
imageType,
});
}
this.compareData = { problems };
},
});