/** * AI智能游戏生成器 * 功能:自动出题、动态难度调整、个性化游戏内容 */ class AIGameGenerator { constructor() { this.isInitialized = false; this.currentDifficulty = 1; // 1-5级难度 this.studentProfile = null; this.questionBank = new Map(); this.difficultyHistory = []; this.performanceHistory = []; // 题目类型配置 this.questionTypes = { math: { addition: { min: 1, max: 20, operators: ['+'] }, subtraction: { min: 1, max: 20, operators: ['-'] }, multiplication: { min: 1, max: 10, operators: ['×'] }, comparison: { min: 1, max: 20, operators: ['>', '<', '='] }, clock: { min: 1, max: 12, operators: ['hour', 'minute'] } }, language: { pinyin: { min: 1, max: 10, operators: ['声调', '拼音'] }, word: { min: 1, max: 20, operators: ['组词', '造句'] }, poem: { min: 1, max: 5, operators: ['背诵', '理解'] } }, life: { emotion: { min: 1, max: 8, operators: ['识别', '表达'] }, safety: { min: 1, max: 10, operators: ['判断', '选择'] }, daily: { min: 1, max: 15, operators: ['分类', '整理'] } } }; // 难度调整参数 this.difficultyParams = { 1: { successRate: 0.9, timeLimit: 30, hints: 3 }, 2: { successRate: 0.8, timeLimit: 25, hints: 2 }, 3: { successRate: 0.7, timeLimit: 20, hints: 1 }, 4: { successRate: 0.6, timeLimit: 15, hints: 0 }, 5: { successRate: 0.5, timeLimit: 10, hints: 0 } }; } /** * 初始化AI游戏生成器 */ async init() { try { console.log('🤖 AI游戏生成器初始化中...'); // 加载题目库 await this.loadQuestionBank(); // 加载学生档案 await this.loadStudentProfile(); this.isInitialized = true; console.log('✅ AI游戏生成器初始化完成'); return true; } catch (error) { console.error('❌ AI游戏生成器初始化失败:', error); return false; } } /** * 加载学生档案 */ async loadStudentProfile() { try { // 从后端获取学生数据 if (window.apiService) { const userData = window.userManager?.getCurrentUser(); if (userData) { const stats = await window.apiService.getStudentStats(userData.id, 30); this.studentProfile = { id: userData.id, name: userData.name, grade: userData.grade || 2, strengths: stats.strengths || [], weaknesses: stats.weaknesses || [], learningStyle: stats.learningStyle || 'visual', currentLevel: stats.currentLevel || 1, totalQuestions: stats.totalQuestions || 0, correctRate: stats.correctRate || 0.7 }; } } // 如果没有后端数据,使用默认配置 if (!this.studentProfile) { this.studentProfile = { id: 'default', name: '学生', grade: 2, strengths: ['数学'], weaknesses: ['语文'], learningStyle: 'visual', currentLevel: 1, totalQuestions: 0, correctRate: 0.7 }; } console.log('📊 学生档案加载完成:', this.studentProfile); } catch (error) { console.error('❌ 加载学生档案失败:', error); } } /** * 加载题目库 */ async loadQuestionBank() { try { const response = await fetch('data/questionBank.json'); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const questionBankData = await response.json(); // 将JSON数据转换为Map格式 for (const [subject, types] of Object.entries(questionBankData)) { this.questionBank.set(subject, types); } console.log('📚 题目库加载完成:', this.questionBank); } catch (error) { console.error('❌ 加载题目库失败:', error); // 如果加载失败,使用默认题目库 await this.initializeDefaultQuestionBank(); } } /** * 初始化默认题目库(备用) */ async initializeDefaultQuestionBank() { // 数学题目库 this.questionBank.set('math', { addition: [ { question: "2 + 3 = ?", options: ["4", "5", "6", "7"], correct: 1, difficulty: 1 }, { question: "7 + 8 = ?", options: ["14", "15", "16", "17"], correct: 1, difficulty: 2 } ], subtraction: [ { question: "8 - 3 = ?", options: ["4", "5", "6", "7"], correct: 1, difficulty: 1 }, { question: "15 - 7 = ?", options: ["7", "8", "9", "10"], correct: 1, difficulty: 2 } ] }); // 语文题目库 this.questionBank.set('language', { pinyin: [ { question: "'猫'的拼音是?", options: ["māo", "máo", "mǎo", "mào"], correct: 0, difficulty: 1 } ], word: [ { question: "用'美丽'组词", options: ["美丽的花", "美丽的人", "美丽的风景", "以上都对"], correct: 3, difficulty: 2 } ] }); // 生活题目库 this.questionBank.set('life', { emotion: [ { question: "看到好吃的食物,应该是什么表情?", options: ["😊", "😢", "😠", "😴"], correct: 0, difficulty: 1 } ], safety: [ { question: "过马路时应该?", options: ["看红绿灯", "直接跑过去", "闭着眼睛", "听音乐"], correct: 0, difficulty: 1 } ] }); console.log('📚 默认题目库初始化完成'); } /** * 生成个性化游戏 */ generatePersonalizedGame(subject = 'math', gameType = 'quiz', questionCount = 5) { if (!this.isInitialized) { console.error('❌ AI游戏生成器未初始化'); return null; } console.log(`🎮 生成个性化游戏: ${subject} - ${gameType}`); const gameConfig = { id: this.generateGameId(), subject: subject, type: gameType, difficulty: this.currentDifficulty, questions: [], timeLimit: this.difficultyParams[this.currentDifficulty].timeLimit, hints: this.difficultyParams[this.currentDifficulty].hints, studentProfile: this.studentProfile }; // 从题目库中获取题目 const questions = this.getQuestionsFromBank(subject, questionCount); gameConfig.questions = questions; // 个性化调整 this.personalizeGame(gameConfig); console.log('✅ 个性化游戏生成完成:', gameConfig); return gameConfig; } /** * 生成完整的游戏页面 */ generateGamePage(subject = 'math', gameType = 'quiz', questionCount = 5) { if (!this.isInitialized) { console.error('❌ AI游戏生成器未初始化'); return null; } console.log(`🎮 生成完整游戏页面: ${subject} - ${gameType}`); // 生成游戏配置 const gameConfig = this.generatePersonalizedGame(subject, gameType, questionCount); if (!gameConfig || !gameConfig.questions.length) { console.error('❌ 无法生成游戏配置'); return null; } // 在当前页面内嵌入游戏 this.embedGameInCurrentPage(gameConfig); console.log('✅ 游戏页面生成完成并已嵌入当前页面'); return gameConfig; } /** * 在当前页面内嵌入游戏 */ embedGameInCurrentPage(gameConfig) { const subject = gameConfig.subject; const gameType = gameConfig.type; const questions = gameConfig.questions; const difficulty = gameConfig.difficulty; // 根据学科确定游戏标题和样式 let gameTitle, gameIntro, gameStyle; switch (subject) { case 'math': if (gameType === 'quiz') { gameTitle = 'AI数学游戏'; gameIntro = '欢迎来到AI数学游戏!我会帮你学习数学知识,准备好了吗?'; } else { gameTitle = 'AI数学比大小游戏'; gameIntro = '欢迎来到AI数学比大小游戏!我会帮你学习数字比较,准备好了吗?'; } gameStyle = this.getMathGameStyle(); break; case 'language': gameTitle = 'AI语文拼音游戏'; gameIntro = '欢迎来到AI语文拼音游戏!我会帮你学习拼音和声调,准备好了吗?'; gameStyle = this.getLanguageGameStyle(); break; case 'life': gameTitle = 'AI生活安全游戏'; gameIntro = '欢迎来到AI生活安全游戏!我会帮你学习生活中的安全知识,准备好了吗?'; gameStyle = this.getLifeGameStyle(); break; default: gameTitle = 'AI智能游戏'; gameIntro = '欢迎来到AI智能游戏!我会帮你学习知识,准备好了吗?'; gameStyle = this.getDefaultGameStyle(); } // 创建游戏容器 const gameContainer = document.createElement('div'); gameContainer.id = 'ai-game-container'; gameContainer.innerHTML = `
得分: 0
进度: 0/${questions.length}

${gameTitle}

准备开始...
🦉
准备就绪

标题

内容

`; // 添加到页面 document.body.appendChild(gameContainer); // 初始化游戏逻辑 this.initializeGameLogic(gameConfig, gameTitle, gameIntro); } /** * 初始化游戏逻辑 */ initializeGameLogic(gameConfig, gameTitle, gameIntro) { const gameId = gameConfig.id; const questions = gameConfig.questions; // DOM元素 const questionText = document.getElementById("questionText"); const optionsContainer = document.getElementById("optionsContainer"); const message = document.getElementById("message"); const messageTitle = document.getElementById("messageTitle"); const messageText = document.getElementById("messageText"); const messageBtn = document.getElementById("messageBtn"); const scoreElement = document.getElementById("score"); const progressElement = document.getElementById("progress"); const totalElement = document.getElementById("total"); const progressFill = document.getElementById("progressFill"); // 游戏状态 let currentQuestionIndex = 0; let score = 0; let correctCount = 0; let gameStarted = false; let virtualTeacherMuted = false; // 体感交互元素 const bodyInteractionBtns = document.getElementById("bodyInteractionBtns"); const bodyQuestionText = document.getElementById("bodyQuestionText"); // 虚拟猫头鹰控制函数 function updateVirtualTeacherStatus(status, isSpeaking = false) { if (virtualTeacherStatus) { virtualTeacherStatus.textContent = status; } if (speakBtn) { if (isSpeaking) { speakBtn.classList.add('speaking'); } else { speakBtn.classList.remove('speaking'); } } } function toggleVirtualTeacher() { virtualTeacherMuted = !virtualTeacherMuted; if (virtualTeacherMuted) { updateVirtualTeacherStatus('已静音'); if (window.gameVirtualTeacher) { window.gameVirtualTeacher.stopAllSpeech(); } } else { updateVirtualTeacherStatus('准备就绪'); } } function muteVirtualTeacher() { virtualTeacherMuted = true; updateVirtualTeacherStatus('已静音'); if (window.gameVirtualTeacher) { window.gameVirtualTeacher.stopAllSpeech(); } } // 体感交互控制函数 function showBodyInteraction() { if (bodyInteractionBtns) { bodyInteractionBtns.style.display = 'flex'; } } function hideBodyInteraction() { if (bodyInteractionBtns) { bodyInteractionBtns.style.display = 'none'; } } function updateBodyQuestionText(text) { if (bodyQuestionText) { bodyQuestionText.textContent = text; } } // 体感交互选择答案 function selectBodyAnswer(hand) { if (currentQuestionIndex >= questions.length) return; const question = questions[currentQuestionIndex]; let selectedIndex = -1; // 根据左右手选择对应的选项 if (question.options.length >= 2) { selectedIndex = hand === 'left' ? 0 : 1; } else if (question.options.length === 1) { selectedIndex = 0; } if (selectedIndex >= 0) { selectAnswer(selectedIndex, question); } } // 显示当前题目 function showCurrentQuestion() { if (currentQuestionIndex >= questions.length) { endGame(); return; } const question = questions[currentQuestionIndex]; questionText.textContent = question.question; // 清空选项容器 optionsContainer.innerHTML = ""; // 创建选项按钮 question.options.forEach((option, index) => { const button = document.createElement("button"); button.className = "option-btn"; button.textContent = option; button.onclick = () => selectAnswer(index, question); optionsContainer.appendChild(button); }); // 更新进度 progressElement.textContent = currentQuestionIndex + 1; progressFill.style.width = `${((currentQuestionIndex + 1) / questions.length) * 100}%`; // 虚拟老师读题目 if (window.gameVirtualTeacher && !virtualTeacherMuted) { updateVirtualTeacherStatus('正在读题...', true); setTimeout(() => { window.gameVirtualTeacher.readQuestion(question.question); setTimeout(() => { updateVirtualTeacherStatus('准备就绪'); }, 2000); }, 500); } // 显示体感交互按钮 showBodyInteraction(); // 更新体感交互提示文本 if (question.options.length >= 2) { updateBodyQuestionText(`请举起${question.options[0]}或${question.options[1]}选择答案`); } else if (question.options.length === 1) { updateBodyQuestionText(`请举起任意一只手选择:${question.options[0]}`); } else { updateBodyQuestionText('请举起左手或右手选择答案'); } } // 选择答案 function selectAnswer(selectedIndex, question) { if (message.classList.contains("show")) return; // 隐藏体感交互按钮 hideBodyInteraction(); const isCorrect = selectedIndex === question.correct; const selectedButton = optionsContainer.children[selectedIndex]; const correctButton = optionsContainer.children[question.correct]; // 显示答案效果 selectedButton.classList.add(isCorrect ? "correct" : "wrong"); if (!isCorrect) { correctButton.classList.add("correct"); } // 虚拟老师反馈 if (window.gameVirtualTeacher && !virtualTeacherMuted) { window.gameVirtualTeacher.stopAllSpeech(); updateVirtualTeacherStatus(isCorrect ? '答对了!' : '再想想...', true); setTimeout(() => { if (isCorrect) { window.gameVirtualTeacher.recordCorrect(); } else { window.gameVirtualTeacher.recordIncorrect(); } setTimeout(() => { updateVirtualTeacherStatus('准备就绪'); }, 1500); }, 300); } // 更新分数 if (isCorrect) { correctCount++; score += 10; scoreElement.textContent = score; } // 记录游戏数据 if (gameStarted && window.gameTracker) { if (isCorrect) { window.gameTracker.recordCorrect(10, { question: question.question, selected: question.options[selectedIndex], correct: question.options[question.correct], questionNumber: currentQuestionIndex + 1, }); } else { window.gameTracker.recordIncorrect(0, { question: question.question, selected: question.options[selectedIndex], correct: question.options[question.correct], questionNumber: currentQuestionIndex + 1, }); } } // 显示结果消息 const messageText = isCorrect ? `太棒了!${question.question} 的答案是 ${question.options[question.correct]}` : `再想想!正确答案是 ${question.options[question.correct]}`; showMessage(isCorrect, messageText); if (isCorrect) { createConfetti(); } } // 显示消息 function showMessage(isCorrect, text) { message.className = "message " + (isCorrect ? "correct" : "wrong"); messageTitle.textContent = isCorrect ? "太棒了!" : "再试一次"; messageText.textContent = text; message.classList.add("show"); // 自动消失定时器 const autoHideTimer = setTimeout(() => { nextQuestion(); }, 3000); // 3秒后自动消失 // 点击消息区域也可以消失 message.onclick = () => { clearTimeout(autoHideTimer); nextQuestion(); }; } // 创建彩色纸屑效果 function createConfetti() { const colors = ["#FF9AA2", "#FFB7B2", "#FFDAC1", "#E2F0CB", "#B5EAD7", "#C7CEEA"]; for (let i = 0; i < 50; i++) { const confetti = document.createElement("div"); confetti.className = "confetti"; confetti.style.left = `${Math.random() * 100}%`; confetti.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)]; confetti.style.width = `${Math.random() * 10 + 5}px`; confetti.style.height = `${Math.random() * 10 + 5}px`; confetti.style.animation = `confetti-fall ${Math.random() * 2 + 2}s linear forwards`; confetti.style.animationDelay = `${Math.random() * 0.5}s`; document.body.appendChild(confetti); setTimeout(() => { confetti.remove(); }, 3000); } } // 下一题 function nextQuestion() { message.classList.remove("show"); currentQuestionIndex++; showCurrentQuestion(); } // 结束游戏 function endGame() { const successRate = (correctCount / questions.length) * 100; message.className = "message correct"; messageTitle.textContent = "游戏完成!"; messageText.textContent = `恭喜你完成了游戏!\n得分: ${score}\n正确率: ${successRate.toFixed(1)}%`; message.classList.add("show"); // 虚拟老师游戏结束 if (window.gameVirtualTeacher) { updateVirtualTeacherStatus('游戏结束!', true); window.gameVirtualTeacher.gameEnd(); setTimeout(() => { updateVirtualTeacherStatus('等待重新开始'); }, 2000); } // 记录游戏结果 if (gameStarted && window.gameTracker) { if (successRate >= 80) { window.gameTracker.recordWin(score, { totalQuestions: questions.length, correctCount: correctCount, successRate: successRate, }); } else { window.gameTracker.recordLose(score, { totalQuestions: questions.length, correctCount: correctCount, successRate: successRate, }); } } messageBtn.textContent = "重新开始"; messageBtn.onclick = restartGame; } // 重新开始游戏 function restartGame() { currentQuestionIndex = 0; score = 0; correctCount = 0; scoreElement.textContent = "0"; progressElement.textContent = "0"; progressFill.style.width = "0%"; message.classList.remove("show"); messageBtn.textContent = "继续"; messageBtn.onclick = nextQuestion; showCurrentQuestion(); } // 事件监听 messageBtn.addEventListener("click", nextQuestion); // 初始化游戏 setTimeout(() => { // 虚拟老师游戏开始 if (window.gameVirtualTeacher) { updateVirtualTeacherStatus('游戏开始!', true); window.gameVirtualTeacher.gameStart(gameTitle); setTimeout(() => { if (!virtualTeacherMuted) { window.gameVirtualTeacher.speak(gameIntro); setTimeout(() => { updateVirtualTeacherStatus('准备就绪'); }, 3000); } }, 1000); } // 开始游戏跟踪 if (window.gameTracker) { window.gameTracker.startGame(gameId, { gameType: "ai_generated", difficulty: "adaptive", subject: gameConfig.subject, }); } gameStarted = true; showCurrentQuestion(); }, 500); } /** * 关闭AI游戏 */ closeAIGame() { const gameContainer = document.getElementById('ai-game-container'); if (gameContainer) { gameContainer.remove(); } // 停止虚拟老师 if (window.gameVirtualTeacher) { window.gameVirtualTeacher.stopAllSpeech(); } console.log('🎮 AI游戏已关闭'); } /** * 创建游戏页面HTML */ createGamePageHTML(gameConfig) { const gameId = gameConfig.id; const subject = gameConfig.subject; const gameType = gameConfig.type; const questions = gameConfig.questions; const difficulty = gameConfig.difficulty; // 根据学科确定游戏标题和样式 let gameTitle, gameIntro, gameStyle; switch (subject) { case 'math': if (gameType === 'quiz') { gameTitle = 'AI数学游戏'; gameIntro = '欢迎来到AI数学游戏!我会帮你学习数学知识,准备好了吗?'; } else { gameTitle = 'AI数学比大小游戏'; gameIntro = '欢迎来到AI数学比大小游戏!我会帮你学习数字比较,准备好了吗?'; } gameStyle = this.getMathGameStyle(); break; case 'language': gameTitle = 'AI语文拼音游戏'; gameIntro = '欢迎来到AI语文拼音游戏!我会帮你学习拼音和声调,准备好了吗?'; gameStyle = this.getLanguageGameStyle(); break; case 'life': gameTitle = 'AI生活安全游戏'; gameIntro = '欢迎来到AI生活安全游戏!我会帮你学习生活中的安全知识,准备好了吗?'; gameStyle = this.getLifeGameStyle(); break; default: gameTitle = 'AI智能游戏'; gameIntro = '欢迎来到AI智能游戏!我会帮你学习知识,准备好了吗?'; gameStyle = this.getDefaultGameStyle(); } // 生成游戏HTML const gameHTML = ` ${gameTitle}
得分: 0
进度: 0/${questions.length}

${gameTitle}

准备开始...

标题

内容

`; return gameHTML; } /** * 获取数学游戏样式 */ getMathGameStyle() { return ` :root { --primary: #ff9aa2; --secondary: #ffb7b2; --accent: #ffdac1; --correct: #b5ead7; --wrong: #ff9aa2; --button: #70a1ff; --text: #5e5346; } * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: "Comic Sans MS", "Marker Felt", "微软雅黑", sans-serif; background-color: #f9f7f0; display: flex; justify-content: center; align-items: center; min-height: 100vh; background-image: radial-gradient(circle, #f5f5f5 10%, transparent 10%); background-size: 30px 30px; overflow: hidden; } .game-container { width: 80%; background-color: white; border-radius: 20px; padding: 30px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); text-align: center; position: relative; overflow: hidden; border: 5px solid #ffdac1; } h1 { color: #ff6b6b; margin-bottom: 30px; font-size: 3rem; text-shadow: 3px 3px 0 #ffdac1; letter-spacing: 2px; } .question-area { margin: 30px 0; padding: 20px; background-color: #f0f8ff; border-radius: 15px; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); } .question { font-size: 4rem; margin: 20px 0; color: #5e5346; font-weight: bold; } .options { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; margin: 30px 0; } .option-btn { padding: 20px; border-radius: 15px; background-color: var(--button); color: white; border: none; font-size: 2.5rem; font-weight: bold; cursor: pointer; box-shadow: 0 5px 0 #4a6baf; transition: all 0.2s ease; min-height: 80px; display: flex; justify-content: center; align-items: center; } .option-btn:hover { background-color: #5d8eff; transform: scale(1.05); } .option-btn:active { transform: translateY(5px); box-shadow: 0 2px 0 #4a6baf; } .option-btn.correct { background-color: var(--correct); box-shadow: 0 5px 0 #8dd3c7; } .option-btn.wrong { background-color: var(--wrong); box-shadow: 0 5px 0 #e67e7e; } .score-area { position: absolute; top: 20px; right: 20px; background-color: #fff; padding: 15px; border-radius: 10px; box-shadow: 0 3px 10px rgba(0, 0, 0, 0.1); font-size: 1.2rem; font-weight: bold; color: var(--text); } .progress-bar { width: 100%; height: 20px; background-color: #e0e0e0; border-radius: 10px; margin: 20px 0; overflow: hidden; } .progress-fill { height: 100%; background-color: var(--button); transition: width 0.3s ease; border-radius: 10px; } .message { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0); background-color: white; padding: 30px; border-radius: 15px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2); z-index: 100; text-align: center; max-width: 80%; transition: all 0.3s ease; border: 5px solid; } .message.show { transform: translate(-50%, -50%) scale(1); } .message.correct { border-color: #b5ead7; background-color: #e8f8f3; } .message.wrong { border-color: #ff9aa2; background-color: #ffeef0; } .message h2 { font-size: 3rem; margin-bottom: 15px; } .message p { font-size: 2rem; margin-bottom: 20px; } .message-btn { padding: 10px 20px; border-radius: 50px; border: none; background-color: var(--button); color: white; font-size: 2rem; cursor: pointer; transition: all 0.2s ease; } .message-btn:hover { background-color: #5d8eff; transform: scale(1.05); } .confetti { position: absolute; width: 15px; height: 15px; background-color: var(--primary); opacity: 0; z-index: 90; } @keyframes confetti-fall { 0% { transform: translateY(-100vh) rotate(0deg); opacity: 1; } 100% { transform: translateY(100vh) rotate(360deg); opacity: 0; } } @media (max-width: 600px) { .game-container { width: 95%; padding: 20px; } h1 { font-size: 2rem; } .question { font-size: 2.5rem; } .options { grid-template-columns: 1fr; } .option-btn { font-size: 2rem; } }`; } /** * 获取语文游戏样式 */ getLanguageGameStyle() { return this.getMathGameStyle().replace('--button: #70a1ff;', '--button: #ff6b9d;'); } /** * 获取生活游戏样式 */ getLifeGameStyle() { return this.getMathGameStyle().replace('--button: #70a1ff;', '--button: #4ecdc4;'); } /** * 获取默认游戏样式 */ getDefaultGameStyle() { return this.getMathGameStyle(); } /** * 从题目库获取题目 */ getQuestionsFromBank(subject, questionCount) { const subjectQuestions = this.questionBank.get(subject); if (!subjectQuestions) { console.warn(`❌ 未找到学科 ${subject} 的题目库`); return []; } const allQuestions = []; // 收集所有题目 for (const [type, questions] of Object.entries(subjectQuestions)) { allQuestions.push(...questions); } // 根据难度筛选题目 const suitableQuestions = allQuestions.filter(q => q.difficulty <= this.currentDifficulty ); if (suitableQuestions.length === 0) { console.warn(`❌ 未找到适合难度 ${this.currentDifficulty} 的题目`); return []; } // 随机选择题目 const selectedQuestions = []; const shuffled = [...suitableQuestions].sort(() => Math.random() - 0.5); for (let i = 0; i < Math.min(questionCount, shuffled.length); i++) { selectedQuestions.push({ ...shuffled[i], id: `q_${Date.now()}_${i}` }); } return selectedQuestions; } /** * 选择题目类型 */ selectQuestionTypes(subject) { const availableTypes = Object.keys(this.questionTypes[subject] || {}); const studentStrengths = this.studentProfile.strengths; const studentWeaknesses = this.studentProfile.weaknesses; // 优先选择学生擅长的类型,但也包含需要练习的类型 let selectedTypes = []; // 70%选择擅长的类型 const strengthCount = Math.ceil(availableTypes.length * 0.7); for (let i = 0; i < strengthCount && i < availableTypes.length; i++) { selectedTypes.push(availableTypes[i]); } // 30%选择需要练习的类型 const weaknessCount = availableTypes.length - strengthCount; for (let i = 0; i < weaknessCount && i < availableTypes.length; i++) { const type = availableTypes[(strengthCount + i) % availableTypes.length]; if (!selectedTypes.includes(type)) { selectedTypes.push(type); } } return selectedTypes; } /** * 生成单个题目 */ generateQuestion(subject, questionType) { const subjectBank = this.questionBank.get(subject); if (!subjectBank || !subjectBank[questionType]) { return null; } const questions = subjectBank[questionType]; const suitableQuestions = questions.filter(q => q.difficulty <= this.currentDifficulty); if (suitableQuestions.length === 0) { return null; } // 随机选择一个题目 const selectedQuestion = suitableQuestions[Math.floor(Math.random() * suitableQuestions.length)]; // 根据当前难度调整题目 return this.adjustQuestionDifficulty(selectedQuestion); } /** * 调整题目难度 */ adjustQuestionDifficulty(question) { const adjustedQuestion = { ...question }; // 根据当前难度调整选项数量 if (this.currentDifficulty <= 2) { // 简单难度:减少选项数量 adjustedQuestion.options = adjustedQuestion.options.slice(0, 3); } else if (this.currentDifficulty >= 4) { // 困难难度:增加干扰选项 if (adjustedQuestion.options.length < 4) { adjustedQuestion.options.push("不知道"); } } return adjustedQuestion; } /** * 个性化游戏配置 */ personalizeGame(gameConfig) { const profile = this.studentProfile; // 根据学习风格调整 if (profile.learningStyle === 'visual') { gameConfig.visualAids = true; gameConfig.images = true; } else if (profile.learningStyle === 'auditory') { gameConfig.audioHints = true; gameConfig.voiceReading = true; } else if (profile.learningStyle === 'kinesthetic') { gameConfig.interactiveElements = true; gameConfig.handOnActivities = true; } // 根据年级调整 if (profile.grade <= 1) { gameConfig.simpleLanguage = true; gameConfig.bigFonts = true; gameConfig.moreHints = true; } else if (profile.grade >= 3) { gameConfig.complexQuestions = true; gameConfig.multipleSteps = true; } // 根据正确率调整 if (profile.correctRate < 0.6) { gameConfig.easierQuestions = true; gameConfig.moreTime = true; } else if (profile.correctRate > 0.8) { gameConfig.challengingQuestions = true; gameConfig.bonusPoints = true; } } /** * 动态调整难度 */ adjustDifficulty(performance) { const { correct, total, timeSpent, hintsUsed } = performance; const successRate = correct / total; const avgTimePerQuestion = timeSpent / total; // 记录性能历史 this.performanceHistory.push({ timestamp: Date.now(), successRate, avgTimePerQuestion, hintsUsed, difficulty: this.currentDifficulty }); // 根据成功率调整难度 if (successRate >= 0.8 && this.currentDifficulty < 5) { this.currentDifficulty++; console.log(`📈 难度提升到 ${this.currentDifficulty}`); } else if (successRate < 0.6 && this.currentDifficulty > 1) { this.currentDifficulty--; console.log(`📉 难度降低到 ${this.currentDifficulty}`); } // 根据答题速度调整 const expectedTime = this.difficultyParams[this.currentDifficulty].timeLimit; if (avgTimePerQuestion < expectedTime * 0.5) { // 答题太快,可能太简单 if (this.currentDifficulty < 5) { this.currentDifficulty++; console.log(`⚡ 答题速度过快,难度提升到 ${this.currentDifficulty}`); } } else if (avgTimePerQuestion > expectedTime * 1.5) { // 答题太慢,可能太难 if (this.currentDifficulty > 1) { this.currentDifficulty--; console.log(`🐌 答题速度过慢,难度降低到 ${this.currentDifficulty}`); } } return this.currentDifficulty; } /** * 生成游戏ID */ generateGameId() { return `ai_game_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; } /** * 获取游戏统计 */ getGameStats() { return { currentDifficulty: this.currentDifficulty, totalGames: this.performanceHistory.length, averageSuccessRate: this.performanceHistory.reduce((sum, p) => sum + p.successRate, 0) / this.performanceHistory.length, difficultyHistory: this.difficultyHistory, performanceHistory: this.performanceHistory }; } /** * 重置游戏生成器 */ reset() { this.currentDifficulty = 1; this.difficultyHistory = []; this.performanceHistory = []; console.log('🔄 AI游戏生成器已重置'); } } // 创建全局实例 window.aiGameGenerator = new AIGameGenerator(); // 全局关闭函数 window.closeAIGame = function() { const gameContainer = document.getElementById('ai-game-container'); if (gameContainer) { gameContainer.remove(); } // 停止虚拟老师 if (window.gameVirtualTeacher) { window.gameVirtualTeacher.stopAllSpeech(); } console.log('🎮 AI游戏已关闭'); }; // 全局虚拟猫头鹰控制函数 window.toggleVirtualTeacher = function() { // 这个函数会在游戏内部被定义 if (typeof toggleVirtualTeacher === 'function') { toggleVirtualTeacher(); } }; window.muteVirtualTeacher = function() { // 这个函数会在游戏内部被定义 if (typeof muteVirtualTeacher === 'function') { muteVirtualTeacher(); } }; // 全局体感交互函数 window.selectBodyAnswer = function(hand) { // 这个函数会在游戏内部被定义 if (typeof selectBodyAnswer === 'function') { selectBodyAnswer(hand); } }; // 导出类 if (typeof module !== 'undefined' && module.exports) { module.exports = AIGameGenerator; }