3854 lines
151 KiB
Vue
3854 lines
151 KiB
Vue
<template>
|
||
<div class="knowledge-area">
|
||
<!-- 漂浮的魔法装饰 -->
|
||
<div class="magic-decor star-1">✨</div>
|
||
<div class="magic-decor star-2">⭐</div>
|
||
<div class="magic-decor star-3">🌟</div>
|
||
<div class="magic-decor star-4">✨</div>
|
||
<div class="magic-decor star-5">⭐</div>
|
||
|
||
<!-- 库洛米向导 -->
|
||
<div class="guide-character">
|
||
<div class="guide-avatar">💜</div>
|
||
<div class="guide-bubble">
|
||
<p>欢迎来到知识魔法屋!我是库洛米老师~</p>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="area-header">
|
||
<div class="header-decoration">🪄✨📚</div>
|
||
<h2 class="area-title">🎓 知识魔法屋 🎓</h2>
|
||
<p class="area-desc">和库洛米一起,开启奇妙的知识之旅吧!</p>
|
||
<div class="header-decoration">🌈🎨⭐</div>
|
||
</div>
|
||
|
||
<div class="subjects">
|
||
<!-- 数学魔法课 -->
|
||
<div class="subject-card math" @click="selectSubject('math')">
|
||
<div class="subject-icon">🔢</div>
|
||
<div class="subject-emoji">🐿️</div>
|
||
<h3 class="subject-title">数学魔法课</h3>
|
||
<p class="subject-desc">和数字松鼠一起冒险</p>
|
||
<div class="subject-reward">⭐ +1 能量</div>
|
||
</div>
|
||
|
||
<!-- 语文魔法课 -->
|
||
<div class="subject-card chinese" @click="selectSubject('chinese')">
|
||
<div class="subject-icon">📖</div>
|
||
<div class="subject-emoji">🧚</div>
|
||
<h3 class="subject-title">语文魔法课</h3>
|
||
<p class="subject-desc">帮汉字小精灵拼偏旁</p>
|
||
<div class="subject-reward">⭐ +1 能量</div>
|
||
</div>
|
||
|
||
<!-- 英语魔法课 -->
|
||
<div class="subject-card english" @click="selectSubject('english')">
|
||
<div class="subject-icon">🔤</div>
|
||
<div class="subject-emoji">🐦</div>
|
||
<h3 class="subject-title">英语魔法课</h3>
|
||
<p class="subject-desc">和字母小鸟走迷宫</p>
|
||
<div class="subject-reward">⭐ +1 能量</div>
|
||
</div>
|
||
|
||
<!-- 科学魔法课 -->
|
||
<div class="subject-card science" @click="selectSubject('science')">
|
||
<div class="subject-icon">🔬</div>
|
||
<div class="subject-emoji">🌱</div>
|
||
<h3 class="subject-title">科学魔法课</h3>
|
||
<p class="subject-desc">在植物实验室做实验</p>
|
||
<div class="subject-reward">⭐ +1 能量</div>
|
||
</div>
|
||
|
||
<!-- 日语魔法课 -->
|
||
<div class="subject-card japanese" @click="selectSubject('japanese')">
|
||
<div class="subject-icon">🗾</div>
|
||
<div class="subject-emoji">🌸</div>
|
||
<h3 class="subject-title">日语魔法课</h3>
|
||
<p class="subject-desc">学习简单的日语和50音图</p>
|
||
<div class="subject-reward">⭐ +1 能量</div>
|
||
</div>
|
||
|
||
<!-- 地理魔法课 -->
|
||
<div class="subject-card geography" @click="selectSubject('geography')">
|
||
<div class="subject-icon">🗺️</div>
|
||
<div class="subject-emoji">🌏</div>
|
||
<h3 class="subject-title">地理魔法课</h3>
|
||
<p class="subject-desc">学习中国地理常识和南北方差异</p>
|
||
<div class="subject-reward">⭐ +1 能量</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 课程内容 -->
|
||
<div class="subject-content" v-if="currentSubject">
|
||
<div class="content-header">
|
||
<h3 class="content-title">{{ currentSubject ? subjectTitles[currentSubject as keyof typeof subjectTitles] : '' }}</h3>
|
||
<button class="back-btn" @click="currentSubject = null">返回</button>
|
||
</div>
|
||
|
||
<!-- 任务列表 -->
|
||
<div class="tasks" v-if="!currentGame && currentSubject">
|
||
<div class="daily-progress">
|
||
<h4>今日进度</h4>
|
||
<div class="progress-bar">
|
||
<div class="progress-fill" :style="{ width: ((dailyProgress.completed[currentSubject] || 0) / (dailyLimits[currentSubject] || 25)) * 100 + '%' }"></div>
|
||
</div>
|
||
<span class="progress-text">{{ dailyProgress.completed[currentSubject] || 0 }}/{{ dailyLimits[currentSubject] || 25 }} 题</span>
|
||
</div>
|
||
<div v-for="(task, index) in (tasks[currentSubject] || [])" :key="index" class="task-card">
|
||
<div class="task-icon">{{ task.icon }}</div>
|
||
<div class="task-info">
|
||
<h4 class="task-title">{{ task.title }}</h4>
|
||
<p class="task-desc">{{ task.description }}</p>
|
||
<div class="task-reward">
|
||
<span class="reward-icon">⭐</span>
|
||
<span>{{ task.reward }} 颗星星能量</span>
|
||
</div>
|
||
</div>
|
||
<button class="task-btn" @click="startGame(currentSubject || '', index)" :disabled="isDailyLimitReached(currentSubject || '')">
|
||
{{ task.completed ? '已完成' : isDailyLimitReached(currentSubject || '') ? '今日已达上限' : '开始' }}
|
||
</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 游戏内容 -->
|
||
<div class="game-content" v-if="currentGame">
|
||
<!-- 数学游戏 -->
|
||
<div v-if="currentGame.subject === 'math'" class="math-game">
|
||
<div class="game-question">
|
||
<div class="question-with-audio">
|
||
<h4>{{ currentGame.question }}</h4>
|
||
<button class="audio-btn" @click="playAudio(currentGame.question)">🔊</button>
|
||
</div>
|
||
<div class="answer-options">
|
||
<div
|
||
v-for="(option, idx) in currentGame.options"
|
||
:key="idx"
|
||
class="option-btn"
|
||
@click="checkAnswer(option)"
|
||
>
|
||
<span>{{ option }}</span>
|
||
<button class="part-audio-btn" @click.stop="playAudio(option)">🔊</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="game-feedback" v-if="showFeedback">
|
||
<div :class="['feedback-message', isCorrect ? 'correct' : 'incorrect']">
|
||
{{ feedbackMessage }}
|
||
</div>
|
||
<button class="next-btn" @click="nextQuestion">下一题</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 语文游戏 -->
|
||
<div v-else-if="currentGame.subject === 'chinese'" class="chinese-game">
|
||
<div class="game-question">
|
||
<div class="question-with-audio">
|
||
<h4>{{ currentGame.question }}</h4>
|
||
<button class="audio-btn" v-if="currentGame.audio" @click="playAudio(currentGame.audio)">
|
||
🔊
|
||
</button>
|
||
</div>
|
||
<!-- 选择题格式 -->
|
||
<div class="word-options" v-if="currentGame.options">
|
||
<div
|
||
v-for="(option, idx) in currentGame.options"
|
||
:key="idx"
|
||
class="option-btn"
|
||
@click="checkChineseAnswer(option)"
|
||
>
|
||
<span>{{ option }}</span>
|
||
<button class="part-audio-btn" @click.stop="playAudio(option)">🔊</button>
|
||
</div>
|
||
</div>
|
||
<!-- 拼字格式(兼容旧数据) -->
|
||
<div class="character-parts" v-if="currentGame.parts">
|
||
<div class="part" v-for="(part, idx) in currentGame.parts" :key="idx" @click="selectPart(part)">
|
||
<span>{{ part }}</span>
|
||
<button class="part-audio-btn" @click.stop="playAudio(part)">🔊</button>
|
||
</div>
|
||
</div>
|
||
<div class="current-answer" v-if="currentGame.parts && currentAnswer">
|
||
<span>当前答案: </span>
|
||
<span class="answer">{{ currentAnswer }}</span>
|
||
<button class="audio-btn" @click="playAudio(currentAnswer)">
|
||
🔊
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<button class="submit-btn" v-if="currentGame.parts && currentAnswer" @click="checkChineseAnswer">提交答案</button>
|
||
<div class="game-feedback" v-if="showFeedback">
|
||
<div :class="['feedback-message', isCorrect ? 'correct' : 'incorrect']">
|
||
{{ feedbackMessage }}
|
||
</div>
|
||
<button class="next-btn" @click="nextQuestion">下一题</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 英语游戏 -->
|
||
<div v-else-if="currentGame.subject === 'english'" class="english-game">
|
||
<div class="game-question">
|
||
<div class="question-with-audio">
|
||
<h4>{{ currentGame.question }}</h4>
|
||
<button class="audio-btn" @click="playAudio(currentGame.question)">
|
||
🔊
|
||
</button>
|
||
</div>
|
||
<div class="word-options">
|
||
<div
|
||
v-for="(option, idx) in currentGame.options"
|
||
:key="idx"
|
||
class="option-btn"
|
||
@click="checkEnglishAnswer(option)"
|
||
>
|
||
<span>{{ option }}</span>
|
||
<div class="option-audio-btn" @click.stop="playAudio(option)">🔊</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="game-feedback" v-if="showFeedback">
|
||
<div :class="['feedback-message', isCorrect ? 'correct' : 'incorrect']">
|
||
{{ feedbackMessage }}
|
||
</div>
|
||
<button class="next-btn" @click="nextQuestion">下一题</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 科学游戏 -->
|
||
<div v-else-if="currentGame.subject === 'science'" class="science-game">
|
||
<div class="game-question">
|
||
<div class="question-with-audio">
|
||
<h4>{{ currentGame.question }}</h4>
|
||
<button class="audio-btn" @click="playAudio(currentGame.question)">🔊</button>
|
||
</div>
|
||
<div class="experiment-area">
|
||
<div class="experiment-item" v-for="(item, idx) in currentGame.items" :key="idx">
|
||
<div class="item-icon">{{ item.icon }}</div>
|
||
<div class="item-name-with-audio">
|
||
<span>{{ item.name }}</span>
|
||
<button class="part-audio-btn" @click.stop="playAudio(item.name)">🔊</button>
|
||
</div>
|
||
<button class="use-btn" @click="useItem(item)">
|
||
使用
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="experiment-result" v-if="experimentResult">
|
||
<div class="result-with-audio">
|
||
<p>{{ experimentResult }}</p>
|
||
<button class="audio-btn" @click="playAudio(experimentResult)">🔊</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<button class="submit-btn" @click="checkScienceAnswer">完成实验</button>
|
||
<div class="game-feedback" v-if="showFeedback">
|
||
<div :class="['feedback-message', isCorrect ? 'correct' : 'incorrect']">
|
||
{{ feedbackMessage }}
|
||
</div>
|
||
<button class="next-btn" @click="nextQuestion">下一题</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 日语游戏 -->
|
||
<div v-else-if="currentGame.subject === 'japanese'" class="japanese-game">
|
||
<div class="game-question">
|
||
<div class="question-with-audio">
|
||
<h4>{{ currentGame.question }}</h4>
|
||
<button class="audio-btn" @click="playAudio(currentGame.question)">
|
||
🔊
|
||
</button>
|
||
</div>
|
||
<div class="word-options">
|
||
<div
|
||
v-for="(option, idx) in currentGame.options"
|
||
:key="idx"
|
||
class="option-btn"
|
||
@click="checkJapaneseAnswer(option)"
|
||
>
|
||
<span>{{ option }}</span>
|
||
<div class="option-audio-btn" @click.stop="playAudio(option)">🔊</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="game-feedback" v-if="showFeedback">
|
||
<div :class="['feedback-message', isCorrect ? 'correct' : 'incorrect']">
|
||
{{ feedbackMessage }}
|
||
</div>
|
||
<button class="next-btn" @click="nextQuestion">下一题</button>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- 地理游戏 -->
|
||
<div v-else-if="currentGame.subject === 'geography'" class="geography-game">
|
||
<div class="game-question">
|
||
<div class="question-with-audio">
|
||
<h4>{{ currentGame.question }}</h4>
|
||
<button class="audio-btn" @click="playAudio(currentGame.question)">🔊</button>
|
||
</div>
|
||
<div class="word-options">
|
||
<div
|
||
v-for="(option, idx) in currentGame.options"
|
||
:key="idx"
|
||
class="option-btn"
|
||
@click="checkGeographyAnswer(option)"
|
||
>
|
||
<span>{{ option }}</span>
|
||
<div class="option-audio-btn" @click.stop="playAudio(option)">🔊</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="game-feedback" v-if="showFeedback">
|
||
<div :class="['feedback-message', isCorrect ? 'correct' : 'incorrect']">
|
||
{{ feedbackMessage }}
|
||
</div>
|
||
<button class="next-btn" @click="nextQuestion">下一题</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</template>
|
||
|
||
<script setup lang="ts">
|
||
import { ref, onMounted, computed } from 'vue';
|
||
import { useStarEnergyStore } from '../stores/starEnergy';
|
||
|
||
// 获取当前用户
|
||
const getCurrentUser = () => {
|
||
return localStorage.getItem('currentUser') || 'default';
|
||
};
|
||
|
||
const starEnergyStore = useStarEnergyStore();
|
||
const currentSubject = ref<string | null>(null);
|
||
const currentGame = ref<any>(null);
|
||
const showFeedback = ref(false);
|
||
const isCorrect = ref(false);
|
||
const feedbackMessage = ref('');
|
||
const currentAnswer = ref('');
|
||
const experimentResult = ref('');
|
||
const currentQuestionIndex = ref(0);
|
||
|
||
// 每日题目上限
|
||
const dailyLimits = {
|
||
math: 25,
|
||
chinese: 25,
|
||
english: 25,
|
||
science: 25,
|
||
japanese: 25,
|
||
geography: 25
|
||
};
|
||
|
||
// 题目进度跟踪
|
||
const progress = ref({
|
||
math: {
|
||
counting: 0,
|
||
shapes: 0,
|
||
calculation: 0
|
||
},
|
||
chinese: {
|
||
radicals: 0,
|
||
pinyin: 0,
|
||
words: 0
|
||
},
|
||
english: {
|
||
maze: 0,
|
||
animal: 0,
|
||
dialogue: 0
|
||
},
|
||
science: {
|
||
plants: 0,
|
||
buoyancy: 0,
|
||
colors: 0,
|
||
chemistry: 0,
|
||
physics: 0,
|
||
experiments: 0
|
||
},
|
||
japanese: {
|
||
hiragana: 0,
|
||
animals: 0,
|
||
fruits: 0,
|
||
body: 0,
|
||
directions: 0,
|
||
items: 0,
|
||
greetings: 0
|
||
},
|
||
geography: {
|
||
map: 0,
|
||
basics: 0,
|
||
northSouth: 0
|
||
}
|
||
});
|
||
|
||
// 每日完成记录
|
||
const dailyProgress = ref({
|
||
date: new Date().toDateString(),
|
||
completed: {
|
||
math: 0,
|
||
chinese: 0,
|
||
english: 0,
|
||
science: 0,
|
||
japanese: 0,
|
||
geography: 0
|
||
}
|
||
});
|
||
|
||
// 检查是否达到每日上限
|
||
const isDailyLimitReached = (subject: string) => {
|
||
console.log('检查每日上限:', subject);
|
||
const completed = dailyProgress.value.completed[subject] || 0;
|
||
const limit = dailyLimits[subject] || 25;
|
||
console.log('已完成:', completed, '上限:', limit);
|
||
return completed >= limit;
|
||
};
|
||
|
||
// 初始化时加载语音合成API的voices和进度数据
|
||
onMounted(() => {
|
||
// 触发语音合成API的加载
|
||
window.speechSynthesis.getVoices();
|
||
|
||
// 加载进度数据
|
||
loadProgress();
|
||
|
||
// 检查日期是否更新
|
||
checkDateUpdate();
|
||
});
|
||
|
||
// 加载进度数据
|
||
const loadProgress = () => {
|
||
const user = getCurrentUser();
|
||
const savedProgress = localStorage.getItem(`knowledgeProgress_${user}`);
|
||
if (savedProgress) {
|
||
try {
|
||
const data = JSON.parse(savedProgress);
|
||
if (data.progress) {
|
||
progress.value = data.progress;
|
||
}
|
||
if (data.dailyProgress) {
|
||
dailyProgress.value = data.dailyProgress;
|
||
}
|
||
if (data.tasks) {
|
||
tasks.value = data.tasks;
|
||
}
|
||
} catch (error) {
|
||
console.error('加载进度数据失败:', error);
|
||
}
|
||
}
|
||
};
|
||
|
||
// 保存进度数据
|
||
const saveProgress = () => {
|
||
const user = getCurrentUser();
|
||
const data = {
|
||
progress: progress.value,
|
||
dailyProgress: dailyProgress.value,
|
||
tasks: tasks.value
|
||
};
|
||
localStorage.setItem(`knowledgeProgress_${user}`, JSON.stringify(data));
|
||
};
|
||
|
||
// 检查日期更新
|
||
const checkDateUpdate = () => {
|
||
const today = new Date().toDateString();
|
||
if (dailyProgress.value.date !== today) {
|
||
// 新的一天,重置每日进度
|
||
dailyProgress.value = {
|
||
date: today,
|
||
completed: {
|
||
math: 0,
|
||
chinese: 0,
|
||
english: 0,
|
||
science: 0,
|
||
japanese: 0,
|
||
geography: 0
|
||
}
|
||
};
|
||
|
||
// 任务的完成状态保持不变,以保持持久学习的状态
|
||
|
||
saveProgress();
|
||
}
|
||
};
|
||
|
||
|
||
// 学科标题
|
||
const subjectTitles = {
|
||
math: '数学魔法课',
|
||
chinese: '语文魔法课',
|
||
english: '英语魔法课',
|
||
science: '科学魔法课',
|
||
japanese: '日语魔法课',
|
||
geography: '地理魔法课'
|
||
};
|
||
|
||
// 任务数据
|
||
const tasks = ref({
|
||
math: [
|
||
{
|
||
title: '数农场里的小鸡',
|
||
description: '和 "数字松鼠" 一起数农场里的小鸡(1-100 认知)',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🐿️'
|
||
},
|
||
{
|
||
title: '搭建几何城堡',
|
||
description: '用几何积木搭建城堡(形状认知)',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🏰'
|
||
},
|
||
{
|
||
title: '超市收银算账',
|
||
description: '模拟超市收银算账(加减法)',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '💰'
|
||
}
|
||
],
|
||
chinese: [
|
||
{
|
||
title: '拼偏旁游戏',
|
||
description: '帮 "汉字小精灵" 拼偏旁(氵 + 可 = 河)',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '✏️'
|
||
},
|
||
{
|
||
title: '拼音练习',
|
||
description: '学习声母、韵母和整体认读音节',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🎢'
|
||
},
|
||
{
|
||
title: '词语认读',
|
||
description: '认识一年级常用词语,快乐学习',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '📚'
|
||
}
|
||
],
|
||
english: [
|
||
{
|
||
title: '字母迷宫',
|
||
description: '和 "字母小鸟" 走迷宫(字母认知)',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🐦'
|
||
},
|
||
{
|
||
title: '动物喂食',
|
||
description: '给动物园的动物喂食物(跟读单词)',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🐯'
|
||
},
|
||
{
|
||
title: '情景对话',
|
||
description: '在 "情景飞船" 里用英语打招呼(对话练习)',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🚀'
|
||
}
|
||
],
|
||
science: [
|
||
{
|
||
title: '植物生长',
|
||
description: '在 "植物实验室" 给小花浇水、晒太阳,观察它长大(生物)',
|
||
reward: 8,
|
||
completed: false,
|
||
icon: '🌱'
|
||
},
|
||
{
|
||
title: '浮力实验',
|
||
description: '往 "浮力池塘" 放石头、木块,看谁会沉谁会浮(物理)',
|
||
reward: 8,
|
||
completed: false,
|
||
icon: '🌊'
|
||
},
|
||
{
|
||
title: '颜色混合',
|
||
description: '用 "颜色魔法瓶" 混合色素,变出彩虹色(化学)',
|
||
reward: 8,
|
||
completed: false,
|
||
icon: '🌈'
|
||
},
|
||
{
|
||
title: '化学实验',
|
||
description: '探索化学反应、蒸汽气化等有趣的化学现象',
|
||
reward: 10,
|
||
completed: false,
|
||
icon: '🧪'
|
||
},
|
||
{
|
||
title: '物理实验',
|
||
description: '了解电池、电路、磁铁等物理原理',
|
||
reward: 10,
|
||
completed: false,
|
||
icon: '⚡'
|
||
},
|
||
{
|
||
title: '科学小实验',
|
||
description: '动手做有趣的科学小实验,探索科学奥秘',
|
||
reward: 12,
|
||
completed: false,
|
||
icon: '🔬'
|
||
}
|
||
],
|
||
japanese: [
|
||
{
|
||
title: '50音图学习',
|
||
description: '学习日语的基础50音图,掌握平假名的发音和书写',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: 'あ'
|
||
},
|
||
{
|
||
title: '小动物日语',
|
||
description: '学习常见小动物的日语名称和发音',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🐱'
|
||
},
|
||
{
|
||
title: '水果日语',
|
||
description: '学习各种水果的日语名称和发音',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🍎'
|
||
},
|
||
{
|
||
title: '身体部位日语',
|
||
description: '学习身体各部位的日语名称和发音',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '👤'
|
||
},
|
||
{
|
||
title: '方向日语',
|
||
description: '学习前后左右等方向的日语表达',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🧭'
|
||
},
|
||
{
|
||
title: '日常物品日语',
|
||
description: '学习生活中常用物品的日语名称',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🏠'
|
||
},
|
||
{
|
||
title: '问候语日语',
|
||
description: '学习日常问候语和礼貌用语的日语表达',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '👋'
|
||
}
|
||
],
|
||
geography: [
|
||
{
|
||
title: '中国地图认知',
|
||
description: '认识中国地图的形状和主要省份',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🗺️'
|
||
},
|
||
{
|
||
title: '中国地理常识',
|
||
description: '学习中国的地理位置、面积等基本常识',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🌏'
|
||
},
|
||
{
|
||
title: '南北方差异',
|
||
description: '了解中国南北方的地理文化差异',
|
||
reward: 5,
|
||
completed: false,
|
||
icon: '🌵'
|
||
}
|
||
]
|
||
});
|
||
|
||
// 游戏数据
|
||
const gameData = {
|
||
geography: {
|
||
// 中国地图认知
|
||
map: [
|
||
{ question: '中国地图的形状像什么?', options: ['公鸡', '兔子', '大象', '龙'], answer: '公鸡' },
|
||
{ question: '中国的首都是哪里?', options: ['上海', '北京', '广州', '深圳'], answer: '北京' },
|
||
{ question: '中国最大的岛屿是哪个?', options: ['海南岛', '台湾岛', '崇明岛', '舟山群岛'], answer: '台湾岛' },
|
||
{ question: '中国最长的河流是哪条?', options: ['黄河', '长江', '珠江', '松花江'], answer: '长江' },
|
||
{ question: '中国的母亲河是哪条?', options: ['长江', '黄河', '珠江', '淮河'], answer: '黄河' }
|
||
],
|
||
// 中国地理常识
|
||
basics: [
|
||
{ question: '中国位于哪个大洲?', options: ['欧洲', '亚洲', '非洲', '北美洲'], answer: '亚洲' },
|
||
{ question: '中国的土地面积大约是多少?', options: ['960万平方公里', '860万平方公里', '760万平方公里', '660万平方公里'], answer: '960万平方公里' },
|
||
{ question: '中国的邻国中,面积最大的是哪个国家?', options: ['俄罗斯', '印度', '蒙古', '朝鲜'], answer: '俄罗斯' },
|
||
{ question: '中国的四大直辖市是北京、上海、天津和哪里?', options: ['重庆', '广州', '深圳', '成都'], answer: '重庆' },
|
||
{ question: '中国的地势特点是什么?', options: ['东高西低', '西高东低', '南高北低', '北高南低'], answer: '西高东低' },
|
||
{ question: '中国最大的高原是哪个?', options: ['青藏高原', '内蒙古高原', '黄土高原', '云贵高原'], answer: '青藏高原' },
|
||
{ question: '中国最大的平原是哪个?', options: ['东北平原', '华北平原', '长江中下游平原', '关中平原'], answer: '东北平原' },
|
||
{ question: '中国的南海诸岛属于哪个省级行政区?', options: ['广东省', '海南省', '福建省', '台湾省'], answer: '海南省' },
|
||
{ question: '中国的五岳中,位于山东省的是哪座山?', options: ['泰山', '华山', '衡山', '恒山'], answer: '泰山' }
|
||
],
|
||
// 南北方差异
|
||
northSouth: [
|
||
{ question: '中国南北方的分界线是什么?', options: ['秦岭-淮河', '长江', '黄河', '长城'], answer: '秦岭-淮河' },
|
||
{ question: '北方地区的主要粮食作物是什么?', options: ['小麦', '水稻', '玉米', '高粱'], answer: '小麦' },
|
||
{ question: '南方地区的主要粮食作物是什么?', options: ['水稻', '小麦', '玉米', '高粱'], answer: '水稻' },
|
||
{ question: '北方人喜欢吃的面食是?', options: ['面条', '米饭', '馒头', '饺子'], answer: '面条' },
|
||
{ question: '南方人喜欢吃的主食是?', options: ['米饭', '面条', '馒头', '饺子'], answer: '米饭' }
|
||
]
|
||
},
|
||
math: {
|
||
// 数数练习(1-100 认知)
|
||
counting: [
|
||
// 原有题目
|
||
{ question: '农场里有5只小鸡,又来了3只,现在一共有几只?', options: ['6', '7', '8', '9'], answer: '8' },
|
||
{ question: '树上有10只鸟,飞走了2只,还剩几只?', options: ['6', '7', '8', '9'], answer: '8' },
|
||
{ question: '教室里有8个学生,又来了5个,现在一共有几个?', options: ['11', '12', '13', '14'], answer: '13' },
|
||
{ question: '篮子里有15个苹果,吃了4个,还剩几个?', options: ['9', '10', '11', '12'], answer: '11' },
|
||
{ question: '停车场有20辆车,开走了7辆,还剩几辆?', options: ['11', '12', '13', '14'], answer: '13' },
|
||
{ question: '书包里有6本书,又放了3本,现在有几本?', options: ['8', '9', '10', '11'], answer: '9' },
|
||
{ question: '花园里有12朵花,摘了5朵,还剩几朵?', options: ['6', '7', '8', '9'], answer: '7' },
|
||
{ question: '池塘里有7条小鱼,又来了6条,一共有几条?', options: ['11', '12', '13', '14'], answer: '13' },
|
||
{ question: '盒子里有18颗糖,分给同学8颗,还剩几颗?', options: ['8', '9', '10', '11'], answer: '10' },
|
||
{ question: '操场上跑着14个小朋友,3个回家了,还剩几个?', options: ['9', '10', '11', '12'], answer: '11' },
|
||
{ question: '妈妈买了9个橘子,又买了7个,一共有几个?', options: ['15', '16', '17', '18'], answer: '16' },
|
||
{ question: '图书馆有25本书,借走10本,还剩几本?', options: ['13', '14', '15', '16'], answer: '15' },
|
||
{ question: '小明有16颗星星,妹妹给了他4颗,现在有几颗?', options: ['18', '19', '20', '21'], answer: '20' },
|
||
{ question: '树上有30片叶子,风吹落了8片,还剩几片?', options: ['20', '21', '22', '23'], answer: '22' },
|
||
{ question: '盒子里有40个彩球,拿出15个,还剩几个?', options: ['23', '24', '25', '26'], answer: '25' },
|
||
{ question: '草地上有50朵花,摘了12朵,还剩几朵?', options: ['36', '37', '38', '39'], answer: '38' },
|
||
{ question: '班级有45个学生,转走了8个,还剩几个?', options: ['35', '36', '37', '38'], answer: '37' },
|
||
{ question: '家里有60个苹果,吃了18个,还剩几个?', options: ['40', '41', '42', '43'], answer: '42' },
|
||
{ question: '动物园有70只动物,又来了20只,一共有几只?', options: ['88', '89', '90', '91'], answer: '90' },
|
||
{ question: '学校有100本图书,借出去35本,还剩几本?', options: ['63', '64', '65', '66'], answer: '65' },
|
||
// 新添加题目 - 5以内数的认识和加、减法
|
||
{ question: '1+1=?', options: ['1', '2', '3', '4'], answer: '2' },
|
||
{ question: '2+2=?', options: ['3', '4', '5', '6'], answer: '4' },
|
||
{ question: '3+2=?', options: ['4', '5', '6', '7'], answer: '5' },
|
||
{ question: '4-1=?', options: ['1', '2', '3', '4'], answer: '3' },
|
||
{ question: '5-2=?', options: ['2', '3', '4', '5'], answer: '3' },
|
||
{ question: '0+5=?', options: ['0', '1', '5', '10'], answer: '5' },
|
||
{ question: '5-0=?', options: ['0', '5', '10', '15'], answer: '5' },
|
||
{ question: '3+0=?', options: ['0', '3', '6', '9'], answer: '3' },
|
||
// 新添加题目 - 6~10的认识和加、减法
|
||
{ question: '6+3=?', options: ['7', '8', '9', '10'], answer: '9' },
|
||
{ question: '7+2=?', options: ['8', '9', '10', '11'], answer: '9' },
|
||
{ question: '8+2=?', options: ['8', '9', '10', '11'], answer: '10' },
|
||
{ question: '9-4=?', options: ['4', '5', '6', '7'], answer: '5' },
|
||
{ question: '10-3=?', options: ['6', '7', '8', '9'], answer: '7' },
|
||
{ question: '6+4=?', options: ['8', '9', '10', '11'], answer: '10' },
|
||
{ question: '7+3=?', options: ['8', '9', '10', '11'], answer: '10' },
|
||
// 新添加题目 - 11~20的认识
|
||
{ question: '11+2=?', options: ['12', '13', '14', '15'], answer: '13' },
|
||
{ question: '15-3=?', options: ['10', '11', '12', '13'], answer: '12' },
|
||
{ question: '18-5=?', options: ['12', '13', '14', '15'], answer: '13' },
|
||
{ question: '20-2=?', options: ['16', '17', '18', '19'], answer: '18' },
|
||
// 新添加题目 - 20以内的进位加法
|
||
{ question: '9+3=?', options: ['10', '11', '12', '13'], answer: '12' },
|
||
{ question: '8+5=?', options: ['11', '12', '13', '14'], answer: '13' },
|
||
{ question: '7+6=?', options: ['12', '13', '14', '15'], answer: '13' },
|
||
{ question: '6+7=?', options: ['12', '13', '14', '15'], answer: '13' },
|
||
{ question: '5+8=?', options: ['12', '13', '14', '15'], answer: '13' },
|
||
// 新添加题目 - 20以内的退位减法
|
||
{ question: '12-9=?', options: ['1', '2', '3', '4'], answer: '3' },
|
||
{ question: '15-8=?', options: ['5', '6', '7', '8'], answer: '7' },
|
||
{ question: '14-7=?', options: ['5', '6', '7', '8'], answer: '7' },
|
||
{ question: '13-6=?', options: ['5', '6', '7', '8'], answer: '7' },
|
||
// 新添加题目 - 100以内数的认识
|
||
{ question: '20+30=?', options: ['40', '50', '60', '70'], answer: '50' },
|
||
{ question: '40+50=?', options: ['70', '80', '90', '100'], answer: '90' },
|
||
{ question: '60-20=?', options: ['30', '40', '50', '60'], answer: '40' },
|
||
{ question: '80-30=?', options: ['40', '50', '60', '70'], answer: '50' },
|
||
{ question: '30+5=?', options: ['30', '35', '40', '45'], answer: '35' },
|
||
{ question: '40+7=?', options: ['40', '47', '50', '57'], answer: '47' },
|
||
{ question: '25-5=?', options: ['15', '20', '25', '30'], answer: '20' },
|
||
{ question: '37-7=?', options: ['20', '30', '40', '50'], answer: '30' }
|
||
].sort(() => Math.random() - 0.5), // 随机打乱顺序
|
||
// 形状认知(混合难度)
|
||
shapes: [
|
||
// 原有题目
|
||
{ question: '下列哪个是圆形?', options: ['🔺', '⬜', '🔴', '▸'], answer: '🔴' },
|
||
{ question: '下列哪个是三角形?', options: ['🔴', '⬜', '🔺', '⭕'], answer: '🔺' },
|
||
{ question: '下列哪个是正方形?', options: ['🔴', '⬜', '🔺', '⭕'], answer: '⬜' },
|
||
{ question: '下列哪个是长方形?', options: ['🔴', '⬜', '🔺', '▭'], answer: '▭' },
|
||
{ question: '太阳是什么形状?', options: ['方形', '圆形', '三角形', '长方形'], answer: '圆形' },
|
||
{ question: '书本是什么形状?', options: ['圆形', '长方形', '三角形', '椭圆形'], answer: '长方形' },
|
||
{ question: '三角形有几条边?', options: ['2条', '3条', '4条', '5条'], answer: '3条' },
|
||
{ question: '正方形有几条边?', options: ['3条', '4条', '5条', '6条'], answer: '4条' },
|
||
{ question: '下列哪个物体是圆形的?', options: ['书本', '球', '铅笔盒', '桌子'], answer: '球' },
|
||
{ question: '车轮是什么形状?', options: ['方形', '三角形', '圆形', '长方形'], answer: '圆形' },
|
||
|
||
// 新添加题目 - 认识立体图形
|
||
{ question: '下列哪个是正方体?', options: ['🔲', '📦', '⚪', '🔺'], answer: '📦' },
|
||
{ question: '下列哪个是长方体?', options: ['🔲', '📦', '⚪', '🔺'], answer: '📦' },
|
||
{ question: '下列哪个是球体?', options: ['🔲', '📦', '⚪', '🔺'], answer: '⚪' },
|
||
{ question: '下列哪个是圆柱体?', options: ['🔲', '📦', '⚪', '🥫'], answer: '🥫' },
|
||
{ question: '正方体有几个面?', options: ['4个', '6个', '8个', '12个'], answer: '6个' },
|
||
{ question: '长方体有几个面?', options: ['4个', '6个', '8个', '12个'], answer: '6个' },
|
||
|
||
// 新添加题目 - 认识平面图形
|
||
{ question: '下列哪个是平行四边形?', options: ['🔺', '⬜', '▭', '🔷'], answer: '🔷' },
|
||
{ question: '下列哪个是梯形?', options: ['🔺', '⬜', '▭', '🔶'], answer: '🔶' },
|
||
{ question: '圆形有几条边?', options: ['0条', '1条', '2条', '3条'], answer: '0条' },
|
||
{ question: '平行四边形有几条边?', options: ['3条', '4条', '5条', '6条'], answer: '4条' },
|
||
|
||
// 原有中等难度题目
|
||
{ question: '一个正方形有几条边和几个角?', options: ['3条边3个角', '4条边4个角', '5条边5个角', '6条边6个角'], answer: '4条边4个角' },
|
||
{ question: '下列哪个图形有5条边?', options: ['三角形', '正方形', '五边形', '六边形'], answer: '五边形' },
|
||
{ question: '一个长方形的对边有什么特点?', options: ['长度相等', '长度不等', '一边长一边短', '没有特点'], answer: '长度相等' },
|
||
{ question: '用两个三角形可以拼成什么图形?', options: ['正方形', '长方形', '菱形', '以上都可以'], answer: '以上都可以' },
|
||
{ question: '下列哪个图形是轴对称图形?', options: ['平行四边形', '梯形', '圆形', '不规则图形'], answer: '圆形' },
|
||
{ question: '一个立方体有几个面?', options: ['4个面', '6个面', '8个面', '12个面'], answer: '6个面' },
|
||
{ question: '下列哪个图形的内角和是180度?', options: ['三角形', '正方形', '五边形', '六边形'], answer: '三角形' },
|
||
{ question: '一个圆的直径是半径的几倍?', options: ['1倍', '2倍', '3倍', '4倍'], answer: '2倍' },
|
||
{ question: '下列哪个是立体图形?', options: ['正方形', '圆形', '长方体', '三角形'], answer: '长方体' },
|
||
{ question: '用4个相同的正方形可以拼成一个大的什么图形?', options: ['正方形', '长方形', '三角形', '圆形'], answer: '正方形' }
|
||
].sort(() => Math.random() - 0.5), // 随机打乱顺序
|
||
// 加减法练习
|
||
calculation: [
|
||
// 原有题目
|
||
{ question: '3 + 5 = ?', options: ['6', '7', '8', '9'], answer: '8' },
|
||
{ question: '7 + 6 = ?', options: ['11', '12', '13', '14'], answer: '13' },
|
||
{ question: '9 + 8 = ?', options: ['15', '16', '17', '18'], answer: '17' },
|
||
{ question: '12 - 5 = ?', options: ['5', '6', '7', '8'], answer: '7' },
|
||
{ question: '15 - 7 = ?', options: ['6', '7', '8', '9'], answer: '8' },
|
||
{ question: '20 - 8 = ?', options: ['10', '11', '12', '13'], answer: '12' },
|
||
{ question: '25 + 15 = ?', options: ['38', '39', '40', '41'], answer: '40' },
|
||
{ question: '18 + 22 = ?', options: ['38', '39', '40', '41'], answer: '40' },
|
||
{ question: '45 - 18 = ?', options: ['25', '26', '27', '28'], answer: '27' },
|
||
{ question: '36 - 19 = ?', options: ['15', '16', '17', '18'], answer: '17' },
|
||
{ question: '14 + 26 = ?', options: ['38', '39', '40', '41'], answer: '40' },
|
||
{ question: '33 + 17 = ?', options: ['48', '49', '50', '51'], answer: '50' },
|
||
{ question: '52 - 28 = ?', options: ['22', '23', '24', '25'], answer: '24' },
|
||
{ question: '67 - 39 = ?', options: ['26', '27', '28', '29'], answer: '28' },
|
||
{ question: '48 + 35 = ?', options: ['81', '82', '83', '84'], answer: '83' },
|
||
{ question: '72 + 28 = ?', options: ['98', '99', '100', '101'], answer: '100' },
|
||
{ question: '85 - 47 = ?', options: ['36', '37', '38', '39'], answer: '38' },
|
||
{ question: '94 - 56 = ?', options: ['36', '37', '38', '39'], answer: '38' },
|
||
{ question: '56 + 44 = ?', options: ['98', '99', '100', '101'], answer: '100' },
|
||
{ question: '78 + 22 = ?', options: ['98', '99', '100', '101'], answer: '100' },
|
||
// 新添加题目 - 连加、连减、加减混合
|
||
{ question: '2+3+5=?', options: ['8', '9', '10', '11'], answer: '10' },
|
||
{ question: '10-2-3=?', options: ['3', '4', '5', '6'], answer: '5' },
|
||
{ question: '5+3-2=?', options: ['5', '6', '7', '8'], answer: '6' },
|
||
{ question: '8-3+2=?', options: ['5', '6', '7', '8'], answer: '7' },
|
||
// 新添加题目 - 100以内的口算加、减法
|
||
{ question: '23+5=?', options: ['26', '27', '28', '29'], answer: '28' },
|
||
{ question: '35+40=?', options: ['70', '75', '80', '85'], answer: '75' },
|
||
{ question: '47+8=?', options: ['53', '54', '55', '56'], answer: '55' },
|
||
{ question: '62-30=?', options: ['30', '31', '32', '33'], answer: '32' },
|
||
{ question: '54-7=?', options: ['45', '46', '47', '48'], answer: '47' },
|
||
// 新添加题目 - 100以内的笔算加、减法
|
||
{ question: '25+36=?', options: ['59', '60', '61', '62'], answer: '61' },
|
||
{ question: '48+35=?', options: ['81', '82', '83', '84'], answer: '83' },
|
||
{ question: '72-28=?', options: ['42', '43', '44', '45'], answer: '44' },
|
||
{ question: '65-37=?', options: ['26', '27', '28', '29'], answer: '28' }
|
||
].sort(() => Math.random() - 0.5) // 随机打乱顺序
|
||
},
|
||
chinese: {
|
||
// 偏旁组字 - 学习偏旁部首(一年级常用偏旁)
|
||
radicals: [
|
||
// 原有题目
|
||
{ question: '请选择正确的偏旁部首组成"江"字', options: ['氵', '木', '艹', '口'], answer: '氵', audio: '江,三点水旁' },
|
||
{ question: '请选择正确的偏旁部首组成"树"字', options: ['木', '氵', '艹', '口'], answer: '木', audio: '树,木字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"花"字', options: ['艹', '木', '氵', '口'], answer: '艹', audio: '花,草字头' },
|
||
{ question: '请选择正确的偏旁部首组成"说"字', options: ['讠', '木', '氵', '艹'], answer: '讠', audio: '说,言字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"好"字', options: ['女', '氵', '木', '艹'], answer: '女', audio: '好,女字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"爸"字', options: ['父', '母', '女', '子'], answer: '父', audio: '爸爸,父字头' },
|
||
{ question: '请选择正确的偏旁部首组成"妈"字', options: ['女', '父', '子', '口'], answer: '女', audio: '妈妈,女字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"河"字', options: ['氵', '木', '艹', '口'], answer: '氵', audio: '河,三点水旁' },
|
||
{ question: '请选择正确的偏旁部首组成"林"字', options: ['木', '氵', '艹', '口'], answer: '木', audio: '林,木字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"明"字', options: ['日', '月', '木', '水'], answer: '日', audio: '明,日字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"吃"字', options: ['口', '氵', '木', '艹'], answer: '口', audio: '吃,口字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"笑"字', options: ['竹', '木', '氵', '艹'], answer: '竹', audio: '笑,竹字头' },
|
||
{ question: '请选择正确的偏旁部首组成"跑"字', options: ['⻊', '氵', '木', '艹'], answer: '⻊', audio: '跑,足字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"听"字', options: ['口', '氵', '木', '艹'], answer: '口', audio: '听,口字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"看"字', options: ['手', '氵', '木', '艹'], answer: '手', audio: '看,手字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"和"字', options: ['禾', '氵', '木', '艹'], answer: '禾', audio: '和,禾字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"写"字', options: ['宀', '氵', '木', '艹'], answer: '宀', audio: '写,宝盖头' },
|
||
{ question: '请选择正确的偏旁部首组成"字"字', options: ['宀', '氵', '木', '艹'], answer: '宀', audio: '字,宝盖头' },
|
||
{ question: '请选择正确的偏旁部首组成"学"字', options: ['⺍', '氵', '木', '艹'], answer: '⺍', audio: '学,学字头' },
|
||
{ question: '请选择正确的偏旁部首组成"画"字', options: ['田', '氵', '木', '艹'], answer: '田', audio: '画,田字旁' },
|
||
// 新添加题目 - 第一单元·识字
|
||
{ question: '请选择正确的偏旁部首组成"天"字', options: ['一', '二', '大', '人'], answer: '一', audio: '天,横字头' },
|
||
{ question: '请选择正确的偏旁部首组成"地"字', options: ['土', '氵', '木', '口'], answer: '土', audio: '地,提土旁' },
|
||
{ question: '请选择正确的偏旁部首组成"人"字', options: ['人', '亻', '口', '木'], answer: '人', audio: '人,人字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"金"字', options: ['金', '钅', '木', '氵'], answer: '金', audio: '金,金字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"木"字', options: ['木', '氵', '艹', '口'], answer: '木', audio: '木,木字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"水"字', options: ['水', '氵', '木', '艹'], answer: '水', audio: '水,水字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"火"字', options: ['火', '氵', '木', '艹'], answer: '火', audio: '火,火字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"土"字', options: ['土', '氵', '木', '艹'], answer: '土', audio: '土,提土旁' },
|
||
{ question: '请选择正确的偏旁部首组成"口"字', options: ['口', '氵', '木', '艹'], answer: '口', audio: '口,口字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"耳"字', options: ['耳', '氵', '木', '艹'], answer: '耳', audio: '耳,耳字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"目"字', options: ['目', '氵', '木', '艹'], answer: '目', audio: '目,目字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"手"字', options: ['手', '扌', '氵', '木'], answer: '手', audio: '手,手字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"足"字', options: ['足', '⻊', '氵', '木'], answer: '足', audio: '足,足字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"日"字', options: ['日', '氵', '木', '艹'], answer: '日', audio: '日,日字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"月"字', options: ['月', '氵', '木', '艹'], answer: '月', audio: '月,月字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"山"字', options: ['山', '氵', '木', '艹'], answer: '山', audio: '山,山字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"川"字', options: ['川', '氵', '木', '艹'], answer: '川', audio: '川,川字旁' },
|
||
// 新添加题目 - 第六单元·识字
|
||
{ question: '请选择正确的偏旁部首组成"对"字', options: ['又', '氵', '木', '艹'], answer: '又', audio: '对,又字旁' },
|
||
{ question: '请选择正确的偏旁部首组成"书"字', options: ['乛', '氵', '木', '艹'], answer: '乛', audio: '书,折文旁' },
|
||
{ question: '请选择正确的偏旁部首组成"包"字', options: ['勹', '氵', '木', '艹'], answer: '勹', audio: '包,包字头' },
|
||
{ question: '请选择正确的偏旁部首组成"升"字', options: ['丿', '氵', '木', '艹'], answer: '丿', audio: '升,撇字头' },
|
||
{ question: '请选择正确的偏旁部首组成"国"字', options: ['囗', '氵', '木', '艹'], answer: '囗', audio: '国,口字框' },
|
||
{ question: '请选择正确的偏旁部首组成"旗"字', options: ['方', '氵', '木', '艹'], answer: '方', audio: '旗,方字旁' }
|
||
].sort(() => Math.random() - 0.5), // 随机打乱顺序
|
||
// 拼音练习 - 声母、韵母
|
||
pinyin: [
|
||
// 原有题目
|
||
{ question: '请选择正确的声母:"b"的读音是?', options: ['玻', '波', '博', '伯'], answer: '玻', audio: '波波的波' },
|
||
{ question: '请选择正确的韵母:"a"的读音是?', options: ['啊', '阿', '奥', '安'], answer: '啊', audio: '阿阿姨的啊' },
|
||
{ question: '请选择正确的声母:"p"的读音是?', options: ['坡', '破', '泊', '魄'], answer: '坡', audio: '坡皮的坡' },
|
||
{ question: '请选择正确的韵母:"o"的读音是?', options: ['哦', '喔', '欧', '偶'], answer: '哦', audio: '哦哦的哦' },
|
||
{ question: '请选择正确的声母:"m"的读音是?', options: ['摸', '摩', '魔', '莫'], answer: '摸', audio: '摸摸的摸' },
|
||
{ question: '请选择正确的韵母:"e"的读音是?', options: ['额', '鹅', '鄂', '俄'], answer: '额', audio: '额头的额' },
|
||
{ question: '请选择正确的声母:"f"的读音是?', options: ['佛', '否', '弗', '福'], answer: '佛', audio: '佛陀的佛' },
|
||
{ question: '请选择正确的韵母:"i"的读音是?', options: ['衣', '医', '伊', '依'], answer: '衣', audio: '衣服的衣' },
|
||
{ question: '请选择正确的声母:"d"的读音是?', options: ['得', '德', '地', '弟'], answer: '得', audio: '得得的得' },
|
||
{ question: '请选择正确的韵母:"u"的读音是?', options: ['乌', '无', '五', '屋'], answer: '乌', audio: '乌鸦的乌' },
|
||
{ question: '请选择正确的声母:"t"的读音是?', options: ['特', '忒', '替', '梯'], answer: '特', audio: '特别的特' },
|
||
{ question: '请选择正确的韵母:"ü"的读音是?', options: ['迂', '鱼', '雨', '玉'], answer: '迂', audio: '迂回的迂' },
|
||
{ question: '请选择正确的声母:"n"的读音是?', options: ['讷', '那', '拿', '内'], answer: '讷', audio: '讷讷的讷' },
|
||
{ question: '请选择正确的声母:"l"的读音是?', options: ['勒', '乐', '拉', '来'], answer: '勒', audio: '勒紧的勒' },
|
||
{ question: '请选择正确的声母:"g"的读音是?', options: ['哥', '个', '格', '各'], answer: '哥', audio: '哥哥的哥' },
|
||
{ question: '请选择正确的声母:"k"的读音是?', options: ['科', '可', '课', '客'], answer: '科', audio: '科学的科' },
|
||
{ question: '请选择正确的声母:"h"的读音是?', options: ['喝', '合', '河', '和'], answer: '喝', audio: '喝水的喝' },
|
||
{ question: '请选择正确的声母:"j"的读音是?', options: ['基', '机', '鸡', '积'], answer: '基', audio: '基础的基' },
|
||
{ question: '请选择正确的声母:"q"的读音是?', options: ['欺', '七', '期', '起'], answer: '欺', audio: '欺负的欺' },
|
||
{ question: '请选择正确的声母:"x"的读音是?', options: ['西', '希', '习', '喜'], answer: '西', audio: '东西的西' },
|
||
// 新添加题目 - 第二单元·汉语拼音
|
||
{ question: '请选择正确的单韵母:"a"的读音是?', options: ['啊', '阿', '奥', '安'], answer: '啊', audio: '阿阿姨的啊' },
|
||
{ question: '请选择正确的单韵母:"o"的读音是?', options: ['哦', '喔', '欧', '偶'], answer: '哦', audio: '哦哦的哦' },
|
||
{ question: '请选择正确的单韵母:"e"的读音是?', options: ['额', '鹅', '鄂', '俄'], answer: '额', audio: '额头的额' },
|
||
{ question: '请选择正确的单韵母:"i"的读音是?', options: ['衣', '医', '伊', '依'], answer: '衣', audio: '衣服的衣' },
|
||
{ question: '请选择正确的单韵母:"u"的读音是?', options: ['乌', '无', '五', '屋'], answer: '乌', audio: '乌鸦的乌' },
|
||
{ question: '请选择正确的单韵母:"ü"的读音是?', options: ['迂', '鱼', '雨', '玉'], answer: '迂', audio: '迂回的迂' },
|
||
{ question: '请选择正确的声母:"b"的读音是?', options: ['玻', '波', '博', '伯'], answer: '玻', audio: '波波的波' },
|
||
{ question: '请选择正确的声母:"p"的读音是?', options: ['坡', '破', '泊', '魄'], answer: '坡', audio: '坡皮的坡' },
|
||
{ question: '请选择正确的声母:"m"的读音是?', options: ['摸', '摩', '魔', '莫'], answer: '摸', audio: '摸摸的摸' },
|
||
{ question: '请选择正确的声母:"f"的读音是?', options: ['佛', '否', '弗', '福'], answer: '佛', audio: '佛陀的佛' },
|
||
{ question: '请选择正确的声母:"d"的读音是?', options: ['得', '德', '地', '弟'], answer: '得', audio: '得得的得' },
|
||
{ question: '请选择正确的声母:"t"的读音是?', options: ['特', '忒', '替', '梯'], answer: '特', audio: '特别的特' },
|
||
{ question: '请选择正确的声母:"n"的读音是?', options: ['讷', '那', '拿', '内'], answer: '讷', audio: '讷讷的讷' },
|
||
{ question: '请选择正确的声母:"l"的读音是?', options: ['勒', '乐', '拉', '来'], answer: '勒', audio: '勒紧的勒' },
|
||
// 新添加题目 - 第三单元·汉语拼音
|
||
{ question: '请选择正确的声母:"g"的读音是?', options: ['哥', '个', '格', '各'], answer: '哥', audio: '哥哥的哥' },
|
||
{ question: '请选择正确的声母:"k"的读音是?', options: ['科', '可', '课', '客'], answer: '科', audio: '科学的科' },
|
||
{ question: '请选择正确的声母:"h"的读音是?', options: ['喝', '合', '河', '和'], answer: '喝', audio: '喝水的喝' },
|
||
{ question: '请选择正确的声母:"j"的读音是?', options: ['基', '机', '鸡', '积'], answer: '基', audio: '基础的基' },
|
||
{ question: '请选择正确的声母:"q"的读音是?', options: ['欺', '七', '期', '起'], answer: '欺', audio: '欺负的欺' },
|
||
{ question: '请选择正确的声母:"x"的读音是?', options: ['西', '希', '习', '喜'], answer: '西', audio: '东西的西' },
|
||
{ question: '请选择正确的声母:"z"的读音是?', options: ['资', '子', '字', '自'], answer: '资', audio: '资金的资' },
|
||
{ question: '请选择正确的声母:"c"的读音是?', options: ['刺', '次', '词', '此'], answer: '刺', audio: '刺猬的刺' },
|
||
{ question: '请选择正确的声母:"s"的读音是?', options: ['思', '丝', '死', '四'], answer: '思', audio: '思考的思' },
|
||
{ question: '请选择正确的声母:"zh"的读音是?', options: ['知', '之', '至', '治'], answer: '知', audio: '知道的知' },
|
||
{ question: '请选择正确的声母:"ch"的读音是?', options: ['吃', '尺', '池', '赤'], answer: '吃', audio: '吃饭的吃' },
|
||
{ question: '请选择正确的声母:"sh"的读音是?', options: ['师', '诗', '时', '市'], answer: '师', audio: '老师的师' },
|
||
{ question: '请选择正确的声母:"r"的读音是?', options: ['日', '入', '如', '肉'], answer: '日', audio: '日子的日' },
|
||
{ question: '请选择正确的声母:"y"的读音是?', options: ['衣', '医', '依', '一'], answer: '衣', audio: '衣服的衣' },
|
||
{ question: '请选择正确的声母:"w"的读音是?', options: ['乌', '无', '五', '吴'], answer: '乌', audio: '乌鸦的乌' },
|
||
// 新添加题目 - 第四单元·汉语拼音
|
||
{ question: '请选择正确的复韵母:"ai"的读音是?', options: ['爱', '矮', '埃', '碍'], answer: '爱', audio: '爱情的爱' },
|
||
{ question: '请选择正确的复韵母:"ei"的读音是?', options: ['诶', '黑', '备', '贝'], answer: '诶', audio: '诶呀的诶' },
|
||
{ question: '请选择正确的复韵母:"ui"的读音是?', options: ['威', '微', '伟', '围'], answer: '威', audio: '威力的威' },
|
||
{ question: '请选择正确的复韵母:"ao"的读音是?', options: ['凹', '熬', '袄', '傲'], answer: '凹', audio: '凹凸的凹' },
|
||
{ question: '请选择正确的复韵母:"ou"的读音是?', options: ['欧', '偶', '呕', '藕'], answer: '欧', audio: '欧洲的欧' },
|
||
{ question: '请选择正确的复韵母:"iu"的读音是?', options: ['优', '游', '友', '有'], answer: '优', audio: '优秀的优' },
|
||
{ question: '请选择正确的复韵母:"ie"的读音是?', options: ['耶', '叶', '夜', '业'], answer: '耶', audio: '耶稣的耶' },
|
||
{ question: '请选择正确的复韵母:"üe"的读音是?', options: ['约', '月', '越', '悦'], answer: '约', audio: '约会的约' },
|
||
{ question: '请选择正确的复韵母:"er"的读音是?', options: ['儿', '而', '耳', '尔'], answer: '儿', audio: '儿子的儿' },
|
||
{ question: '请选择正确的鼻韵母:"an"的读音是?', options: ['安', '按', '暗', '岸'], answer: '安', audio: '安全的安' },
|
||
{ question: '请选择正确的鼻韵母:"en"的读音是?', options: ['恩', '摁', '嗯', '蒽'], answer: '恩', audio: '恩情的恩' },
|
||
{ question: '请选择正确的鼻韵母:"in"的读音是?', options: ['因', '引', '印', '阴'], answer: '因', audio: '因为的因' },
|
||
{ question: '请选择正确的鼻韵母:"un"的读音是?', options: ['温', '文', '稳', '问'], answer: '温', audio: '温暖的温' },
|
||
{ question: '请选择正确的鼻韵母:"ün"的读音是?', options: ['晕', '云', '允', '运'], answer: '晕', audio: '晕车的晕' },
|
||
{ question: '请选择正确的鼻韵母:"ang"的读音是?', options: ['昂', '肮', '盎', '仰'], answer: '昂', audio: '昂首挺胸的昂' },
|
||
{ question: '请选择正确的鼻韵母:"eng"的读音是?', options: ['鞥', '恒', '哼', '横'], answer: '鞥', audio: '鞥的发音' },
|
||
{ question: '请选择正确的鼻韵母:"ing"的读音是?', options: ['英', '影', '硬', '应'], answer: '英', audio: '英雄的英' },
|
||
{ question: '请选择正确的鼻韵母:"ong"的读音是?', options: ['嗡', '翁', '瓮', '蓊'], answer: '嗡', audio: '嗡嗡的嗡' }
|
||
].sort(() => Math.random() - 0.5), // 随机打乱顺序
|
||
// 词语认读 - 一年级常用词语
|
||
words: [
|
||
// 原有题目
|
||
{ question: '请选择正确的词语:"天上飞的是什么?"', options: ['小鸟', '小牛', '小鱼', '小马'], answer: '小鸟', audio: '小鸟在天空飞翔' },
|
||
{ question: '请选择正确的词语:"水里游的是什么?"', options: ['小鱼', '小猫', '小鸡', '小兔'], answer: '小鱼', audio: '小鱼在水里游来游去' },
|
||
{ question: '请选择正确的词语:"我们住在什么里面?"', options: ['房子', '车子', '盒子', '桌子'], answer: '房子', audio: '我们住在房子里' },
|
||
{ question: '请选择正确的词语:"我们坐在什么上吃饭?"', options: ['椅子', '桌子', '床', '门'], answer: '桌子', audio: '我们坐在桌子旁吃饭' },
|
||
{ question: '请选择正确的词语:"我们用什么读书?"', options: ['书本', '铅笔', '橡皮', '尺子'], answer: '书本', audio: '我们用书本读书学习' },
|
||
{ question: '请选择正确的词语:"我们用什么东西写字?"', options: ['铅笔', '书本', '橡皮', '桌子'], answer: '铅笔', audio: '我们用铅笔写字' },
|
||
{ question: '请选择正确的词语:"太阳出来会怎么样?"', options: ['天亮了', '天黑了', '下雨了', '下雪了'], answer: '天亮了', audio: '太阳出来了,天亮了' },
|
||
{ question: '请选择正确的词语:"月亮出来是什么时候?"', options: ['晚上', '早上', '中午', '下午'], answer: '晚上', audio: '月亮出来了,是晚上' },
|
||
{ question: '请选择正确的词语:"下雨的时候需要什么?"', options: ['雨伞', '太阳帽', '扇子', '墨镜'], answer: '雨伞', audio: '下雨的时候需要打伞' },
|
||
{ question: '请选择正确的词语:"冬天很冷需要穿什么?"', options: ['棉袄', '短袖', '短裤', '凉鞋'], answer: '棉袄', audio: '冬天很冷,要穿棉袄' },
|
||
{ question: '请选择正确的词语:"夏天很热需要穿什么?"', options: ['短袖', '棉袄', '羽绒服', '毛衣'], answer: '短袖', audio: '夏天很热,要穿短袖' },
|
||
{ question: '请选择正确的词语:"我们用什么东西擦嘴?"', options: ['纸巾', '毛巾', '布', '手'], answer: '纸巾', audio: '我们用纸巾擦嘴' },
|
||
{ question: '请选择正确的词语:"我们用什么东西洗脸?"', options: ['毛巾', '纸巾', '布', '手'], answer: '毛巾', audio: '我们用毛巾洗脸' },
|
||
{ question: '请选择正确的词语:"我们什么时候吃早餐?"', options: ['早上', '中午', '晚上', '深夜'], answer: '早上', audio: '早上吃早餐' },
|
||
{ question: '请选择正确的词语:"我们什么时候吃午餐?"', options: ['中午', '早上', '晚上', '深夜'], answer: '中午', audio: '中午吃午餐' },
|
||
{ question: '请选择正确的词语:"我们什么时候吃晚餐?"', options: ['晚上', '早上', '中午', '深夜'], answer: '晚上', audio: '晚上吃晚餐' },
|
||
{ question: '请选择正确的词语:"眼睛是用来做什么的?"', options: ['看书', '吃饭', '听歌', '走路'], answer: '看书', audio: '眼睛用来看书' },
|
||
{ question: '请选择正确的词语:"耳朵是用来做什么的?"', options: ['听声音', '看书', '吃饭', '闻味道'], answer: '听声音', audio: '耳朵用来听声音' },
|
||
{ question: '请选择正确的词语:"鼻子是用来做什么的?"', options: ['闻味道', '看书', '听歌', '走路'], answer: '闻味道', audio: '鼻子用来闻味道' },
|
||
{ question: '请选择正确的词语:"嘴巴是用来做什么的?"', options: ['吃饭', '看书', '听歌', '闻味道'], answer: '吃饭', audio: '嘴巴用来吃饭' },
|
||
// 新添加题目 - 第一单元·识字
|
||
{ question: '请选择正确的词语:"天地人"中的第一个字是?', options: ['天', '地', '人', '山'], answer: '天', audio: '天地人,天是第一个字' },
|
||
{ question: '请选择正确的词语:"金木水火土"中的第五个字是?', options: ['金', '木', '水', '土'], answer: '土', audio: '金木水火土,土是第五个字' },
|
||
{ question: '请选择正确的词语:"口耳目手足"中的第三个字是?', options: ['口', '耳', '目', '手'], answer: '目', audio: '口耳目手足,目是第三个字' },
|
||
{ question: '请选择正确的词语:"日月山川"中的第二个字是?', options: ['日', '月', '山', '川'], answer: '月', audio: '日月山川,月是第二个字' },
|
||
// 新添加题目 - 第五单元·阅读
|
||
{ question: '请选择正确的词语:"秋天"的天气怎么样?', options: ['炎热', '寒冷', '凉爽', '温暖'], answer: '凉爽', audio: '秋天的天气凉爽' },
|
||
{ question: '请选择正确的词语:"江南"是指哪里?', options: ['长江以南', '黄河以南', '珠江以南', '黑龙江以南'], answer: '长江以南', audio: '江南指长江以南的地区' },
|
||
{ question: '请选择正确的词语:"雪地里的小画家"中,谁画竹叶?', options: ['小鸡', '小狗', '小鸭', '小马'], answer: '小鸡', audio: '小鸡画竹叶' },
|
||
{ question: '请选择正确的词语:"四季"包括哪四个季节?', options: ['春夏秋冬', '春夏秋', '冬春夏', '春秋冬'], answer: '春夏秋冬', audio: '四季包括春夏秋冬' },
|
||
// 新添加题目 - 第六单元·识字
|
||
{ question: '请选择正确的词语:"对韵歌"中的"云对雨",下一句是?', options: ['雪对风', '花对树', '鸟对虫', '山对水'], answer: '雪对风', audio: '云对雨,雪对风' },
|
||
{ question: '请选择正确的词语:"日月明"中,"日月"组成什么字?', options: ['明', '日', '月', '亮'], answer: '明', audio: '日月明' },
|
||
{ question: '请选择正确的词语:"小书包"里有什么?', options: ['书本', '玩具', '零食', '手机'], answer: '书本', audio: '小书包里有书本' },
|
||
{ question: '请选择正确的词语:"升国旗"时我们要怎么样?', options: ['敬礼', '说话', '玩耍', '睡觉'], answer: '敬礼', audio: '升国旗时我们要敬礼' },
|
||
// 新添加题目 - 第七单元·阅读
|
||
{ question: '请选择正确的词语:"小小的船"指的是什么?', options: ['月亮', '太阳', '星星', '飞机'], answer: '月亮', audio: '小小的船指的是月亮' },
|
||
{ question: '请选择正确的词语:"影子"常常跟着谁?', options: ['我', '你', '他', '她'], answer: '我', audio: '影子常常跟着我' },
|
||
{ question: '请选择正确的词语:"两件宝"指的是?', options: ['双手和大脑', '眼睛和耳朵', '鼻子和嘴巴', '脚和手'], answer: '双手和大脑', audio: '两件宝指的是双手和大脑' },
|
||
// 新添加题目 - 第八单元·阅读
|
||
{ question: '请选择正确的词语:"比尾巴"中,谁的尾巴长?', options: ['猴子', '兔子', '松鼠', '公鸡'], answer: '猴子', audio: '猴子的尾巴长' },
|
||
{ question: '请选择正确的词语:"乌鸦喝水"中,乌鸦用什么方法喝到水?', options: ['放石子', '用吸管', '用翅膀', '找朋友'], answer: '放石子', audio: '乌鸦用放石子的方法喝到水' },
|
||
{ question: '请选择正确的词语:"雨点儿"从哪里来?', options: ['云里', '地上', '树上', '海里'], answer: '云里', audio: '雨点儿从云里来' },
|
||
// 新添加题目 - 下册内容
|
||
{ question: '请选择正确的词语:"春夏秋冬"中,哪个是第一个季节?', options: ['春', '夏', '秋', '冬'], answer: '春', audio: '春夏秋冬,春是第一个季节' },
|
||
{ question: '请选择正确的词语:"姓氏歌"中,"赵钱孙李"的第一个姓是?', options: ['赵', '钱', '孙', '李'], answer: '赵', audio: '赵钱孙李,赵是第一个姓' },
|
||
{ question: '请选择正确的词语:"小青蛙"是益虫还是害虫?', options: ['益虫', '害虫', '既是益虫又是害虫', '既不是益虫也不是害虫'], answer: '益虫', audio: '小青蛙是益虫' },
|
||
{ question: '请选择正确的词语:"猜字谜"中,"一口咬掉牛尾巴"是什么字?', options: ['告', '牛', '口', '尾'], answer: '告', audio: '一口咬掉牛尾巴是告字' },
|
||
{ question: '请选择正确的词语:"静夜思"的作者是谁?', options: ['李白', '杜甫', '白居易', '王维'], answer: '李白', audio: '静夜思的作者是李白' },
|
||
{ question: '请选择正确的词语:"夜色"中,"我"一开始害怕什么?', options: ['黑夜', '白天', '下雨', '打雷'], answer: '黑夜', audio: '我一开始害怕黑夜' },
|
||
{ question: '请选择正确的词语:"小壁虎借尾巴"中,小壁虎向谁借尾巴?', options: ['小鱼、老牛、燕子', '小猫、小狗、小鸡', '小鸟、小兔、小熊', '青蛙、乌龟、蛇'], answer: '小鱼、老牛、燕子', audio: '小壁虎向小鱼、老牛、燕子借尾巴' }
|
||
].sort(() => Math.random() - 0.5) // 随机打乱顺序
|
||
},
|
||
english: {
|
||
// 字母迷宫任务(字母认知)
|
||
maze: [
|
||
{
|
||
question: '哪个字母是 A?',
|
||
options: ['B', 'A', 'C', 'D'],
|
||
answer: 'A',
|
||
audio: 'A'
|
||
},
|
||
{
|
||
question: '哪个字母是 B?',
|
||
options: ['A', 'B', 'C', 'D'],
|
||
answer: 'B',
|
||
audio: 'B'
|
||
},
|
||
{
|
||
question: '哪个字母是 C?',
|
||
options: ['A', 'B', 'C', 'D'],
|
||
answer: 'C',
|
||
audio: 'C'
|
||
},
|
||
{
|
||
question: '哪个字母是 D?',
|
||
options: ['A', 'B', 'C', 'D'],
|
||
answer: 'D',
|
||
audio: 'D'
|
||
},
|
||
{
|
||
question: '哪个字母是 E?',
|
||
options: ['E', 'F', 'G', 'H'],
|
||
answer: 'E',
|
||
audio: 'E'
|
||
},
|
||
{
|
||
question: '哪个字母是 F?',
|
||
options: ['E', 'F', 'G', 'H'],
|
||
answer: 'F',
|
||
audio: 'F'
|
||
},
|
||
{
|
||
question: '哪个字母是 G?',
|
||
options: ['E', 'F', 'G', 'H'],
|
||
answer: 'G',
|
||
audio: 'G'
|
||
},
|
||
{
|
||
question: '哪个字母是 H?',
|
||
options: ['E', 'F', 'G', 'H'],
|
||
answer: 'H',
|
||
audio: 'H'
|
||
},
|
||
{
|
||
question: '哪个字母是 I?',
|
||
options: ['I', 'J', 'K', 'L'],
|
||
answer: 'I',
|
||
audio: 'I'
|
||
},
|
||
{
|
||
question: '哪个字母是 J?',
|
||
options: ['I', 'J', 'K', 'L'],
|
||
answer: 'J',
|
||
audio: 'J'
|
||
},
|
||
{
|
||
question: '哪个字母是 K?',
|
||
options: ['I', 'J', 'K', 'L'],
|
||
answer: 'K',
|
||
audio: 'K'
|
||
},
|
||
{
|
||
question: '哪个字母是 L?',
|
||
options: ['I', 'J', 'K', 'L'],
|
||
answer: 'L',
|
||
audio: 'L'
|
||
},
|
||
{
|
||
question: '哪个字母是 M?',
|
||
options: ['M', 'N', 'O', 'P'],
|
||
answer: 'M',
|
||
audio: 'M'
|
||
},
|
||
{
|
||
question: '哪个字母是 N?',
|
||
options: ['M', 'N', 'O', 'P'],
|
||
answer: 'N',
|
||
audio: 'N'
|
||
},
|
||
{
|
||
question: '哪个字母是 O?',
|
||
options: ['M', 'N', 'O', 'P'],
|
||
answer: 'O',
|
||
audio: 'O'
|
||
},
|
||
{
|
||
question: '哪个字母是 P?',
|
||
options: ['M', 'N', 'O', 'P'],
|
||
answer: 'P',
|
||
audio: 'P'
|
||
},
|
||
{
|
||
question: '哪个字母是 Q?',
|
||
options: ['Q', 'R', 'S', 'T'],
|
||
answer: 'Q',
|
||
audio: 'Q'
|
||
},
|
||
{
|
||
question: '哪个字母是 R?',
|
||
options: ['Q', 'R', 'S', 'T'],
|
||
answer: 'R',
|
||
audio: 'R'
|
||
},
|
||
{
|
||
question: '哪个字母是 S?',
|
||
options: ['Q', 'R', 'S', 'T'],
|
||
answer: 'S',
|
||
audio: 'S'
|
||
},
|
||
{
|
||
question: '哪个字母是 T?',
|
||
options: ['Q', 'R', 'S', 'T'],
|
||
answer: 'T',
|
||
audio: 'T'
|
||
}
|
||
],
|
||
// 动物喂食任务(跟读单词)
|
||
animal: [
|
||
{
|
||
question: '哪个是猫的英文?',
|
||
options: ['dog', 'cat', 'bird', 'fish'],
|
||
answer: 'cat',
|
||
audio: 'cat'
|
||
},
|
||
{
|
||
question: '哪个是狗的英文?',
|
||
options: ['cat', 'dog', 'bird', 'fish'],
|
||
answer: 'dog',
|
||
audio: 'dog'
|
||
},
|
||
{
|
||
question: '哪个是鸟的英文?',
|
||
options: ['cat', 'dog', 'bird', 'fish'],
|
||
answer: 'bird',
|
||
audio: 'bird'
|
||
},
|
||
{
|
||
question: '哪个是鱼的英文?',
|
||
options: ['cat', 'dog', 'bird', 'fish'],
|
||
answer: 'fish',
|
||
audio: 'fish'
|
||
},
|
||
{
|
||
question: '哪个是老虎的英文?',
|
||
options: ['tiger', 'lion', 'elephant', 'monkey'],
|
||
answer: 'tiger',
|
||
audio: 'tiger'
|
||
},
|
||
{
|
||
question: '哪个是狮子的英文?',
|
||
options: ['tiger', 'lion', 'elephant', 'monkey'],
|
||
answer: 'lion',
|
||
audio: 'lion'
|
||
},
|
||
{
|
||
question: '哪个是大象的英文?',
|
||
options: ['tiger', 'lion', 'elephant', 'monkey'],
|
||
answer: 'elephant',
|
||
audio: 'elephant'
|
||
},
|
||
{
|
||
question: '哪个是猴子的英文?',
|
||
options: ['tiger', 'lion', 'elephant', 'monkey'],
|
||
answer: 'monkey',
|
||
audio: 'monkey'
|
||
},
|
||
{
|
||
question: '哪个是兔子的英文?',
|
||
options: ['rabbit', 'fox', 'wolf', 'bear'],
|
||
answer: 'rabbit',
|
||
audio: 'rabbit'
|
||
},
|
||
{
|
||
question: '哪个是狐狸的英文?',
|
||
options: ['rabbit', 'fox', 'wolf', 'bear'],
|
||
answer: 'fox',
|
||
audio: 'fox'
|
||
},
|
||
{
|
||
question: '哪个是狼的英文?',
|
||
options: ['rabbit', 'fox', 'wolf', 'bear'],
|
||
answer: 'wolf',
|
||
audio: 'wolf'
|
||
},
|
||
{
|
||
question: '哪个是熊的英文?',
|
||
options: ['rabbit', 'fox', 'wolf', 'bear'],
|
||
answer: 'bear',
|
||
audio: 'bear'
|
||
},
|
||
{
|
||
question: '哪个是鸭子的英文?',
|
||
options: ['duck', 'chicken', 'pig', 'cow'],
|
||
answer: 'duck',
|
||
audio: 'duck'
|
||
},
|
||
{
|
||
question: '哪个是鸡的英文?',
|
||
options: ['duck', 'chicken', 'pig', 'cow'],
|
||
answer: 'chicken',
|
||
audio: 'chicken'
|
||
},
|
||
{
|
||
question: '哪个是猪的英文?',
|
||
options: ['duck', 'chicken', 'pig', 'cow'],
|
||
answer: 'pig',
|
||
audio: 'pig'
|
||
},
|
||
{
|
||
question: '哪个是牛的英文?',
|
||
options: ['duck', 'chicken', 'pig', 'cow'],
|
||
answer: 'cow',
|
||
audio: 'cow'
|
||
},
|
||
{
|
||
question: '哪个是羊的英文?',
|
||
options: ['sheep', 'goat', 'horse', 'mouse'],
|
||
answer: 'sheep',
|
||
audio: 'sheep'
|
||
},
|
||
{
|
||
question: '哪个是山羊的英文?',
|
||
options: ['sheep', 'goat', 'horse', 'mouse'],
|
||
answer: 'goat',
|
||
audio: 'goat'
|
||
},
|
||
{
|
||
question: '哪个是马的英文?',
|
||
options: ['sheep', 'goat', 'horse', 'mouse'],
|
||
answer: 'horse',
|
||
audio: 'horse'
|
||
},
|
||
{
|
||
question: '哪个是老鼠的英文?',
|
||
options: ['sheep', 'goat', 'horse', 'mouse'],
|
||
answer: 'mouse',
|
||
audio: 'mouse'
|
||
}
|
||
],
|
||
// 情景对话任务(对话练习)
|
||
dialogue: [
|
||
{
|
||
question: 'Hello 的意思是?',
|
||
options: ['再见', '你好', '谢谢', '对不起'],
|
||
answer: '你好',
|
||
audio: 'Hello'
|
||
},
|
||
{
|
||
question: 'Goodbye 的意思是?',
|
||
options: ['你好', '再见', '谢谢', '对不起'],
|
||
answer: '再见',
|
||
audio: 'Goodbye'
|
||
},
|
||
{
|
||
question: 'Thank you 的意思是?',
|
||
options: ['你好', '再见', '谢谢', '对不起'],
|
||
answer: '谢谢',
|
||
audio: 'Thank you'
|
||
},
|
||
{
|
||
question: 'Sorry 的意思是?',
|
||
options: ['你好', '再见', '谢谢', '对不起'],
|
||
answer: '对不起',
|
||
audio: 'Sorry'
|
||
},
|
||
{
|
||
question: 'How are you? 的意思是?',
|
||
options: ['你好吗?', '再见', '谢谢', '对不起'],
|
||
answer: '你好吗?',
|
||
audio: 'How are you?'
|
||
},
|
||
// Unit 1: Pets 相关题目
|
||
{
|
||
question: 'Which pet says "woof woof"?',
|
||
options: ['cat', 'dog', 'bird', 'fish'],
|
||
answer: 'dog',
|
||
audio: 'dog'
|
||
},
|
||
{
|
||
question: 'Which pet says "meow meow"?',
|
||
options: ['cat', 'dog', 'bird', 'fish'],
|
||
answer: 'cat',
|
||
audio: 'cat'
|
||
},
|
||
{
|
||
question: 'Which pet can fly?',
|
||
options: ['cat', 'dog', 'bird', 'fish'],
|
||
answer: 'bird',
|
||
audio: 'bird'
|
||
},
|
||
{
|
||
question: 'Which pet lives in water?',
|
||
options: ['cat', 'dog', 'bird', 'fish'],
|
||
answer: 'fish',
|
||
audio: 'fish'
|
||
},
|
||
{
|
||
question: 'Which pet has long ears?',
|
||
options: ['cat', 'dog', 'rabbit', 'fish'],
|
||
answer: 'rabbit',
|
||
audio: 'rabbit'
|
||
},
|
||
// Unit 2: Animals 相关题目
|
||
{
|
||
question: 'Which animal is big and has a trunk?',
|
||
options: ['tiger', 'elephant', 'monkey', 'lion'],
|
||
answer: 'elephant',
|
||
audio: 'elephant'
|
||
},
|
||
{
|
||
question: 'Which animal is the king of the forest?',
|
||
options: ['tiger', 'elephant', 'monkey', 'lion'],
|
||
answer: 'lion',
|
||
audio: 'lion'
|
||
},
|
||
{
|
||
question: 'Which animal has stripes?',
|
||
options: ['tiger', 'elephant', 'monkey', 'lion'],
|
||
answer: 'tiger',
|
||
audio: 'tiger'
|
||
},
|
||
{
|
||
question: 'Which animal likes bananas?',
|
||
options: ['tiger', 'elephant', 'monkey', 'lion'],
|
||
answer: 'monkey',
|
||
audio: 'monkey'
|
||
},
|
||
{
|
||
question: 'Which animal can swim?',
|
||
options: ['tiger', 'fish', 'bird', 'cat'],
|
||
answer: 'fish',
|
||
audio: 'fish'
|
||
},
|
||
// Unit 3: Face 相关题目
|
||
{
|
||
question: 'Which part of the face do we use to see?',
|
||
options: ['nose', 'eyes', 'mouth', 'ears'],
|
||
answer: 'eyes',
|
||
audio: 'eyes'
|
||
},
|
||
{
|
||
question: 'Which part of the face do we use to hear?',
|
||
options: ['nose', 'eyes', 'mouth', 'ears'],
|
||
answer: 'ears',
|
||
audio: 'ears'
|
||
},
|
||
{
|
||
question: 'Which part of the face do we use to smell?',
|
||
options: ['nose', 'eyes', 'mouth', 'ears'],
|
||
answer: 'nose',
|
||
audio: 'nose'
|
||
},
|
||
{
|
||
question: 'Which part of the face do we use to eat?',
|
||
options: ['nose', 'eyes', 'mouth', 'ears'],
|
||
answer: 'mouth',
|
||
audio: 'mouth'
|
||
},
|
||
{
|
||
question: 'Which part of the face is above the mouth?',
|
||
options: ['nose', 'eyes', 'ears', 'hair'],
|
||
answer: 'nose',
|
||
audio: 'nose'
|
||
},
|
||
// Unit 4: Body 相关题目
|
||
{
|
||
question: 'Which body part do we use to walk?',
|
||
options: ['hands', 'feet', 'eyes', 'ears'],
|
||
answer: 'feet',
|
||
audio: 'feet'
|
||
},
|
||
{
|
||
question: 'Which body part do we use to write?',
|
||
options: ['hands', 'feet', 'eyes', 'ears'],
|
||
answer: 'hands',
|
||
audio: 'hands'
|
||
},
|
||
{
|
||
question: 'Which body part is in the middle of our body?',
|
||
options: ['head', 'body', 'legs', 'arms'],
|
||
answer: 'body',
|
||
audio: 'body'
|
||
},
|
||
{
|
||
question: 'Which body part is on top of our body?',
|
||
options: ['head', 'body', 'legs', 'arms'],
|
||
answer: 'head',
|
||
audio: 'head'
|
||
},
|
||
{
|
||
question: 'Which body parts do we use to hug?',
|
||
options: ['hands', 'arms', 'legs', 'feet'],
|
||
answer: 'arms',
|
||
audio: 'arms'
|
||
},
|
||
// Unit 5: My home 相关题目
|
||
{
|
||
question: 'Where do we sleep?',
|
||
options: ['kitchen', 'bedroom', 'living room', 'bathroom'],
|
||
answer: 'bedroom',
|
||
audio: 'bedroom'
|
||
},
|
||
{
|
||
question: 'Where do we cook?',
|
||
options: ['kitchen', 'bedroom', 'living room', 'bathroom'],
|
||
answer: 'kitchen',
|
||
audio: 'kitchen'
|
||
},
|
||
{
|
||
question: 'Where do we watch TV?',
|
||
options: ['kitchen', 'bedroom', 'living room', 'bathroom'],
|
||
answer: 'living room',
|
||
audio: 'living room'
|
||
},
|
||
{
|
||
question: 'Where do we take a shower?',
|
||
options: ['kitchen', 'bedroom', 'living room', 'bathroom'],
|
||
answer: 'bathroom',
|
||
audio: 'bathroom'
|
||
},
|
||
{
|
||
question: 'What do we sit on?',
|
||
options: ['table', 'chair', 'bed', 'sofa'],
|
||
answer: 'chair',
|
||
audio: 'chair'
|
||
},
|
||
// Unit 6: Time 相关题目
|
||
{
|
||
question: 'What time is it when the sun rises?',
|
||
options: ['morning', 'afternoon', 'evening', 'night'],
|
||
answer: 'morning',
|
||
audio: 'morning'
|
||
},
|
||
{
|
||
question: 'What time is it when the sun is high in the sky?',
|
||
options: ['morning', 'afternoon', 'evening', 'night'],
|
||
answer: 'afternoon',
|
||
audio: 'afternoon'
|
||
},
|
||
{
|
||
question: 'What time is it when the sun sets?',
|
||
options: ['morning', 'afternoon', 'evening', 'night'],
|
||
answer: 'evening',
|
||
audio: 'evening'
|
||
},
|
||
{
|
||
question: 'What time is it when its dark outside?',
|
||
options: ['morning', 'afternoon', 'evening', 'night'],
|
||
answer: 'night',
|
||
audio: 'night'
|
||
},
|
||
{
|
||
question: 'When do we have breakfast?',
|
||
options: ['morning', 'afternoon', 'evening', 'night'],
|
||
answer: 'morning',
|
||
audio: 'morning'
|
||
},
|
||
// 更多对话练习题目
|
||
{
|
||
question: 'Nice to meet you 的意思是?',
|
||
options: ['你好', '再见', '很高兴认识你', '谢谢'],
|
||
answer: '很高兴认识你',
|
||
audio: 'Nice to meet you'
|
||
},
|
||
{
|
||
question: 'Whats your name? 的意思是?',
|
||
options: ['你好吗?', '你叫什么名字?', '再见', '谢谢'],
|
||
answer: '你叫什么名字?',
|
||
audio: 'What\'s your name?'
|
||
},
|
||
{
|
||
question: 'Im fine, thank you 的意思是?',
|
||
options: ['我很好,谢谢', '你好', '再见', '对不起'],
|
||
answer: '我很好,谢谢',
|
||
audio: 'I\'m fine, thank you'
|
||
},
|
||
{
|
||
question: 'Good morning 的意思是?',
|
||
options: ['早上好', '下午好', '晚上好', '晚安'],
|
||
answer: '早上好',
|
||
audio: 'Good morning'
|
||
},
|
||
{
|
||
question: 'Good afternoon 的意思是?',
|
||
options: ['早上好', '下午好', '晚上好', '晚安'],
|
||
answer: '下午好',
|
||
audio: 'Good afternoon'
|
||
},
|
||
{
|
||
question: 'Good evening 的意思是?',
|
||
options: ['早上好', '下午好', '晚上好', '晚安'],
|
||
answer: '晚上好',
|
||
audio: 'Good evening'
|
||
},
|
||
{
|
||
question: 'Good night 的意思是?',
|
||
options: ['早上好', '下午好', '晚上好', '晚安'],
|
||
answer: '晚安',
|
||
audio: 'Good night'
|
||
},
|
||
{
|
||
question: 'Yes 的意思是?',
|
||
options: ['是的', '不是', '谢谢', '对不起'],
|
||
answer: '是的',
|
||
audio: 'Yes'
|
||
},
|
||
{
|
||
question: 'No 的意思是?',
|
||
options: ['是的', '不是', '谢谢', '对不起'],
|
||
answer: '不是',
|
||
audio: 'No'
|
||
},
|
||
{
|
||
question: 'Please 的意思是?',
|
||
options: ['请', '谢谢', '对不起', '再见'],
|
||
answer: '请',
|
||
audio: 'Please'
|
||
},
|
||
{
|
||
question: 'I am fine 的意思是?',
|
||
options: ['我很好', '你好', '再见', '谢谢'],
|
||
answer: '我很好',
|
||
audio: 'I am fine'
|
||
},
|
||
{
|
||
question: 'What is your name? 的意思是?',
|
||
options: ['你叫什么名字?', '你好', '再见', '谢谢'],
|
||
answer: '你叫什么名字?',
|
||
audio: 'What is your name?'
|
||
},
|
||
{
|
||
question: 'My name is... 的意思是?',
|
||
options: ['我的名字是...', '你好', '再见', '谢谢'],
|
||
answer: '我的名字是...',
|
||
audio: 'My name is...'
|
||
},
|
||
{
|
||
question: 'Nice to meet you 的意思是?',
|
||
options: ['很高兴认识你', '你好', '再见', '谢谢'],
|
||
answer: '很高兴认识你',
|
||
audio: 'Nice to meet you'
|
||
},
|
||
{
|
||
question: 'Good morning 的意思是?',
|
||
options: ['早上好', '下午好', '晚上好', '再见'],
|
||
answer: '早上好',
|
||
audio: 'Good morning'
|
||
},
|
||
{
|
||
question: 'Good afternoon 的意思是?',
|
||
options: ['早上好', '下午好', '晚上好', '再见'],
|
||
answer: '下午好',
|
||
audio: 'Good afternoon'
|
||
},
|
||
{
|
||
question: 'Good evening 的意思是?',
|
||
options: ['早上好', '下午好', '晚上好', '再见'],
|
||
answer: '晚上好',
|
||
audio: 'Good evening'
|
||
},
|
||
{
|
||
question: 'Yes 的意思是?',
|
||
options: ['是的', '不是', '谢谢', '再见'],
|
||
answer: '是的',
|
||
audio: 'Yes'
|
||
},
|
||
{
|
||
question: 'No 的意思是?',
|
||
options: ['是的', '不是', '谢谢', '再见'],
|
||
answer: '不是',
|
||
audio: 'No'
|
||
},
|
||
{
|
||
question: 'Please 的意思是?',
|
||
options: ['请', '谢谢', '再见', '你好'],
|
||
answer: '请',
|
||
audio: 'Please'
|
||
},
|
||
{
|
||
question: 'Welcome 的意思是?',
|
||
options: ['欢迎', '谢谢', '再见', '你好'],
|
||
answer: '欢迎',
|
||
audio: 'Welcome'
|
||
},
|
||
{
|
||
question: 'Happy birthday 的意思是?',
|
||
options: ['生日快乐', '谢谢', '再见', '你好'],
|
||
answer: '生日快乐',
|
||
audio: 'Happy birthday'
|
||
},
|
||
{
|
||
question: 'See you later 的意思是?',
|
||
options: ['再见', '你好', '谢谢', '对不起'],
|
||
answer: '再见',
|
||
audio: 'See you later'
|
||
},
|
||
{
|
||
question: 'How old are you? 的意思是?',
|
||
options: ['你几岁了?', '你好', '再见', '谢谢'],
|
||
answer: '你几岁了?',
|
||
audio: 'How old are you?'
|
||
},
|
||
{
|
||
question: 'I am six years old 的意思是?',
|
||
options: ['我六岁了', '你好', '再见', '谢谢'],
|
||
answer: '我六岁了',
|
||
audio: 'I am six years old'
|
||
}
|
||
]
|
||
},
|
||
science: {
|
||
// 植物生长(生物)
|
||
plants: [
|
||
{
|
||
question: '植物生长需要什么?',
|
||
items: [
|
||
{ icon: '💧', name: '水', result: '植物吸收了水分,开始生长' },
|
||
{ icon: '☀️', name: '阳光', result: '植物进行光合作用,变得更绿了' },
|
||
{ icon: '🌱', name: '种子', result: '种子开始发芽了' }
|
||
],
|
||
answer: '需要水、阳光和种子'
|
||
},
|
||
{
|
||
question: '植物的组成部分有哪些?',
|
||
items: [
|
||
{ icon: '🌱', name: '根', result: '根吸收水分和养分' },
|
||
{ icon: '🌿', name: '茎', result: '茎运输水分和养分' },
|
||
{ icon: '🍃', name: '叶', result: '叶进行光合作用' }
|
||
],
|
||
answer: '植物的组成部分包括根、茎、叶、花和果实'
|
||
},
|
||
{
|
||
question: '什么是光合作用?',
|
||
items: [
|
||
{ icon: '☀️', name: '阳光', result: '阳光是光合作用的能量来源' },
|
||
{ icon: '🍃', name: '叶子', result: '叶子是光合作用的场所' },
|
||
{ icon: '💧', name: '水', result: '水是光合作用的原料' }
|
||
],
|
||
answer: '光合作用是植物利用阳光、水和二氧化碳制造养分的过程'
|
||
},
|
||
{
|
||
question: '种子是如何发芽的?',
|
||
items: [
|
||
{ icon: '💧', name: '水', result: '水使种子膨胀' },
|
||
{ icon: '🌱', name: '种子', result: '种子开始发芽' },
|
||
{ icon: '☀️', name: '阳光', result: '阳光帮助幼苗生长' }
|
||
],
|
||
answer: '种子在适宜的温度、水分和氧气条件下发芽'
|
||
},
|
||
{
|
||
question: '为什么植物需要阳光?',
|
||
items: [
|
||
{ icon: '☀️', name: '阳光', result: '阳光提供能量' },
|
||
{ icon: '🍃', name: '叶子', result: '叶子利用阳光进行光合作用' },
|
||
{ icon: '🌱', name: '植物', result: '植物需要养分生长' }
|
||
],
|
||
answer: '植物需要阳光进行光合作用,制造生长所需的养分'
|
||
},
|
||
{
|
||
question: '植物的根有什么作用?',
|
||
items: [
|
||
{ icon: '🌱', name: '根', result: '根吸收水分和养分' },
|
||
{ icon: '💧', name: '水', result: '水是植物生长的必需品' },
|
||
{ icon: '🌿', name: '茎', result: '茎将养分运输到植物各部分' }
|
||
],
|
||
answer: '植物的根可以吸收水分和养分,固定植物'
|
||
},
|
||
{
|
||
question: '植物的茎有什么作用?',
|
||
items: [
|
||
{ icon: '🌿', name: '茎', result: '茎运输水分和养分' },
|
||
{ icon: '🌱', name: '根', result: '根吸收水分和养分' },
|
||
{ icon: '🍃', name: '叶', result: '叶进行光合作用' }
|
||
],
|
||
answer: '植物的茎可以运输水分和养分,支撑植物'
|
||
},
|
||
{
|
||
question: '植物的叶子有什么作用?',
|
||
items: [
|
||
{ icon: '🍃', name: '叶', result: '叶进行光合作用' },
|
||
{ icon: '☀️', name: '阳光', result: '阳光是光合作用的能量来源' },
|
||
{ icon: '💧', name: '水', result: '水是光合作用的原料' }
|
||
],
|
||
answer: '植物的叶子可以进行光合作用,制造养分'
|
||
},
|
||
{
|
||
question: '花朵有什么作用?',
|
||
items: [
|
||
{ icon: '🌸', name: '花', result: '花可以吸引昆虫传粉' },
|
||
{ icon: '🐝', name: '蜜蜂', result: '蜜蜂帮助花朵传粉' },
|
||
{ icon: '🌱', name: '种子', result: '花授粉后会结出种子' }
|
||
],
|
||
answer: '花朵可以吸引昆虫传粉,帮助植物繁殖'
|
||
},
|
||
{
|
||
question: '果实有什么作用?',
|
||
items: [
|
||
{ icon: '🍎', name: '果实', result: '果实保护种子' },
|
||
{ icon: '🌱', name: '种子', result: '种子是植物的繁殖器官' },
|
||
{ icon: '🐦', name: '鸟', result: '动物吃果实帮助传播种子' }
|
||
],
|
||
answer: '果实可以保护种子,帮助种子传播'
|
||
}
|
||
],
|
||
// 浮力实验(物理)
|
||
buoyancy: [
|
||
{
|
||
question: '什么物体会浮在水面上?',
|
||
items: [
|
||
{ icon: '🪵', name: '木块', result: '木块浮在水面上' },
|
||
{ icon: '🪨', name: '石头', result: '石头沉到了水底' },
|
||
{ icon: '📦', name: '塑料盒', result: '塑料盒浮在水面上' }
|
||
],
|
||
answer: '木块和塑料盒会浮在水面上'
|
||
},
|
||
{
|
||
question: '为什么有些物体会浮在水面上?',
|
||
items: [
|
||
{ icon: '🌊', name: '水', result: '水有浮力' },
|
||
{ icon: '🪵', name: '木块', result: '木块的密度比水小' },
|
||
{ icon: '🪨', name: '石头', result: '石头的密度比水大' }
|
||
],
|
||
answer: '密度比水小的物体会浮在水面上'
|
||
},
|
||
{
|
||
question: '如何让沉下去的物体浮起来?',
|
||
items: [
|
||
{ icon: '🪨', name: '石头', result: '石头会沉下去' },
|
||
{ icon: '🎈', name: '气球', result: '气球可以提供浮力' },
|
||
{ icon: '📦', name: '塑料盒', result: '塑料盒可以增加浮力' }
|
||
],
|
||
answer: '可以通过增加浮力或减少物体的有效密度让物体浮起来'
|
||
},
|
||
{
|
||
question: '船为什么能浮在水面上?',
|
||
items: [
|
||
{ icon: '🚢', name: '船', result: '船的形状特殊' },
|
||
{ icon: '🌊', name: '水', result: '水的浮力支撑船' },
|
||
{ icon: '⚓', name: '锚', result: '锚可以让船固定' }
|
||
],
|
||
answer: '船的形状设计使它排开的水量产生足够的浮力支撑自身重量'
|
||
},
|
||
{
|
||
question: '潜水艇如何控制上浮和下沉?',
|
||
items: [
|
||
{ icon: '🚤', name: '潜水艇', result: '潜水艇有特殊的设计' },
|
||
{ icon: '💧', name: '水', result: '潜水艇可以吸水和排水' },
|
||
{ icon: '⚓', name: '锚', result: '锚可以帮助潜水艇固定' }
|
||
],
|
||
answer: '潜水艇通过调整内部水舱的水量来控制自身密度,从而实现上浮和下沉'
|
||
},
|
||
{
|
||
question: '浮力的方向是怎样的?',
|
||
items: [
|
||
{ icon: '⬆️', name: '向上', result: '浮力的方向是向上的' },
|
||
{ icon: '⬇️', name: '向下', result: '重力的方向是向下的' },
|
||
{ icon: '🌊', name: '水', result: '水产生浮力' }
|
||
],
|
||
answer: '浮力的方向是向上的'
|
||
},
|
||
{
|
||
question: '浮力的大小与什么有关?',
|
||
items: [
|
||
{ icon: '🌊', name: '水', result: '水的密度影响浮力' },
|
||
{ icon: '📦', name: '物体', result: '物体排开的水量影响浮力' },
|
||
{ icon: '⚖️', name: '重量', result: '物体的重量影响沉浮' }
|
||
],
|
||
answer: '浮力的大小与物体排开的水量和液体的密度有关'
|
||
},
|
||
{
|
||
question: '为什么铁块会沉在水中?',
|
||
items: [
|
||
{ icon: '🔧', name: '铁块', result: '铁块的密度比水大' },
|
||
{ icon: '🌊', name: '水', result: '水的密度比铁块小' },
|
||
{ icon: '⚖️', name: '重量', result: '铁块的重量大于浮力' }
|
||
],
|
||
answer: '因为铁块的密度比水大,所以会沉在水中'
|
||
},
|
||
{
|
||
question: '为什么泡沫会浮在水中?',
|
||
items: [
|
||
{ icon: '🧽', name: '泡沫', result: '泡沫的密度比水小' },
|
||
{ icon: '🌊', name: '水', result: '水的密度比泡沫大' },
|
||
{ icon: '⬆️', name: '浮力', result: '浮力大于泡沫的重量' }
|
||
],
|
||
answer: '因为泡沫的密度比水小,所以会浮在水中'
|
||
},
|
||
{
|
||
question: '盐水的浮力比淡水大吗?',
|
||
items: [
|
||
{ icon: '🧂', name: '盐', result: '盐增加了水的密度' },
|
||
{ icon: '🌊', name: '水', result: '水的密度影响浮力' },
|
||
{ icon: '⬆️', name: '浮力', result: '密度越大,浮力越大' }
|
||
],
|
||
answer: '是的,盐水的密度比淡水大,所以浮力更大'
|
||
}
|
||
],
|
||
// 颜色混合(化学)
|
||
colors: [
|
||
{
|
||
question: '红色和蓝色混合会变成什么颜色?',
|
||
items: [
|
||
{ icon: '🔴', name: '红色', result: '加入了红色' },
|
||
{ icon: '🔵', name: '蓝色', result: '加入了蓝色' },
|
||
{ icon: '🟣', name: '紫色', result: '红色和蓝色混合变成了紫色' }
|
||
],
|
||
answer: '红色和蓝色混合会变成紫色'
|
||
},
|
||
{
|
||
question: '红色和黄色混合会变成什么颜色?',
|
||
items: [
|
||
{ icon: '🔴', name: '红色', result: '加入了红色' },
|
||
{ icon: '🟡', name: '黄色', result: '加入了黄色' },
|
||
{ icon: '🟠', name: '橙色', result: '红色和黄色混合变成了橙色' }
|
||
],
|
||
answer: '红色和黄色混合会变成橙色'
|
||
},
|
||
{
|
||
question: '蓝色和黄色混合会变成什么颜色?',
|
||
items: [
|
||
{ icon: '🔵', name: '蓝色', result: '加入了蓝色' },
|
||
{ icon: '🟡', name: '黄色', result: '加入了黄色' },
|
||
{ icon: '🟢', name: '绿色', result: '蓝色和黄色混合变成了绿色' }
|
||
],
|
||
answer: '蓝色和黄色混合会变成绿色'
|
||
},
|
||
{
|
||
question: '什么是三原色?',
|
||
items: [
|
||
{ icon: '🔴', name: '红色', result: '红色是三原色之一' },
|
||
{ icon: '🔵', name: '蓝色', result: '蓝色是三原色之一' },
|
||
{ icon: '🟡', name: '黄色', result: '黄色是三原色之一' }
|
||
],
|
||
answer: '三原色是红色、蓝色和黄色,它们可以混合出其他所有颜色'
|
||
},
|
||
{
|
||
question: '如何混合出棕色?',
|
||
items: [
|
||
{ icon: '🔴', name: '红色', result: '加入了红色' },
|
||
{ icon: '🟡', name: '黄色', result: '加入了黄色' },
|
||
{ icon: '🔵', name: '蓝色', result: '加入了蓝色' }
|
||
],
|
||
answer: '混合红色、黄色和蓝色可以得到棕色'
|
||
},
|
||
{
|
||
question: '红色和绿色混合会变成什么颜色?',
|
||
items: [
|
||
{ icon: '🔴', name: '红色', result: '加入了红色' },
|
||
{ icon: '🟢', name: '绿色', result: '加入了绿色' },
|
||
{ icon: '🟤', name: '棕色', result: '红色和绿色混合变成了棕色' }
|
||
],
|
||
answer: '红色和绿色混合会变成棕色'
|
||
},
|
||
{
|
||
question: '蓝色和绿色混合会变成什么颜色?',
|
||
items: [
|
||
{ icon: '🔵', name: '蓝色', result: '加入了蓝色' },
|
||
{ icon: '🟢', name: '绿色', result: '加入了绿色' },
|
||
{ icon: '🟦', name: '蓝绿色', result: '蓝色和绿色混合变成了蓝绿色' }
|
||
],
|
||
answer: '蓝色和绿色混合会变成蓝绿色'
|
||
},
|
||
{
|
||
question: '黄色和绿色混合会变成什么颜色?',
|
||
items: [
|
||
{ icon: '🟡', name: '黄色', result: '加入了黄色' },
|
||
{ icon: '🟢', name: '绿色', result: '加入了绿色' },
|
||
{ icon: '💚', name: '黄绿色', result: '黄色和绿色混合变成了黄绿色' }
|
||
],
|
||
answer: '黄色和绿色混合会变成黄绿色'
|
||
},
|
||
{
|
||
question: '什么是二次色?',
|
||
items: [
|
||
{ icon: '🟣', name: '紫色', result: '红色和蓝色混合而成' },
|
||
{ icon: '🟠', name: '橙色', result: '红色和黄色混合而成' },
|
||
{ icon: '🟢', name: '绿色', result: '蓝色和黄色混合而成' }
|
||
],
|
||
answer: '二次色是由两种原色混合而成的颜色,包括紫色、橙色和绿色'
|
||
},
|
||
{
|
||
question: '如何混合出粉色?',
|
||
items: [
|
||
{ icon: '🔴', name: '红色', result: '加入了红色' },
|
||
{ icon: '⚪', name: '白色', result: '加入了白色' },
|
||
{ icon: '🌸', name: '粉色', result: '红色和白色混合变成了粉色' }
|
||
],
|
||
answer: '红色和白色混合可以得到粉色'
|
||
}
|
||
],
|
||
// 化学实验(化学反应、蒸汽气化等)
|
||
chemistry: [
|
||
{
|
||
question: '水加热后会变成什么?',
|
||
items: [
|
||
{ icon: '💧', name: '水', result: '水被加热' },
|
||
{ icon: '🔥', name: '热量', result: '热量使水温度升高' },
|
||
{ icon: '☁️', name: '水蒸气', result: '水变成了水蒸气' }
|
||
],
|
||
answer: '水加热后会变成水蒸气'
|
||
},
|
||
{
|
||
question: '小苏打和醋混合会发生什么?',
|
||
items: [
|
||
{ icon: '🧂', name: '小苏打', result: '加入了小苏打' },
|
||
{ icon: '🍶', name: '醋', result: '加入了醋' },
|
||
{ icon: '💨', name: '气泡', result: '产生了大量气泡' }
|
||
],
|
||
answer: '小苏打和醋混合会产生二氧化碳气泡'
|
||
},
|
||
{
|
||
question: '蜡烛燃烧需要什么?',
|
||
items: [
|
||
{ icon: '🕯️', name: '蜡烛', result: '蜡烛是燃烧的燃料' },
|
||
{ icon: '🔥', name: '火', result: '火提供初始热量' },
|
||
{ icon: '💨', name: '氧气', result: '氧气支持燃烧' }
|
||
],
|
||
answer: '蜡烛燃烧需要燃料、热量和氧气'
|
||
},
|
||
{
|
||
question: '铁为什么会生锈?',
|
||
items: [
|
||
{ icon: '🔧', name: '铁', result: '铁是生锈的物质' },
|
||
{ icon: '💧', name: '水', result: '水是生锈的条件之一' },
|
||
{ icon: '💨', name: '氧气', result: '氧气是生锈的条件之一' }
|
||
],
|
||
answer: '铁生锈是因为铁与水和氧气发生了化学反应'
|
||
},
|
||
{
|
||
question: '什么是蒸发?',
|
||
items: [
|
||
{ icon: '💧', name: '水', result: '水是蒸发的物质' },
|
||
{ icon: '☀️', name: '阳光', result: '阳光提供蒸发所需的能量' },
|
||
{ icon: '☁️', name: '水蒸气', result: '水变成了水蒸气' }
|
||
],
|
||
answer: '蒸发是液体变成气体的过程'
|
||
},
|
||
{
|
||
question: '什么是凝结?',
|
||
items: [
|
||
{ icon: '☁️', name: '水蒸气', result: '水蒸气是凝结的物质' },
|
||
{ icon: '❄️', name: '冷空气', result: '冷空气使水蒸气冷却' },
|
||
{ icon: '💧', name: '水滴', result: '水蒸气变成了水滴' }
|
||
],
|
||
answer: '凝结是气体变成液体的过程'
|
||
},
|
||
{
|
||
question: '如何使水结冰?',
|
||
items: [
|
||
{ icon: '💧', name: '水', result: '水是结冰的物质' },
|
||
{ icon: '❄️', name: '低温', result: '低温使水结冰' },
|
||
{ icon: '🧊', name: '冰', result: '水变成了冰' }
|
||
],
|
||
answer: '将水放在低温环境中可以使水结冰'
|
||
},
|
||
{
|
||
question: '如何使冰融化?',
|
||
items: [
|
||
{ icon: '🧊', name: '冰', result: '冰是融化的物质' },
|
||
{ icon: '🔥', name: '热量', result: '热量使冰融化' },
|
||
{ icon: '💧', name: '水', result: '冰变成了水' }
|
||
],
|
||
answer: '给冰加热可以使冰融化'
|
||
},
|
||
{
|
||
question: '二氧化碳有什么特性?',
|
||
items: [
|
||
{ icon: '💨', name: '二氧化碳', result: '二氧化碳是一种气体' },
|
||
{ icon: '💧', name: '水', result: '二氧化碳能溶于水' },
|
||
{ icon: '🔥', name: '火', result: '二氧化碳能灭火' }
|
||
],
|
||
answer: '二氧化碳是一种无色无味的气体,能溶于水,不能燃烧也不支持燃烧'
|
||
},
|
||
{
|
||
question: '什么是化学反应?',
|
||
items: [
|
||
{ icon: '🧪', name: '反应物', result: '参与反应的物质' },
|
||
{ icon: '⚗️', name: '反应过程', result: '物质发生变化' },
|
||
{ icon: '🏆', name: '生成物', result: '反应产生的新物质' }
|
||
],
|
||
answer: '化学反应是物质发生变化,产生新物质的过程'
|
||
}
|
||
],
|
||
// 物理实验(电池、电路等)
|
||
physics: [
|
||
{
|
||
question: '电池如何工作?',
|
||
items: [
|
||
{ icon: '🔋', name: '电池', result: '电池提供电能' },
|
||
{ icon: '⚡', name: '电流', result: '电池产生电流' },
|
||
{ icon: '💡', name: '灯泡', result: '电流使灯泡发光' }
|
||
],
|
||
answer: '电池通过化学反应产生电能,提供电流'
|
||
},
|
||
{
|
||
question: '如何制作简单电路?',
|
||
items: [
|
||
{ icon: '🔋', name: '电池', result: '电池是电路的电源' },
|
||
{ icon: '💡', name: '灯泡', result: '灯泡是电路的用电器' },
|
||
{ icon: '🔌', name: '导线', result: '导线连接电路元件' }
|
||
],
|
||
answer: '用导线将电池和灯泡连接起来,形成闭合电路'
|
||
},
|
||
{
|
||
question: '电池为什么能推动风车?',
|
||
items: [
|
||
{ icon: '🔋', name: '电池', result: '电池提供电能' },
|
||
{ icon: '⚡', name: '电流', result: '电流通过电机' },
|
||
{ icon: '风车', name: '风车', result: '电机带动风车转动' }
|
||
],
|
||
answer: '电池提供电能,通过电机将电能转化为机械能,推动风车转动'
|
||
},
|
||
{
|
||
question: '什么是磁铁?',
|
||
items: [
|
||
{ icon: '🧲', name: '磁铁', result: '磁铁具有磁性' },
|
||
{ icon: '🔑', name: '铁制品', result: '磁铁能吸引铁制品' },
|
||
{ icon: '🧭', name: '指南针', result: '磁铁能指示方向' }
|
||
],
|
||
answer: '磁铁是能吸引铁、钴、镍等金属的物体'
|
||
},
|
||
{
|
||
question: '什么是静电?',
|
||
items: [
|
||
{ icon: '🧶', name: '毛衣', result: '毛衣摩擦产生静电' },
|
||
{ icon: '📄', name: '纸', result: '静电能吸引轻小物体' },
|
||
{ icon: '⚡', name: '静电火花', result: '静电放电产生火花' }
|
||
],
|
||
answer: '静电是物体表面积累的电荷'
|
||
},
|
||
{
|
||
question: '声音是如何传播的?',
|
||
items: [
|
||
{ icon: '🔊', name: '声音', result: '声音是一种波' },
|
||
{ icon: '💨', name: '空气', result: '声音通过空气传播' },
|
||
{ icon: '👂', name: '耳朵', result: '耳朵接收声音' }
|
||
],
|
||
answer: '声音通过介质(如空气、水、固体)传播'
|
||
},
|
||
{
|
||
question: '什么是光的反射?',
|
||
items: [
|
||
{ icon: '☀️', name: '光', result: '光照射到物体表面' },
|
||
{ icon: '🪞', name: '镜子', result: '镜子反射光线' },
|
||
{ icon: '👁️', name: '眼睛', result: '眼睛看到反射的光' }
|
||
],
|
||
answer: '光的反射是光线遇到物体表面后改变传播方向的现象'
|
||
},
|
||
{
|
||
question: '什么是光的折射?',
|
||
items: [
|
||
{ icon: '☀️', name: '光', result: '光从一种介质进入另一种介质' },
|
||
{ icon: '💧', name: '水', result: '光在水中传播方向改变' },
|
||
{ icon: '🔍', name: '放大镜', result: '放大镜利用折射原理' }
|
||
],
|
||
answer: '光的折射是光线从一种介质进入另一种介质时传播方向改变的现象'
|
||
},
|
||
{
|
||
question: '什么是重力?',
|
||
items: [
|
||
{ icon: '🌍', name: '地球', result: '地球产生重力' },
|
||
{ icon: '🔄', name: '苹果', result: '苹果受到重力下落' },
|
||
{ icon: '⬇️', name: '方向', result: '重力方向向下' }
|
||
],
|
||
answer: '重力是地球对物体的吸引力'
|
||
},
|
||
{
|
||
question: '什么是摩擦力?',
|
||
items: [
|
||
{ icon: '👟', name: '鞋子', result: '鞋子与地面接触' },
|
||
{ icon: '🔄', name: '运动', result: '运动产生摩擦力' },
|
||
{ icon: '🛑', name: '停止', result: '摩擦力使物体停止' }
|
||
],
|
||
answer: '摩擦力是两个物体接触表面之间相互阻碍运动的力'
|
||
}
|
||
],
|
||
// 科学小实验
|
||
experiments: [
|
||
{
|
||
question: '如何制作彩虹?',
|
||
items: [
|
||
{ icon: '☀️', name: '阳光', result: '阳光是制作彩虹的光源' },
|
||
{ icon: '💧', name: '水', result: '水使阳光折射' },
|
||
{ icon: '🌈', name: '彩虹', result: '阳光通过水形成彩虹' }
|
||
],
|
||
answer: '让阳光通过水滴或三棱镜可以制作彩虹'
|
||
},
|
||
{
|
||
question: '如何让鸡蛋浮起来?',
|
||
items: [
|
||
{ icon: '🥚', name: '鸡蛋', result: '鸡蛋是实验对象' },
|
||
{ icon: '💧', name: '水', result: '水提供浮力' },
|
||
{ icon: '🧂', name: '盐', result: '盐增加水的密度' }
|
||
],
|
||
answer: '在水中加入足够的盐,使水的密度大于鸡蛋的密度,鸡蛋就会浮起来'
|
||
},
|
||
{
|
||
question: '如何制作火山喷发模型?',
|
||
items: [
|
||
{ icon: '🌋', name: '火山模型', result: '用泥土或橡皮泥制作火山形状' },
|
||
{ icon: '🧂', name: '小苏打', result: '小苏打是反应物' },
|
||
{ icon: '🍶', name: '醋', result: '醋与小苏打反应产生气泡' }
|
||
],
|
||
answer: '在火山模型中加入小苏打和醋,它们反应产生的二氧化碳会模拟火山喷发'
|
||
},
|
||
{
|
||
question: '如何制作简易指南针?',
|
||
items: [
|
||
{ icon: '🧲', name: '磁铁', result: '磁铁磁化指针' },
|
||
{ icon: '🧷', name: '针', result: '针被磁化后变成指南针' },
|
||
{ icon: '💧', name: '水', result: '水使指南针自由转动' }
|
||
],
|
||
answer: '用磁铁摩擦针使其磁化,然后将针放在水面上,它会指向南北方向'
|
||
},
|
||
{
|
||
question: '如何制作气球动力小车?',
|
||
items: [
|
||
{ icon: '🎈', name: '气球', result: '气球储存空气' },
|
||
{ icon: '🚗', name: '小车', result: '气球带动小车前进' },
|
||
{ icon: '💨', name: '空气', result: '空气从气球中喷出产生推力' }
|
||
],
|
||
answer: '将气球吹满气,然后松开,气球喷出的空气会推动小车前进'
|
||
},
|
||
{
|
||
question: '如何观察植物的蒸腾作用?',
|
||
items: [
|
||
{ icon: '🌱', name: '植物', result: '植物进行蒸腾作用' },
|
||
{ icon: '📦', name: '塑料袋', result: '塑料袋收集水蒸气' },
|
||
{ icon: '💧', name: '水滴', result: '水蒸气在塑料袋上凝结成水滴' }
|
||
],
|
||
answer: '用塑料袋套住植物的枝叶,一段时间后塑料袋内壁会出现水滴,这就是植物的蒸腾作用'
|
||
},
|
||
{
|
||
question: '如何制作简易净水器?',
|
||
items: [
|
||
{ icon: '💧', name: '脏水', result: '需要净化的水' },
|
||
{ icon: '🌿', name: '活性炭', result: '活性炭吸附杂质' },
|
||
{ icon: '🧻', name: '滤纸', result: '滤纸过滤固体杂质' }
|
||
],
|
||
answer: '将脏水通过活性炭和滤纸,可以去除水中的杂质'
|
||
},
|
||
{
|
||
question: '如何观察种子的发芽过程?',
|
||
items: [
|
||
{ icon: '🌱', name: '种子', result: '种子是发芽的主体' },
|
||
{ icon: '💧', name: '水', result: '水是发芽的必要条件' },
|
||
{ icon: '☀️', name: '阳光', result: '阳光帮助种子发芽' }
|
||
],
|
||
answer: '将种子放在湿润的纸巾上,放在温暖的地方,每天观察种子的变化'
|
||
},
|
||
{
|
||
question: '如何制作简易气压计?',
|
||
items: [
|
||
{ icon: '🍶', name: '瓶子', result: '瓶子作为容器' },
|
||
{ icon: '📄', name: '气球', result: '气球膜感应气压变化' },
|
||
{ icon: '📏', name: '吸管', result: '吸管指示气压变化' }
|
||
],
|
||
answer: '在瓶子口套上气球膜,在膜上粘一根吸管,当气压变化时,吸管会上下移动'
|
||
},
|
||
{
|
||
question: '如何观察声音的振动?',
|
||
items: [
|
||
{ icon: '🔊', name: '声音', result: '声音产生振动' },
|
||
{ icon: '🎸', name: '吉他弦', result: '弦的振动产生声音' },
|
||
{ icon: '💡', name: '盐粒', result: '盐粒随振动跳动' }
|
||
],
|
||
answer: '在鼓面或吉他弦上撒一些盐粒,当发出声音时,盐粒会随振动跳动'
|
||
}
|
||
]
|
||
},
|
||
japanese: {
|
||
// 50音图(平假名)
|
||
hiragana: [
|
||
{ question: 'あ的发音是?', options: ['a', 'i', 'u', 'e'], answer: 'a', audio: 'あ' },
|
||
{ question: 'い的发音是?', options: ['a', 'i', 'u', 'e'], answer: 'i', audio: 'い' },
|
||
{ question: 'う的发音是?', options: ['a', 'i', 'u', 'e'], answer: 'u', audio: 'う' },
|
||
{ question: 'え的发音是?', options: ['a', 'i', 'u', 'e'], answer: 'e', audio: 'え' },
|
||
{ question: 'お的发音是?', options: ['a', 'i', 'u', 'o'], answer: 'o', audio: 'お' },
|
||
{ question: 'か的发音是?', options: ['ka', 'ki', 'ku', 'ke'], answer: 'ka', audio: 'か' },
|
||
{ question: 'き的发音是?', options: ['ka', 'ki', 'ku', 'ke'], answer: 'ki', audio: 'き' },
|
||
{ question: 'く的发音是?', options: ['ka', 'ki', 'ku', 'ke'], answer: 'ku', audio: 'く' },
|
||
{ question: 'け的发音是?', options: ['ka', 'ki', 'ku', 'ke'], answer: 'ke', audio: 'け' },
|
||
{ question: 'こ的发音是?', options: ['ka', 'ki', 'ku', 'ko'], answer: 'ko', audio: 'こ' }
|
||
],
|
||
// 小动物
|
||
animals: [
|
||
{ question: '猫的日语是?', options: ['いぬ', 'ねこ', 'うさぎ', 'たぬき'], answer: 'ねこ', audio: 'ねこ' },
|
||
{ question: '狗的日语是?', options: ['いぬ', 'ねこ', 'うさぎ', 'たぬき'], answer: 'いぬ', audio: 'いぬ' },
|
||
{ question: '兔子的日语是?', options: ['いぬ', 'ねこ', 'うさぎ', 'たぬき'], answer: 'うさぎ', audio: 'うさぎ' },
|
||
{ question: '狐狸的日语是?', options: ['いぬ', 'ねこ', 'うさぎ', 'たぬき'], answer: 'たぬき', audio: 'たぬき' },
|
||
{ question: '鸟的日语是?', options: ['とり', 'いぬ', 'ねこ', 'うさぎ'], answer: 'とり', audio: 'とり' },
|
||
{ question: '鱼的日语是?', options: ['さかな', 'とり', 'いぬ', 'ねこ'], answer: 'さかな', audio: 'さかな' },
|
||
{ question: '青蛙的日语是?', options: ['かえる', 'さかな', 'とり', 'いぬ'], answer: 'かえる', audio: 'かえる' }
|
||
],
|
||
// 水果
|
||
fruits: [
|
||
{ question: '苹果的日语是?', options: ['りんご', 'みかん', 'ぶどう', 'いちご'], answer: 'りんご', audio: 'りんご' },
|
||
{ question: '橘子的日语是?', options: ['りんご', 'みかん', 'ぶどう', 'いちご'], answer: 'みかん', audio: 'みかん' },
|
||
{ question: '葡萄的日语是?', options: ['りんご', 'みかん', 'ぶどう', 'いちご'], answer: 'ぶどう', audio: 'ぶどう' },
|
||
{ question: '草莓的日语是?', options: ['りんご', 'みかん', 'ぶどう', 'いちご'], answer: 'いちご', audio: 'いちご' },
|
||
{ question: '香蕉的日语是?', options: ['バナナ', 'りんご', 'みかん', 'ぶどう'], answer: 'バナナ', audio: 'バナナ' },
|
||
{ question: '西瓜的日语是?', options: ['すいか', 'バナナ', 'りんご', 'みかん'], answer: 'すいか', audio: 'すいか' }
|
||
],
|
||
// 身体部位
|
||
body: [
|
||
{ question: '头的日语是?', options: ['あたま', 'からだ', 'て', 'あし'], answer: 'あたま', audio: 'あたま' },
|
||
{ question: '身体的日语是?', options: ['あたま', 'からだ', 'て', 'あし'], answer: 'からだ', audio: 'からだ' },
|
||
{ question: '手的日语是?', options: ['あたま', 'からだ', 'て', 'あし'], answer: 'て', audio: 'て' },
|
||
{ question: '脚的日语是?', options: ['あたま', 'からだ', 'て', 'あし'], answer: 'あし', audio: 'あし' },
|
||
{ question: '眼睛的日语是?', options: ['め', 'はな', 'くち', 'みみ'], answer: 'め', audio: 'め' },
|
||
{ question: '鼻子的日语是?', options: ['め', 'はな', 'くち', 'みみ'], answer: 'はな', audio: 'はな' },
|
||
{ question: '嘴巴的日语是?', options: ['め', 'はな', 'くち', 'みみ'], answer: 'くち', audio: 'くち' },
|
||
{ question: '耳朵的日语是?', options: ['め', 'はな', 'くち', 'みみ'], answer: 'みみ', audio: 'みみ' }
|
||
],
|
||
// 前后左右
|
||
directions: [
|
||
{ question: '前的日语是?', options: ['まえ', 'うしろ', 'みぎ', 'ひだり'], answer: 'まえ', audio: 'まえ' },
|
||
{ question: '后的日语是?', options: ['まえ', 'うしろ', 'みぎ', 'ひだり'], answer: 'うしろ', audio: 'うしろ' },
|
||
{ question: '右的日语是?', options: ['まえ', 'うしろ', 'みぎ', 'ひだり'], answer: 'みぎ', audio: 'みぎ' },
|
||
{ question: '左的日语是?', options: ['まえ', 'うしろ', 'みぎ', 'ひだり'], answer: 'ひだり', audio: 'ひだり' }
|
||
],
|
||
// 生活上常用的物品
|
||
items: [
|
||
{ question: '家的日语是?', options: ['いえ', 'へや', 'たな', 'ふすま'], answer: 'いえ', audio: 'いえ' },
|
||
{ question: '房间的日语是?', options: ['いえ', 'へや', 'たな', 'ふすま'], answer: 'へや', audio: 'へや' },
|
||
{ question: '桌子的日语是?', options: ['つくえ', 'いす', 'ねこ', 'いぬ'], answer: 'つくえ', audio: 'つくえ' },
|
||
{ question: '椅子的日语是?', options: ['つくえ', 'いす', 'ねこ', 'いぬ'], answer: 'いす', audio: 'いす' },
|
||
{ question: '书的日语是?', options: ['ほん', 'えんぴつ', 'ペン', 'かぎ'], answer: 'ほん', audio: 'ほん' },
|
||
{ question: '铅笔的日语是?', options: ['ほん', 'えんぴつ', 'ペン', 'かぎ'], answer: 'えんぴつ', audio: 'えんぴつ' },
|
||
{ question: '钢笔的日语是?', options: ['ほん', 'えんぴつ', 'ペン', 'かぎ'], answer: 'ペン', audio: 'ペン' },
|
||
{ question: '钥匙的日语是?', options: ['ほん', 'えんぴつ', 'ペン', 'かぎ'], answer: 'かぎ', audio: 'かぎ' },
|
||
{ question: '杯子的日语是?', options: ['コップ', 'ごはん', 'みず', 'おちゃ'], answer: 'コップ', audio: 'コップ' },
|
||
{ question: '米饭的日语是?', options: ['コップ', 'ごはん', 'みず', 'おちゃ'], answer: 'ごはん', audio: 'ごはん' },
|
||
{ question: '水的日语是?', options: ['コップ', 'ごはん', 'みず', 'おちゃ'], answer: 'みず', audio: 'みず' },
|
||
{ question: '茶的日语是?', options: ['コップ', 'ごはん', 'みず', 'おちゃ'], answer: 'おちゃ', audio: 'おちゃ' }
|
||
],
|
||
// 问候语言
|
||
greetings: [
|
||
{ question: '你好的日语是?', options: ['こんにちは', 'さようなら', 'ありがとう', 'ごめんなさい'], answer: 'こんにちは', audio: 'こんにちは' },
|
||
{ question: '再见的日语是?', options: ['こんにちは', 'さようなら', 'ありがとう', 'ごめんなさい'], answer: 'さようなら', audio: 'さようなら' },
|
||
{ question: '谢谢的日语是?', options: ['こんにちは', 'さようなら', 'ありがとう', 'ごめんなさい'], answer: 'ありがとう', audio: 'ありがとう' },
|
||
{ question: '对不起的日语是?', options: ['こんにちは', 'さようなら', 'ありがとう', 'ごめんなさい'], answer: 'ごめんなさい', audio: 'ごめんなさい' },
|
||
{ question: '早上好的日语是?', options: ['おはよう', 'こんにちは', 'こんばんは', 'おやすみ'], answer: 'おはよう', audio: 'おはよう' },
|
||
{ question: '晚上好的日语是?', options: ['おはよう', 'こんにちは', 'こんばんは', 'おやすみ'], answer: 'こんばんは', audio: 'こんばんは' },
|
||
{ question: '晚安的日语是?', options: ['おはよう', 'こんにちは', 'こんばんは', 'おやすみ'], answer: 'おやすみ', audio: 'おやすみ' }
|
||
]
|
||
}
|
||
};
|
||
|
||
// 播放音频 - 库洛米声音风格
|
||
const playAudio = (text: string) => {
|
||
try {
|
||
// 使用Web Speech API进行文本转语音
|
||
const speech = new SpeechSynthesisUtterance(text);
|
||
// 设置语言
|
||
if (/[\u3040-\u309F]/.test(text)) { // 平假名
|
||
speech.lang = 'ja-JP';
|
||
} else if (text.length === 1 || /[\u4e00-\u9fa5]/.test(text)) {
|
||
speech.lang = 'zh-CN';
|
||
} else {
|
||
speech.lang = 'en-US';
|
||
}
|
||
// 设置音量、语速和语调 - 库洛米风格(可爱、活泼、略带淘气)
|
||
speech.volume = 1; // 音量
|
||
speech.rate = 1.0; // 语速适中,更清晰
|
||
speech.pitch = 1.5; // 高语调,更可爱
|
||
|
||
// 尝试选择更适合儿童的语音
|
||
const voices = window.speechSynthesis.getVoices();
|
||
if (voices.length > 0) {
|
||
// 优先选择女性或儿童语音
|
||
let selectedVoice = null;
|
||
if (speech.lang === 'zh-CN') {
|
||
// 寻找中文语音
|
||
selectedVoice = voices.find(voice =>
|
||
voice.lang === 'zh-CN' &&
|
||
(voice.name.includes('女') || voice.name.includes('child') || voice.name.includes('Child') || voice.name.includes('少女') || voice.name.includes('Microsoft Yaoyao') || voice.name.includes('Microsoft Huihui'))
|
||
) || voices.find(voice => voice.lang === 'zh-CN');
|
||
} else if (speech.lang === 'ja-JP') {
|
||
// 寻找日语语音
|
||
selectedVoice = voices.find(voice =>
|
||
voice.lang === 'ja-JP' &&
|
||
(voice.name.includes('Female') || voice.name.includes('child') || voice.name.includes('Child') || voice.name.includes('Microsoft Haruka') || voice.name.includes('Google Japanese'))
|
||
) || voices.find(voice => voice.lang === 'ja-JP');
|
||
} else {
|
||
// 寻找英文语音
|
||
selectedVoice = voices.find(voice =>
|
||
voice.lang === 'en-US' &&
|
||
(voice.name.includes('Female') || voice.name.includes('child') || voice.name.includes('Child') || voice.name.includes('Microsoft Zira') || voice.name.includes('Google US English') || voice.name.includes('Samantha'))
|
||
) || voices.find(voice => voice.lang === 'en-US');
|
||
}
|
||
if (selectedVoice) {
|
||
speech.voice = selectedVoice;
|
||
}
|
||
}
|
||
|
||
// 播放
|
||
window.speechSynthesis.speak(speech);
|
||
} catch (error) {
|
||
console.error('音频播放失败:', error);
|
||
}
|
||
};
|
||
|
||
// 选择学科
|
||
const selectSubject = (subject: string) => {
|
||
console.log('=== 选择学科开始 ===');
|
||
console.log('参数 subject:', subject);
|
||
console.log('currentSubject.value 修改前:', currentSubject.value);
|
||
currentSubject.value = subject;
|
||
currentGame.value = null;
|
||
console.log('currentSubject.value 修改后:', currentSubject.value);
|
||
console.log('currentGame.value:', currentGame.value);
|
||
console.log('=== 选择学科结束 ===');
|
||
};
|
||
|
||
// 开始游戏
|
||
const startGame = (subject: string, taskIndex: number) => {
|
||
try {
|
||
console.log('开始游戏函数被调用:', subject, taskIndex);
|
||
console.log('类型检查 - subject:', typeof subject, 'taskIndex:', typeof taskIndex);
|
||
|
||
// 检查是否达到每日上限
|
||
if (isDailyLimitReached(subject)) {
|
||
const subjectName = subject === 'math' ? '数学' : subject === 'chinese' ? '语文' : subject === 'english' ? '英语' : subject === 'japanese' ? '日语' : subject === 'geography' ? '地理' : '科学';
|
||
const limit = dailyLimits[subject] || 25;
|
||
alert(`今日${subjectName}题目已达上限(${limit}题),明天再来挑战吧!`);
|
||
return;
|
||
}
|
||
|
||
// 根据学科和任务索引选择不同的题目集
|
||
let taskType = '';
|
||
let gameDataSubject: any = null;
|
||
let startIndex = 0;
|
||
|
||
switch (subject) {
|
||
case 'math':
|
||
const mathTasks = ['counting', 'shapes', 'calculation'];
|
||
taskType = mathTasks[taskIndex] || 'counting';
|
||
gameDataSubject = gameData.math[taskType];
|
||
startIndex = progress.value.math[taskType] || 0;
|
||
break;
|
||
case 'chinese':
|
||
const chineseTasks = ['radicals', 'pinyin', 'words'];
|
||
taskType = chineseTasks[taskIndex] || 'radicals';
|
||
gameDataSubject = gameData.chinese[taskType];
|
||
startIndex = progress.value.chinese[taskType] || 0;
|
||
break;
|
||
case 'english':
|
||
const englishTasks = ['maze', 'animal', 'dialogue'];
|
||
taskType = englishTasks[taskIndex] || 'maze';
|
||
gameDataSubject = gameData.english[taskType];
|
||
startIndex = progress.value.english[taskType] || 0;
|
||
break;
|
||
case 'science':
|
||
const scienceTasks = ['plants', 'buoyancy', 'colors', 'chemistry', 'physics', 'experiments'];
|
||
taskType = scienceTasks[taskIndex] || 'plants';
|
||
gameDataSubject = gameData.science[taskType];
|
||
startIndex = progress.value.science[taskType] || 0;
|
||
break;
|
||
case 'japanese':
|
||
const japaneseTasks = ['hiragana', 'animals', 'fruits', 'body', 'directions', 'items', 'greetings'];
|
||
taskType = japaneseTasks[taskIndex] || 'hiragana';
|
||
gameDataSubject = gameData.japanese[taskType];
|
||
startIndex = progress.value.japanese[taskType] || 0;
|
||
break;
|
||
case 'geography':
|
||
const geographyTasks = ['map', 'basics', 'northSouth'];
|
||
taskType = geographyTasks[taskIndex] || 'map';
|
||
gameDataSubject = gameData.geography[taskType];
|
||
startIndex = progress.value.geography[taskType] || 0;
|
||
break;
|
||
default:
|
||
gameDataSubject = gameData[subject];
|
||
startIndex = 0;
|
||
}
|
||
|
||
console.log('选择的任务类型:', taskType);
|
||
console.log('游戏数据:', gameDataSubject);
|
||
console.log('开始索引:', startIndex);
|
||
|
||
console.log('gameDataSubject类型:', typeof gameDataSubject);
|
||
console.log('gameDataSubject是否为数组:', Array.isArray(gameDataSubject));
|
||
console.log('gameDataSubject长度:', gameDataSubject ? gameDataSubject.length : 'N/A');
|
||
|
||
// 确保gameDataSubject是数组且有数据
|
||
if (gameDataSubject && Array.isArray(gameDataSubject) && gameDataSubject.length > 0) {
|
||
// 确保startIndex不超过题目总数
|
||
const effectiveIndex = Math.min(startIndex, gameDataSubject.length - 1);
|
||
console.log('effectiveIndex:', effectiveIndex);
|
||
|
||
// 获取题目数据
|
||
const questionData = gameDataSubject[effectiveIndex];
|
||
console.log('questionData:', questionData);
|
||
|
||
if (!questionData) {
|
||
console.error('题目数据未找到:', subject, taskType, effectiveIndex);
|
||
// 即使没有题目数据,也设置currentGame.value
|
||
currentGame.value = {
|
||
subject,
|
||
taskIndex,
|
||
taskType,
|
||
question: '暂无题目数据',
|
||
options: [],
|
||
parts: [],
|
||
items: [],
|
||
answer: '',
|
||
audio: ''
|
||
};
|
||
return;
|
||
}
|
||
|
||
let shuffledOptions = null;
|
||
let shuffledAnswer = questionData.answer;
|
||
|
||
// 如果有选项,随机打乱顺序
|
||
if (questionData.options) {
|
||
// 创建选项的副本并打乱
|
||
shuffledOptions = [...questionData.options];
|
||
for (let i = shuffledOptions.length - 1; i > 0; i--) {
|
||
const j = Math.floor(Math.random() * (i + 1));
|
||
[shuffledOptions[i], shuffledOptions[j]] = [shuffledOptions[j], shuffledOptions[i]];
|
||
}
|
||
}
|
||
|
||
// 设置currentGame.value
|
||
currentGame.value = {
|
||
subject,
|
||
taskIndex,
|
||
taskType,
|
||
question: questionData.question || '暂无题目',
|
||
options: shuffledOptions || questionData.options || [],
|
||
parts: questionData.parts || [],
|
||
items: questionData.items || [],
|
||
answer: shuffledAnswer || '',
|
||
audio: questionData.audio || ''
|
||
};
|
||
console.log('当前游戏设置:', currentGame.value);
|
||
console.log('currentGame.value设置后:', currentGame.value);
|
||
} else {
|
||
console.error('游戏数据未找到或为空:', subject, taskType, gameDataSubject);
|
||
// 即使没有游戏数据,也设置currentGame.value,避免界面无反应
|
||
currentGame.value = {
|
||
subject,
|
||
taskIndex,
|
||
taskType,
|
||
question: '暂无题目数据',
|
||
options: [],
|
||
parts: [],
|
||
items: [],
|
||
answer: '',
|
||
audio: ''
|
||
};
|
||
}
|
||
currentQuestionIndex.value = startIndex;
|
||
showFeedback.value = false;
|
||
currentAnswer.value = '';
|
||
experimentResult.value = '';
|
||
console.log('函数执行完毕,currentGame.value:', currentGame.value);
|
||
} catch (error) {
|
||
console.error('开始游戏时发生错误:', error);
|
||
alert('开始游戏时发生错误,请重试');
|
||
}
|
||
};
|
||
|
||
// 检查数学答案
|
||
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 };
|
||
let starsPerQuestion = 1;
|
||
if (subject === 'math' || subject === 'chinese' || subject === 'english') {
|
||
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} 颗星星能量!`
|
||
: `再试一次,加油!你选择的是 ${option}。`;
|
||
showFeedback.value = true;
|
||
if (isCorrect.value) {
|
||
playAudio(`太棒了,正确答案是 ${currentGame.value.answer}`);
|
||
}
|
||
};
|
||
|
||
// 检查语文答案
|
||
const checkChineseAnswer = (option?: string) => {
|
||
// 如果传入了选项,直接检查选项
|
||
if (option !== undefined) {
|
||
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 };
|
||
let starsPerQuestion = 1;
|
||
if (subject === 'math' || subject === 'chinese' || subject === 'english') {
|
||
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} 颗星星能量!`
|
||
: `再试一次,加油!你选择的是 ${option}。`;
|
||
showFeedback.value = true;
|
||
if (isCorrect.value) {
|
||
playAudio(`太棒了,正确答案是 ${currentGame.value.answer}`);
|
||
}
|
||
} else {
|
||
// 否则检查当前答案(拼字游戏)
|
||
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 };
|
||
let starsPerQuestion = 1;
|
||
if (subject === 'math' || subject === 'chinese' || subject === 'english') {
|
||
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} 颗星星能量!`
|
||
: `再试一次,加油!你选择的是 ${currentAnswer.value}。`;
|
||
showFeedback.value = true;
|
||
if (isCorrect.value) {
|
||
playAudio(`太棒了,正确答案是 ${currentGame.value.answer}`);
|
||
}
|
||
}
|
||
};
|
||
|
||
// 检查英语答案
|
||
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 };
|
||
let starsPerQuestion = 1;
|
||
if (subject === 'math' || subject === 'chinese' || subject === 'english') {
|
||
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} 颗星星能量!`
|
||
: `Try again! You selected ${option}.`;
|
||
showFeedback.value = true;
|
||
if (isCorrect.value) {
|
||
playAudio(`Great! Correct! The correct answer is ${currentGame.value.answer}`);
|
||
}
|
||
};
|
||
|
||
// 检查科学答案
|
||
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 };
|
||
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 = `实验成功!你真棒!正确答案是 ${currentGame.value.answer}。获得 ${starsPerQuestion} 颗星星能量!`;
|
||
showFeedback.value = true;
|
||
playAudio(`太棒了,正确答案是 ${currentGame.value.answer}`);
|
||
};
|
||
|
||
// 检查日语答案
|
||
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 };
|
||
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} 颗星星能量!`
|
||
: `もう一度やってみて!你选择的是 ${option}。`;
|
||
showFeedback.value = true;
|
||
if (isCorrect.value) {
|
||
playAudio(`すごい!正确答案是 ${currentGame.value.answer}`);
|
||
}
|
||
};
|
||
|
||
// 检查地理答案
|
||
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 };
|
||
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} 颗星星能量!`
|
||
: `再试一次,加油!你选择的是 ${option}。`;
|
||
showFeedback.value = true;
|
||
if (isCorrect.value) {
|
||
playAudio(`太棒了,正确答案是 ${currentGame.value.answer}`);
|
||
}
|
||
};
|
||
|
||
// 选择语文偏旁
|
||
const selectPart = (part: string) => {
|
||
currentAnswer.value += part;
|
||
};
|
||
|
||
// 使用科学实验物品
|
||
const useItem = (item: any) => {
|
||
experimentResult.value = item.result;
|
||
};
|
||
|
||
// 下一题
|
||
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 };
|
||
|
||
// 计算每题的星星奖励(降低获得量)
|
||
let starsPerQuestion = 1;
|
||
if (subject === 'math' || subject === 'chinese' || subject === 'english' || subject === 'japanese' || subject === 'geography') {
|
||
// 降低数学、语文、英语、日语、地理的奖励获得量
|
||
// 总奖励为5,分成20题,每题0.25颗,向上取整为1颗
|
||
starsPerQuestion = Math.ceil((task.reward || 5) / 20); // 20题任务
|
||
} else if (subject === 'science') {
|
||
// 降低科学的奖励获得量
|
||
// 总奖励为8-12,分成10题,每题0.8-1.2颗,向上取整为1颗
|
||
starsPerQuestion = Math.ceil((task.reward || 5) / 15); // 15题任务的计算方式,降低获得量
|
||
}
|
||
|
||
// 添加星星能量
|
||
starEnergyStore.addEnergy(starsPerQuestion, 'knowledge');
|
||
|
||
// 更新进度
|
||
const taskType = currentGame.value.taskType;
|
||
|
||
// 更新学科进度
|
||
switch (subject) {
|
||
case 'math':
|
||
if (progress.value.math[taskType]) {
|
||
progress.value.math[taskType]++;
|
||
}
|
||
break;
|
||
case 'chinese':
|
||
if (progress.value.chinese[taskType]) {
|
||
progress.value.chinese[taskType]++;
|
||
}
|
||
break;
|
||
case 'english':
|
||
if (progress.value.english[taskType]) {
|
||
progress.value.english[taskType]++;
|
||
}
|
||
break;
|
||
case 'science':
|
||
if (progress.value.science[taskType]) {
|
||
progress.value.science[taskType]++;
|
||
}
|
||
break;
|
||
case 'japanese':
|
||
if (progress.value.japanese[taskType]) {
|
||
progress.value.japanese[taskType]++;
|
||
}
|
||
break;
|
||
case 'geography':
|
||
if (progress.value.geography[taskType]) {
|
||
progress.value.geography[taskType]++;
|
||
}
|
||
break;
|
||
}
|
||
|
||
// 更新每日完成记录
|
||
if (dailyProgress.value.completed[subject] !== undefined) {
|
||
dailyProgress.value.completed[subject]++;
|
||
}
|
||
|
||
// 保存进度
|
||
saveProgress();
|
||
|
||
// 检查是否达到每日上限
|
||
if (isDailyLimitReached(subject)) {
|
||
const subjectName = subject === 'math' ? '数学' : subject === 'chinese' ? '语文' : subject === 'english' ? '英语' : subject === 'japanese' ? '日语' : subject === 'geography' ? '地理' : '科学';
|
||
const limit = dailyLimits[subject] || 25;
|
||
alert(`今日${subjectName}题目已达上限(${limit}题),明天再来挑战吧!`);
|
||
currentGame.value = null;
|
||
return;
|
||
}
|
||
|
||
currentQuestionIndex.value++;
|
||
|
||
let gameDataSubject: any = null;
|
||
|
||
switch (subject) {
|
||
case 'math':
|
||
gameDataSubject = gameData.math[taskType];
|
||
break;
|
||
case 'chinese':
|
||
gameDataSubject = gameData.chinese[taskType];
|
||
break;
|
||
case 'english':
|
||
gameDataSubject = gameData.english[taskType];
|
||
break;
|
||
case 'science':
|
||
gameDataSubject = gameData.science[taskType];
|
||
break;
|
||
case 'japanese':
|
||
gameDataSubject = gameData.japanese[taskType];
|
||
break;
|
||
case 'geography':
|
||
gameDataSubject = gameData.geography[taskType];
|
||
break;
|
||
default:
|
||
gameDataSubject = gameData[subject];
|
||
}
|
||
|
||
if (gameDataSubject && currentQuestionIndex.value < gameDataSubject.length) {
|
||
const questionData = gameDataSubject[currentQuestionIndex.value];
|
||
let shuffledOptions = null;
|
||
let shuffledAnswer = questionData.answer;
|
||
|
||
// 如果有选项,随机打乱顺序
|
||
if (questionData.options) {
|
||
// 创建选项的副本并打乱
|
||
shuffledOptions = [...questionData.options];
|
||
for (let i = shuffledOptions.length - 1; i > 0; i--) {
|
||
const j = Math.floor(Math.random() * (i + 1));
|
||
[shuffledOptions[i], shuffledOptions[j]] = [shuffledOptions[j], shuffledOptions[i]];
|
||
}
|
||
}
|
||
|
||
currentGame.value = {
|
||
subject,
|
||
taskIndex,
|
||
taskType,
|
||
question: questionData.question,
|
||
options: shuffledOptions || questionData.options,
|
||
parts: questionData.parts,
|
||
items: questionData.items,
|
||
answer: shuffledAnswer,
|
||
audio: questionData.audio
|
||
};
|
||
showFeedback.value = false;
|
||
currentAnswer.value = '';
|
||
experimentResult.value = '';
|
||
} else {
|
||
// 完成所有题目
|
||
if (task) {
|
||
task.completed = true;
|
||
}
|
||
alert(`任务完成!`);
|
||
currentGame.value = null;
|
||
}
|
||
};
|
||
</script>
|
||
|
||
<style scoped>
|
||
.knowledge-area {
|
||
padding: 30px 20px;
|
||
min-height: calc(100vh - 200px);
|
||
background: linear-gradient(135deg, #FFF5E6 0%, #FFE4E1 50%, #E0F7FA 100%);
|
||
border-radius: 30px;
|
||
margin: 10px;
|
||
box-shadow: 0 10px 30px rgba(255, 182, 193, 0.3);
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
|
||
/* 魔法装饰 */
|
||
.magic-decor {
|
||
position: absolute;
|
||
font-size: 24px;
|
||
animation: magicFloat 3s ease-in-out infinite;
|
||
pointer-events: none;
|
||
z-index: 1;
|
||
}
|
||
|
||
.star-1 { top: 50px; left: 30px; animation-delay: 0s; }
|
||
.star-2 { top: 80px; right: 50px; animation-delay: 0.5s; }
|
||
.star-3 { top: 200px; left: 80px; animation-delay: 1s; }
|
||
.star-4 { bottom: 150px; right: 100px; animation-delay: 1.5s; }
|
||
.star-5 { bottom: 100px; left: 150px; animation-delay: 2s; }
|
||
|
||
@keyframes magicFloat {
|
||
0%, 100% {
|
||
transform: translateY(0) scale(1) rotate(0deg);
|
||
opacity: 0.8;
|
||
}
|
||
50% {
|
||
transform: translateY(-15px) scale(1.2) rotate(180deg);
|
||
opacity: 1;
|
||
}
|
||
}
|
||
|
||
/* 库洛米向导 */
|
||
.guide-character {
|
||
position: absolute;
|
||
top: 20px;
|
||
right: 20px;
|
||
display: flex;
|
||
align-items: flex-end;
|
||
gap: 10px;
|
||
z-index: 10;
|
||
}
|
||
|
||
.guide-avatar {
|
||
font-size: 50px;
|
||
animation: guideBounce 2s ease-in-out infinite;
|
||
filter: drop-shadow(0 4px 8px rgba(147, 112, 219, 0.5));
|
||
}
|
||
|
||
.guide-bubble {
|
||
background: white;
|
||
border-radius: 20px;
|
||
padding: 12px 16px;
|
||
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
|
||
position: relative;
|
||
max-width: 200px;
|
||
}
|
||
|
||
.guide-bubble::before {
|
||
content: '';
|
||
position: absolute;
|
||
bottom: -10px;
|
||
left: 20px;
|
||
border-width: 10px 10px 0;
|
||
border-style: solid;
|
||
border-color: white transparent transparent transparent;
|
||
}
|
||
|
||
.guide-bubble p {
|
||
margin: 0;
|
||
font-size: 13px;
|
||
color: #666;
|
||
line-height: 1.4;
|
||
font-family: var(--cartoon-font);
|
||
}
|
||
|
||
@keyframes guideBounce {
|
||
0%, 100% { transform: translateY(0); }
|
||
50% { transform: translateY(-10px); }
|
||
}
|
||
|
||
.area-header {
|
||
text-align: center;
|
||
margin-bottom: 40px;
|
||
position: relative;
|
||
z-index: 5;
|
||
}
|
||
|
||
.header-decoration {
|
||
font-size: 28px;
|
||
margin: 10px 0;
|
||
animation: sparkle 2s ease-in-out infinite;
|
||
}
|
||
|
||
.header-decoration:nth-child(2) {
|
||
animation-delay: 1s;
|
||
}
|
||
|
||
@keyframes sparkle {
|
||
0%, 100% {
|
||
transform: scale(1);
|
||
opacity: 1;
|
||
}
|
||
50% {
|
||
transform: scale(1.1);
|
||
opacity: 0.8;
|
||
}
|
||
}
|
||
|
||
.area-title {
|
||
font-size: 32px;
|
||
font-weight: 900;
|
||
background: linear-gradient(135deg, #FF69B4, #9370DB, #FF69B4);
|
||
background-size: 200% 200%;
|
||
-webkit-background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
background-clip: text;
|
||
margin-bottom: 15px;
|
||
font-family: var(--cartoon-font);
|
||
animation: titleGlow 3s linear infinite;
|
||
letter-spacing: 2px;
|
||
}
|
||
|
||
@keyframes titleGlow {
|
||
0% { background-position: 0% 50%; }
|
||
100% { background-position: 200% 50%; }
|
||
}
|
||
|
||
.area-desc {
|
||
font-size: 18px;
|
||
color: #666;
|
||
margin: 0;
|
||
background: white;
|
||
display: inline-block;
|
||
padding: 10px 25px;
|
||
border-radius: 25px;
|
||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
|
||
font-family: var(--cartoon-font);
|
||
}
|
||
|
||
.subjects {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: 20px;
|
||
margin-bottom: 30px;
|
||
position: relative;
|
||
z-index: 5;
|
||
}
|
||
|
||
.subject-card {
|
||
background: white;
|
||
border-radius: 25px;
|
||
padding: 25px 20px;
|
||
text-align: center;
|
||
cursor: pointer;
|
||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
|
||
position: relative;
|
||
overflow: hidden;
|
||
border: 3px solid transparent;
|
||
}
|
||
|
||
.subject-card::before {
|
||
content: '';
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
right: 0;
|
||
height: 5px;
|
||
border-radius: 25px 25px 0 0;
|
||
animation: rainbowBorder 3s linear infinite;
|
||
}
|
||
|
||
@keyframes rainbowBorder {
|
||
0% { background: #FF69B4; }
|
||
33% { background: #9370DB; }
|
||
66% { background: #FFA500; }
|
||
100% { background: #FF69B4; }
|
||
}
|
||
|
||
.subject-card:hover {
|
||
transform: translateY(-10px) scale(1.05);
|
||
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.2);
|
||
}
|
||
|
||
.subject-card.math::before { background: linear-gradient(90deg, #FF69B4, #FFB6C1); }
|
||
.subject-card.chinese::before { background: linear-gradient(90deg, #9370DB, #DDA0DD); }
|
||
.subject-card.english::before { background: linear-gradient(90deg, #87CEEB, #4682B4); }
|
||
.subject-card.science::before { background: linear-gradient(90deg, #98FB98, #32CD32); }
|
||
.subject-card.geography::before { background: linear-gradient(90deg, #FFA500, #FFD700); }
|
||
|
||
.subject-icon {
|
||
font-size: 50px;
|
||
margin-bottom: 10px;
|
||
display: inline-block;
|
||
animation: iconFloat 2s ease-in-out infinite;
|
||
filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
|
||
}
|
||
|
||
@keyframes iconFloat {
|
||
0%, 100% { transform: translateY(0) rotate(0deg); }
|
||
50% { transform: translateY(-8px) rotate(5deg); }
|
||
}
|
||
|
||
.subject-emoji {
|
||
font-size: 40px;
|
||
margin: 10px 0;
|
||
animation: emojiBounce 1.5s ease-in-out infinite;
|
||
}
|
||
|
||
@keyframes emojiBounce {
|
||
0%, 100% { transform: scale(1); }
|
||
50% { transform: scale(1.2); }
|
||
}
|
||
|
||
.subject-title {
|
||
font-size: 20px;
|
||
font-weight: 900;
|
||
margin-bottom: 8px;
|
||
color: #333;
|
||
font-family: var(--cartoon-font);
|
||
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.subject-desc {
|
||
font-size: 14px;
|
||
color: #666;
|
||
margin: 0 0 10px 0;
|
||
font-family: var(--cartoon-font);
|
||
}
|
||
|
||
.subject-reward {
|
||
display: inline-block;
|
||
background: linear-gradient(135deg, #FFD700, #FFA500);
|
||
color: white;
|
||
padding: 6px 15px;
|
||
border-radius: 15px;
|
||
font-size: 13px;
|
||
font-weight: bold;
|
||
font-family: var(--cartoon-font);
|
||
box-shadow: 0 4px 8px rgba(255, 165, 0, 0.3);
|
||
animation: rewardPulse 2s ease-in-out infinite;
|
||
}
|
||
|
||
@keyframes rewardPulse {
|
||
0%, 100% { transform: scale(1); }
|
||
50% { transform: scale(1.05); }
|
||
}
|
||
|
||
/* 移除旧的图标样式,使用新的emoji图标 */
|
||
.math-icon,
|
||
.chinese-icon,
|
||
.english-icon,
|
||
.science-icon {
|
||
display: none;
|
||
}
|
||
|
||
.subject-title {
|
||
font-size: 16px;
|
||
font-weight: bold;
|
||
margin-bottom: 5px;
|
||
color: #333;
|
||
}
|
||
|
||
.subject-desc {
|
||
font-size: 14px;
|
||
color: #666;
|
||
margin: 0;
|
||
}
|
||
|
||
.subject-content {
|
||
background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(255, 182, 193, 0.9));
|
||
border-radius: 25px;
|
||
padding: 25px;
|
||
box-shadow: 0 10px 30px rgba(255, 105, 180, 0.2);
|
||
border: 3px solid rgba(255, 255, 255, 0.6);
|
||
backdrop-filter: blur(10px);
|
||
}
|
||
|
||
.content-header {
|
||
display: flex;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
margin-bottom: 25px;
|
||
padding-bottom: 15px;
|
||
border-bottom: 3px dashed rgba(255, 105, 180, 0.3);
|
||
}
|
||
|
||
.content-title {
|
||
font-size: 24px;
|
||
font-weight: 900;
|
||
background: linear-gradient(135deg, #FF69B4, #9370DB);
|
||
-webkit-background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
background-clip: text;
|
||
margin: 0;
|
||
font-family: var(--cartoon-font);
|
||
animation: titleFloat 2s ease-in-out infinite;
|
||
}
|
||
|
||
@keyframes titleFloat {
|
||
0%, 100% { transform: translateY(0); }
|
||
50% { transform: translateY(-3px); }
|
||
}
|
||
|
||
.back-btn {
|
||
background: linear-gradient(135deg, #FF69B4, #9370DB);
|
||
color: white;
|
||
border: none;
|
||
padding: 10px 20px;
|
||
border-radius: 25px;
|
||
font-size: 16px;
|
||
font-weight: bold;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
box-shadow: 0 4px 10px rgba(255, 105, 180, 0.4);
|
||
font-family: var(--cartoon-font);
|
||
animation: wiggle 2s ease-in-out infinite;
|
||
}
|
||
|
||
.back-btn:hover {
|
||
transform: translateY(-3px) scale(1.05);
|
||
box-shadow: 0 6px 15px rgba(255, 105, 180, 0.5);
|
||
}
|
||
|
||
@keyframes wiggle {
|
||
0%, 100% { transform: rotate(0deg); }
|
||
25% { transform: rotate(3deg); }
|
||
75% { transform: rotate(-3deg); }
|
||
}
|
||
|
||
.tasks {
|
||
display: flex;
|
||
flex-direction: column;
|
||
gap: 15px;
|
||
}
|
||
|
||
.daily-progress {
|
||
background: linear-gradient(135deg, #FFD166, #06D6A0);
|
||
border-radius: 15px;
|
||
padding: 20px;
|
||
margin-bottom: 20px;
|
||
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.daily-progress h4 {
|
||
margin: 0 0 15px 0;
|
||
color: #006400;
|
||
font-size: 18px;
|
||
font-weight: bold;
|
||
}
|
||
|
||
.progress-bar {
|
||
width: 100%;
|
||
height: 20px;
|
||
background: rgba(255, 255, 255, 0.5);
|
||
border-radius: 10px;
|
||
overflow: hidden;
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
.progress-fill {
|
||
height: 100%;
|
||
background: linear-gradient(90deg, #FF6B6B, #4ECDC4);
|
||
border-radius: 10px;
|
||
transition: width 0.3s ease;
|
||
}
|
||
|
||
.progress-text {
|
||
font-size: 14px;
|
||
font-weight: bold;
|
||
color: #006400;
|
||
text-align: right;
|
||
display: block;
|
||
}
|
||
|
||
.task-card {
|
||
display: flex;
|
||
align-items: center;
|
||
background: white;
|
||
border-radius: 20px;
|
||
padding: 20px;
|
||
box-shadow: 0 6px 15px rgba(0, 0, 0, 0.1);
|
||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||
border: 3px solid #FFE4E1;
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.task-card::before {
|
||
content: '';
|
||
position: absolute;
|
||
top: 0;
|
||
left: 0;
|
||
width: 100%;
|
||
height: 100%;
|
||
background: linear-gradient(135deg, transparent, rgba(255, 105, 180, 0.1));
|
||
opacity: 0;
|
||
transition: opacity 0.3s ease;
|
||
pointer-events: none;
|
||
z-index: 0;
|
||
}
|
||
|
||
.task-card:hover {
|
||
transform: translateX(10px) translateY(-5px);
|
||
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
|
||
border-color: #FF69B4;
|
||
}
|
||
|
||
.task-card:hover::before {
|
||
opacity: 1;
|
||
}
|
||
|
||
.task-icon {
|
||
font-size: 45px;
|
||
margin-right: 20px;
|
||
width: 60px;
|
||
text-align: center;
|
||
animation: taskIconBounce 2s ease-in-out infinite;
|
||
flex-shrink: 0;
|
||
position: relative;
|
||
z-index: 1;
|
||
}
|
||
|
||
@keyframes taskIconBounce {
|
||
0%, 100% { transform: scale(1) rotate(0deg); }
|
||
50% { transform: scale(1.1) rotate(5deg); }
|
||
}
|
||
|
||
.task-info {
|
||
flex: 1;
|
||
position: relative;
|
||
z-index: 1;
|
||
}
|
||
|
||
.task-title {
|
||
font-size: 18px;
|
||
font-weight: 900;
|
||
color: #333;
|
||
margin-bottom: 8px;
|
||
font-family: var(--cartoon-font);
|
||
}
|
||
|
||
.task-desc {
|
||
font-size: 14px;
|
||
color: #666;
|
||
margin-bottom: 12px;
|
||
line-height: 1.5;
|
||
font-family: var(--cartoon-font);
|
||
}
|
||
|
||
.task-reward {
|
||
display: inline-flex;
|
||
align-items: center;
|
||
background: linear-gradient(135deg, #FFD700, #FFA500);
|
||
color: white;
|
||
padding: 6px 12px;
|
||
border-radius: 15px;
|
||
font-size: 14px;
|
||
font-weight: bold;
|
||
font-family: var(--cartoon-font);
|
||
box-shadow: 0 3px 8px rgba(255, 165, 0, 0.3);
|
||
animation: rewardGlow 2s ease-in-out infinite;
|
||
}
|
||
|
||
@keyframes rewardGlow {
|
||
0%, 100% {
|
||
box-shadow: 0 3px 8px rgba(255, 165, 0, 0.3);
|
||
}
|
||
50% {
|
||
box-shadow: 0 5px 15px rgba(255, 165, 0, 0.5);
|
||
}
|
||
}
|
||
|
||
.reward-icon {
|
||
font-size: 16px;
|
||
margin-right: 5px;
|
||
animation: starSpin 3s linear infinite;
|
||
}
|
||
|
||
@keyframes starSpin {
|
||
from { transform: rotate(0deg); }
|
||
to { transform: rotate(360deg); }
|
||
}
|
||
|
||
.task-btn {
|
||
background: linear-gradient(135deg, #98FB98, #32CD32);
|
||
color: white;
|
||
border: none;
|
||
padding: 10px 20px;
|
||
border-radius: 20px;
|
||
font-size: 14px;
|
||
font-weight: bold;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
box-shadow: 0 4px 10px rgba(50, 205, 50, 0.4);
|
||
font-family: var(--cartoon-font);
|
||
flex-shrink: 0;
|
||
position: relative;
|
||
z-index: 1;
|
||
}
|
||
|
||
.task-btn:hover {
|
||
transform: scale(1.05);
|
||
box-shadow: 0 6px 15px rgba(50, 205, 50, 0.5);
|
||
}
|
||
|
||
.task-btn:disabled {
|
||
background: #ccc;
|
||
cursor: not-allowed;
|
||
}
|
||
|
||
/* 游戏内容样式 */
|
||
.game-content {
|
||
margin-top: 25px;
|
||
padding: 30px;
|
||
background: linear-gradient(135deg, rgba(255, 255, 255, 0.98), rgba(255, 182, 193, 0.95));
|
||
border-radius: 25px;
|
||
box-shadow: 0 10px 30px rgba(255, 105, 180, 0.25);
|
||
border: 3px solid rgba(255, 255, 255, 0.6);
|
||
position: relative;
|
||
overflow: hidden;
|
||
}
|
||
|
||
.game-content::before {
|
||
content: '✨';
|
||
position: absolute;
|
||
top: 10px;
|
||
right: 10px;
|
||
font-size: 24px;
|
||
animation: sparkleFloat 2s ease-in-out infinite;
|
||
}
|
||
|
||
@keyframes sparkleFloat {
|
||
0%, 100% {
|
||
transform: translateY(0) rotate(0deg);
|
||
opacity: 0.6;
|
||
}
|
||
50% {
|
||
transform: translateY(-10px) rotate(180deg);
|
||
opacity: 1;
|
||
}
|
||
}
|
||
|
||
.game-question {
|
||
margin-bottom: 25px;
|
||
text-align: center;
|
||
}
|
||
|
||
.question-with-audio {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: 15px;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.game-question h4 {
|
||
font-size: 22px;
|
||
font-weight: 900;
|
||
background: linear-gradient(135deg, #FF69B4, #9370DB);
|
||
-webkit-background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
background-clip: text;
|
||
margin: 0;
|
||
font-family: var(--cartoon-font);
|
||
text-shadow: none;
|
||
}
|
||
|
||
.audio-btn {
|
||
background: linear-gradient(135deg, #FFD166, #06D6A0);
|
||
border: none;
|
||
width: 45px;
|
||
height: 45px;
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 20px;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.15);
|
||
animation: audioWiggle 2s ease-in-out infinite;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.audio-btn:hover {
|
||
transform: scale(1.15) rotate(15deg);
|
||
box-shadow: 0 6px 15px rgba(0, 0, 0, 0.2);
|
||
}
|
||
|
||
@keyframes audioWiggle {
|
||
0%, 100% { transform: rotate(0deg); }
|
||
25% { transform: rotate(5deg); }
|
||
75% { transform: rotate(-5deg); }
|
||
}
|
||
|
||
/* 数学游戏样式 */
|
||
.answer-options {
|
||
display: grid;
|
||
grid-template-columns: repeat(2, 1fr);
|
||
gap: 15px;
|
||
margin-bottom: 25px;
|
||
}
|
||
|
||
.option-btn {
|
||
background: linear-gradient(135deg, #FFE4E1, #FFB6C1);
|
||
border: 3px solid #FF69B4;
|
||
padding: 20px;
|
||
border-radius: 20px;
|
||
font-size: 24px;
|
||
font-weight: 900;
|
||
cursor: pointer;
|
||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
font-family: var(--cartoon-font);
|
||
box-shadow: 0 6px 15px rgba(255, 105, 180, 0.3);
|
||
color: #333;
|
||
}
|
||
|
||
.part-audio-btn {
|
||
background: linear-gradient(135deg, #FFD166, #06D6A0);
|
||
border: none;
|
||
width: 35px;
|
||
height: 35px;
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 16px;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.part-audio-btn:hover {
|
||
transform: scale(1.1) rotate(15deg);
|
||
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
|
||
}
|
||
|
||
.item-name-with-audio {
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 10px;
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
.option-btn:hover {
|
||
background: linear-gradient(135deg, #FF69B4, #9370DB);
|
||
color: white;
|
||
transform: translateY(-8px) scale(1.05);
|
||
box-shadow: 0 10px 25px rgba(255, 105, 180, 0.4);
|
||
}
|
||
|
||
/* 游戏反馈 */
|
||
.game-feedback {
|
||
text-align: center;
|
||
padding: 20px;
|
||
border-radius: 20px;
|
||
margin-top: 20px;
|
||
}
|
||
|
||
.feedback-message {
|
||
font-size: 20px;
|
||
font-weight: 900;
|
||
margin-bottom: 15px;
|
||
font-family: var(--cartoon-font);
|
||
animation: feedbackBounce 0.5s ease;
|
||
}
|
||
|
||
@keyframes feedbackBounce {
|
||
0% { transform: scale(0.8); opacity: 0; }
|
||
50% { transform: scale(1.1); }
|
||
100% { transform: scale(1); opacity: 1; }
|
||
}
|
||
|
||
.feedback-message.correct {
|
||
background: linear-gradient(135deg, #98FB98, #32CD32);
|
||
color: white;
|
||
padding: 15px 25px;
|
||
border-radius: 20px;
|
||
display: inline-block;
|
||
box-shadow: 0 6px 15px rgba(50, 205, 50, 0.4);
|
||
}
|
||
|
||
.feedback-message.incorrect {
|
||
background: linear-gradient(135deg, #FF6B6B, #EE5A5A);
|
||
color: white;
|
||
padding: 15px 25px;
|
||
border-radius: 20px;
|
||
display: inline-block;
|
||
box-shadow: 0 6px 15px rgba(255, 107, 107, 0.4);
|
||
}
|
||
|
||
.next-btn {
|
||
background: linear-gradient(135deg, #667eea, #764ba2);
|
||
color: white;
|
||
border: none;
|
||
padding: 12px 30px;
|
||
border-radius: 25px;
|
||
font-size: 18px;
|
||
font-weight: bold;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
box-shadow: 0 6px 15px rgba(102, 126, 234, 0.4);
|
||
font-family: var(--cartoon-font);
|
||
animation: pulse 2s ease-in-out infinite;
|
||
}
|
||
|
||
.next-btn:hover {
|
||
transform: translateY(-3px) scale(1.05);
|
||
box-shadow: 0 10px 25px rgba(102, 126, 234, 0.5);
|
||
}
|
||
|
||
@keyframes pulse {
|
||
0%, 100% { transform: scale(1); }
|
||
50% { transform: scale(1.05); }
|
||
}
|
||
|
||
/* 语文游戏样式 */
|
||
.character-parts {
|
||
display: flex;
|
||
justify-content: center;
|
||
|
||
gap: 15px;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.part {
|
||
background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
|
||
width: 60px;
|
||
height: 60px;
|
||
border-radius: 10px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 24px;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.part:hover {
|
||
transform: scale(1.1);
|
||
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
|
||
}
|
||
|
||
.current-answer {
|
||
text-align: center;
|
||
margin-bottom: 20px;
|
||
font-size: 18px;
|
||
}
|
||
|
||
.current-answer .answer {
|
||
font-weight: bold;
|
||
color: #667eea;
|
||
margin-left: 10px;
|
||
font-size: 24px;
|
||
}
|
||
|
||
/* 语文游戏选项按钮样式 */
|
||
.chinese-game .word-options {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 15px;
|
||
justify-content: center;
|
||
margin: 25px 0;
|
||
}
|
||
|
||
.chinese-game .option-btn {
|
||
background: linear-gradient(135deg, #FFE4E1, #FFB6C1);
|
||
border: 3px solid #FF69B4;
|
||
padding: 20px 30px;
|
||
border-radius: 20px;
|
||
font-size: 24px;
|
||
font-weight: 900;
|
||
cursor: pointer;
|
||
transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
gap: 15px;
|
||
min-width: 150px;
|
||
box-shadow: 0 6px 15px rgba(255, 105, 180, 0.3);
|
||
color: #333;
|
||
}
|
||
|
||
.chinese-game .option-btn:hover {
|
||
background: linear-gradient(135deg, #FF69B4, #9370DB);
|
||
color: white;
|
||
transform: translateY(-8px) scale(1.05);
|
||
box-shadow: 0 10px 25px rgba(255, 105, 180, 0.5);
|
||
}
|
||
|
||
.chinese-game .part-audio-btn {
|
||
background: #FF69B4;
|
||
color: white;
|
||
border: none;
|
||
border-radius: 50%;
|
||
width: 35px;
|
||
height: 35px;
|
||
font-size: 16px;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
.chinese-game .part-audio-btn:hover {
|
||
background: #9370DB;
|
||
transform: scale(1.15);
|
||
}
|
||
|
||
|
||
/* 音频按钮样式 */
|
||
.question-with-audio {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: 15px;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
.audio-btn {
|
||
background: linear-gradient(135deg, #FFD166, #06D6A0);
|
||
border: none;
|
||
width: 40px;
|
||
height: 40px;
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 18px;
|
||
cursor: pointer;
|
||
transition: var(--transition);
|
||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
||
}
|
||
|
||
.audio-btn:hover {
|
||
transform: scale(1.1) rotate(10deg);
|
||
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.2);
|
||
}
|
||
|
||
.part-audio-btn {
|
||
background: rgba(255, 255, 255, 0.8);
|
||
border: 2px solid #FF6B6B;
|
||
width: 24px;
|
||
height: 24px;
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 12px;
|
||
cursor: pointer;
|
||
transition: var(--transition);
|
||
margin-top: 5px;
|
||
}
|
||
|
||
.part-audio-btn:hover {
|
||
background: #FF6B6B;
|
||
color: white;
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
.option-audio-btn {
|
||
background: rgba(255, 255, 255, 0.8);
|
||
border: 2px solid #4ECDC4;
|
||
width: 24px;
|
||
height: 24px;
|
||
border-radius: 50%;
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
font-size: 12px;
|
||
cursor: pointer;
|
||
transition: var(--transition);
|
||
margin-left: 10px;
|
||
}
|
||
|
||
.option-audio-btn:hover {
|
||
background: #4ECDC4;
|
||
color: white;
|
||
transform: scale(1.1);
|
||
}
|
||
|
||
.part {
|
||
position: relative;
|
||
}
|
||
|
||
.option-btn {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
}
|
||
|
||
|
||
/* 英语游戏样式 */
|
||
.word-options {
|
||
display: flex;
|
||
flex-wrap: wrap;
|
||
gap: 10px;
|
||
justify-content: center;
|
||
margin-bottom: 20px;
|
||
}
|
||
|
||
/* 科学游戏样式 */
|
||
.experiment-area {
|
||
display: flex;
|
||
justify-content: space-around;
|
||
margin-bottom: 20px;
|
||
flex-wrap: wrap;
|
||
gap: 15px;
|
||
}
|
||
|
||
.experiment-item {
|
||
background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
|
||
padding: 15px;
|
||
border-radius: 10px;
|
||
text-align: center;
|
||
min-width: 100px;
|
||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||
}
|
||
|
||
.item-icon {
|
||
font-size: 32px;
|
||
margin-bottom: 10px;
|
||
}
|
||
|
||
.item-name {
|
||
font-size: 14px;
|
||
font-weight: bold;
|
||
margin-bottom: 10px;
|
||
color: #333;
|
||
}
|
||
|
||
.use-btn {
|
||
background: white;
|
||
border: none;
|
||
padding: 8px 16px;
|
||
border-radius: 20px;
|
||
font-size: 12px;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
.use-btn:hover {
|
||
background: #667eea;
|
||
color: white;
|
||
}
|
||
|
||
.experiment-result {
|
||
background: #f0f8ff;
|
||
padding: 15px;
|
||
border-radius: 10px;
|
||
margin-bottom: 20px;
|
||
text-align: center;
|
||
font-size: 14px;
|
||
color: #333;
|
||
}
|
||
|
||
.result-with-audio {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: center;
|
||
gap: 10px;
|
||
}
|
||
|
||
.result-with-audio p {
|
||
margin: 0;
|
||
flex: 1;
|
||
text-align: left;
|
||
}
|
||
|
||
.result-with-audio .audio-btn {
|
||
flex-shrink: 0;
|
||
}
|
||
|
||
/* 反馈样式 */
|
||
.game-feedback {
|
||
margin-top: 20px;
|
||
padding: 15px;
|
||
border-radius: 10px;
|
||
text-align: center;
|
||
}
|
||
|
||
.feedback-message {
|
||
font-size: 16px;
|
||
font-weight: bold;
|
||
margin-bottom: 15px;
|
||
padding: 10px;
|
||
border-radius: 10px;
|
||
}
|
||
|
||
.feedback-message.correct {
|
||
background: #d4edda;
|
||
color: #155724;
|
||
border: 1px solid #c3e6cb;
|
||
}
|
||
|
||
.feedback-message.incorrect {
|
||
background: #f8d7da;
|
||
color: #721c24;
|
||
border: 1px solid #f5c6cb;
|
||
}
|
||
|
||
.next-btn, .submit-btn {
|
||
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||
color: white;
|
||
border: none;
|
||
padding: 10px 20px;
|
||
border-radius: 20px;
|
||
font-size: 14px;
|
||
cursor: pointer;
|
||
transition: all 0.3s ease;
|
||
}
|
||
|
||
.next-btn:hover, .submit-btn:hover {
|
||
transform: translateY(-2px);
|
||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
||
}
|
||
|
||
/* 响应式设计 */
|
||
@media (max-width: 768px) {
|
||
.answer-options {
|
||
grid-template-columns: 1fr;
|
||
}
|
||
|
||
.character-parts {
|
||
flex-wrap: wrap;
|
||
}
|
||
|
||
.experiment-area {
|
||
flex-direction: column;
|
||
align-items: center;
|
||
}
|
||
|
||
.experiment-item {
|
||
width: 100%;
|
||
max-width: 200px;
|
||
}
|
||
}
|
||
</style> |