diff --git a/src/components/KnowledgeArea.vue b/src/components/KnowledgeArea.vue index d97afb6..68aac19 100644 --- a/src/components/KnowledgeArea.vue +++ b/src/components/KnowledgeArea.vue @@ -94,7 +94,7 @@ {{ dailyProgress.completed[currentSubject] || 0 }}/{{ dailyLimits[currentSubject] || 25 }} 题 -
+
{{ task.icon }}

{{ task.title }}

@@ -327,6 +327,13 @@ const currentAnswer = ref(''); const experimentResult = ref(''); const currentQuestionIndex = ref(0); +// 计算当前学科的任务列表(确保始终返回数组) +const currentTasks = computed(() => { + if (!currentSubject.value) return []; + const tasksList = tasks.value[currentSubject.value as keyof typeof tasks.value]; + return Array.isArray(tasksList) ? tasksList : []; +}); + // 每日题目上限 const dailyLimits = { math: 25, @@ -2507,15 +2514,15 @@ const checkAnswer = (option: string) => { isCorrect.value = option === currentGame.value.answer; const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; let starsPerQuestion = 1; - if (subject === 'math' || subject === 'chinese' || subject === 'english') { + if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { starsPerQuestion = Math.ceil((task.reward || 5) / 20); } else if (subject === 'science') { starsPerQuestion = Math.ceil((task.reward || 5) / 10); } - feedbackMessage.value = isCorrect.value - ? `太棒了!回答正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` + feedbackMessage.value = isCorrect.value + ? `太棒了!回答正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` : `再试一次,加油!你选择的是 ${option}。`; showFeedback.value = true; if (isCorrect.value) { @@ -2530,15 +2537,15 @@ const checkChineseAnswer = (option?: string) => { isCorrect.value = option === currentGame.value.answer; const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; let starsPerQuestion = 1; - if (subject === 'math' || subject === 'chinese' || subject === 'english') { + if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { starsPerQuestion = Math.ceil((task.reward || 5) / 20); } else if (subject === 'science') { starsPerQuestion = Math.ceil((task.reward || 5) / 10); } - feedbackMessage.value = isCorrect.value - ? `太棒了!答对了!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` + feedbackMessage.value = isCorrect.value + ? `太棒了!答对了!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` : `再试一次,加油!你选择的是 ${option}。`; showFeedback.value = true; if (isCorrect.value) { @@ -2549,15 +2556,15 @@ const checkChineseAnswer = (option?: string) => { isCorrect.value = currentAnswer.value === currentGame.value.answer; const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; let starsPerQuestion = 1; - if (subject === 'math' || subject === 'chinese' || subject === 'english') { + if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { starsPerQuestion = Math.ceil((task.reward || 5) / 20); } else if (subject === 'science') { starsPerQuestion = Math.ceil((task.reward || 5) / 10); } - feedbackMessage.value = isCorrect.value - ? `太棒了!拼字正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` + feedbackMessage.value = isCorrect.value + ? `太棒了!拼字正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` : `再试一次,加油!你选择的是 ${currentAnswer.value}。`; showFeedback.value = true; if (isCorrect.value) { @@ -2571,15 +2578,15 @@ const checkEnglishAnswer = (option: string) => { isCorrect.value = option === currentGame.value.answer; const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; let starsPerQuestion = 1; - if (subject === 'math' || subject === 'chinese' || subject === 'english') { + if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { starsPerQuestion = Math.ceil((task.reward || 5) / 20); } else if (subject === 'science') { starsPerQuestion = Math.ceil((task.reward || 5) / 10); } - feedbackMessage.value = isCorrect.value - ? `Great! Correct! The correct answer is ${currentGame.value.answer}. 获得 ${starsPerQuestion} 颗星星能量!` + feedbackMessage.value = isCorrect.value + ? `Great! Correct! The correct answer is ${currentGame.value.answer}. 获得 ${starsPerQuestion} 颗星星能量!` : `Try again! You selected ${option}.`; showFeedback.value = true; if (isCorrect.value) { @@ -2592,7 +2599,7 @@ const checkScienceAnswer = () => { isCorrect.value = true; // 科学实验只要完成就正确 const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; let starsPerQuestion = 1; if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { starsPerQuestion = Math.ceil((task.reward || 5) / 20); @@ -2609,15 +2616,15 @@ const checkJapaneseAnswer = (option: string) => { isCorrect.value = option === currentGame.value.answer; const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; let starsPerQuestion = 1; if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { starsPerQuestion = Math.ceil((task.reward || 5) / 20); } else if (subject === 'science') { starsPerQuestion = Math.ceil((task.reward || 5) / 10); } - feedbackMessage.value = isCorrect.value - ? `すごい!回答正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` + feedbackMessage.value = isCorrect.value + ? `すごい!回答正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` : `もう一度やってみて!你选择的是 ${option}。`; showFeedback.value = true; if (isCorrect.value) { @@ -2630,15 +2637,15 @@ const checkGeographyAnswer = (option: string) => { isCorrect.value = option === currentGame.value.answer; const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; let starsPerQuestion = 1; if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { starsPerQuestion = Math.ceil((task.reward || 5) / 20); } else if (subject === 'science') { starsPerQuestion = Math.ceil((task.reward || 5) / 10); } - feedbackMessage.value = isCorrect.value - ? `太棒了!回答正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` + feedbackMessage.value = isCorrect.value + ? `太棒了!回答正确!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!` : `再试一次,加油!你选择的是 ${option}。`; showFeedback.value = true; if (isCorrect.value) { @@ -2661,8 +2668,8 @@ const nextQuestion = () => { // 每完成一题获得星星能量 const subject = currentGame.value.subject; const taskIndex = currentGame.value.taskIndex; - const task = tasks.value[subject] && tasks.value[subject][taskIndex] ? tasks.value[subject][taskIndex] : { reward: 5 }; - + const task = tasks.value[subject]?.[taskIndex] || { reward: 5 }; + // 计算每题的星星奖励(降低获得量) let starsPerQuestion = 1; if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') { @@ -2674,7 +2681,7 @@ const nextQuestion = () => { // 总奖励为8-12,分成10题,每题0.8-1.2颗,向上取整为1颗 starsPerQuestion = Math.ceil((task.reward || 5) / 15); // 15题任务的计算方式,降低获得量 } - + // 添加星星能量 starEnergyStore.addEnergy(starsPerQuestion, 'knowledge');