小学三年级语文小游戏

"语文小达人·三年级闯关"是一个针对三年级学生的语文学习互动网页应用。该应用采用游戏化设计,提供四种趣味闯关模式:

1)拼音配对(匹配汉字与正确拼音)

2)组词挑战(用给定字组成词语)

3)选词填空(选择合适词语完成句子)

4)反义词配对(识别意思相反的词语)。

界面设计采用卡片式布局和渐变色背景,包含得分统计和连对奖励机制。游戏过程中会即时反馈正确答案,并根据表现给予鼓励性评语。所有题目均围绕三年级语文知识点设计,如"春天"、"认真"等基础词汇,通过拖拽、点击等交互方式完成答题。应用采用响应式设计,适合在不同设备上使用。

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>语文小达人 · 三年级闯关</title>
  <style>
    * { box-sizing: border-box; margin: 0; padding: 0; }

    body {
      font-family: "PingFang SC", "Microsoft YaHei", sans-serif;
      background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
      min-height: 100vh;
      padding: 20px;
      color: #333;
    }

    .container {
      max-width: 680px;
      margin: 0 auto;
    }

    header {
      text-align: center;
      color: #fff;
      margin-bottom: 24px;
    }

    header h1 {
      font-size: 2rem;
      text-shadow: 2px 2px 4px rgba(0,0,0,.2);
      margin-bottom: 8px;
    }

    header p { opacity: .9; font-size: 1rem; }

    .stats {
      display: flex;
      justify-content: center;
      gap: 16px;
      margin-bottom: 20px;
      flex-wrap: wrap;
    }

    .stat {
      background: rgba(255,255,255,.25);
      backdrop-filter: blur(8px);
      color: #fff;
      padding: 8px 20px;
      border-radius: 20px;
      font-weight: bold;
      font-size: .95rem;
    }

    .card {
      background: #fff;
      border-radius: 20px;
      padding: 28px;
      box-shadow: 0 10px 40px rgba(0,0,0,.15);
      margin-bottom: 20px;
    }

    /* 首页 */
    .menu-grid {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 16px;
    }

    .menu-btn {
      border: none;
      border-radius: 16px;
      padding: 24px 16px;
      font-size: 1.1rem;
      font-weight: bold;
      cursor: pointer;
      transition: transform .2s, box-shadow .2s;
      color: #fff;
      font-family: inherit;
    }

    .menu-btn:hover { transform: translateY(-3px); box-shadow: 0 6px 20px rgba(0,0,0,.2); }
    .menu-btn:active { transform: scale(.97); }

    .menu-btn .icon { font-size: 2rem; display: block; margin-bottom: 8px; }
    .menu-btn .desc { font-size: .75rem; opacity: .85; font-weight: normal; margin-top: 4px; }

    .btn-pinyin { background: linear-gradient(135deg, #f7971e, #ffd200); }
    .btn-word   { background: linear-gradient(135deg, #11998e, #38ef7d); }
    .btn-fill   { background: linear-gradient(135deg, #4776e6, #8e54e9); }
    .btn-antonym{ background: linear-gradient(135deg, #eb3349, #f45c43); }

    /* 游戏区 */
    .screen { display: none; }
    .screen.active { display: block; }

    .back-btn {
      background: none;
      border: 2px solid #ddd;
      border-radius: 10px;
      padding: 6px 16px;
      cursor: pointer;
      font-size: .9rem;
      margin-bottom: 16px;
      font-family: inherit;
      color: #666;
    }

    .back-btn:hover { border-color: #667eea; color: #667eea; }

    .question-title {
      font-size: .85rem;
      color: #999;
      margin-bottom: 12px;
    }

    .question-main {
      font-size: 2.2rem;
      text-align: center;
      margin: 20px 0;
      font-weight: bold;
      color: #333;
    }

    .question-hint {
      text-align: center;
      color: #888;
      font-size: 1rem;
      margin-bottom: 20px;
    }

    .options {
      display: grid;
      grid-template-columns: 1fr 1fr;
      gap: 12px;
    }

    .option-btn {
      border: 2px solid #e8e8e8;
      border-radius: 14px;
      padding: 16px;
      font-size: 1.15rem;
      cursor: pointer;
      background: #fafafa;
      transition: all .2s;
      font-family: inherit;
    }

    .option-btn:hover:not(:disabled) {
      border-color: #667eea;
      background: #f0f3ff;
    }

    .option-btn.correct {
      border-color: #38ef7d;
      background: #e8fff0;
      color: #11998e;
    }

    .option-btn.wrong {
      border-color: #f45c43;
      background: #fff0ee;
      color: #eb3349;
    }

    .option-btn:disabled { cursor: default; }

    .feedback {
      text-align: center;
      font-size: 1.1rem;
      margin-top: 16px;
      min-height: 28px;
      font-weight: bold;
    }

    .feedback.good { color: #11998e; }
    .feedback.bad  { color: #eb3349; }

    .next-btn {
      display: block;
      margin: 16px auto 0;
      background: linear-gradient(135deg, #667eea, #764ba2);
      color: #fff;
      border: none;
      border-radius: 12px;
      padding: 12px 40px;
      font-size: 1rem;
      cursor: pointer;
      font-family: inherit;
      font-weight: bold;
    }

    .next-btn:hover { opacity: .9; }

    .progress-bar {
      height: 8px;
      background: #eee;
      border-radius: 4px;
      margin-bottom: 20px;
      overflow: hidden;
    }

    .progress-fill {
      height: 100%;
      background: linear-gradient(90deg, #667eea, #764ba2);
      border-radius: 4px;
      transition: width .4s;
    }

    /* 组词游戏 */
    .char-pool {
      display: flex;
      flex-wrap: wrap;
      gap: 10px;
      justify-content: center;
      margin: 20px 0;
    }

    .char-chip {
      width: 56px;
      height: 56px;
      border: 2px solid #ddd;
      border-radius: 12px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 1.5rem;
      cursor: pointer;
      background: #fff;
      transition: all .2s;
      user-select: none;
    }

    .char-chip:hover:not(.used) { border-color: #667eea; background: #f0f3ff; }
    .char-chip.used { opacity: .3; pointer-events: none; }

    .answer-slots {
      display: flex;
      gap: 12px;
      justify-content: center;
      margin: 16px 0;
    }

    .slot {
      width: 64px;
      height: 64px;
      border: 2px dashed #ccc;
      border-radius: 14px;
      display: flex;
      align-items: center;
      justify-content: center;
      font-size: 1.8rem;
      font-weight: bold;
      cursor: pointer;
      background: #fafafa;
    }

    .slot.filled { border-style: solid; border-color: #667eea; background: #f0f3ff; }

  </style>
</head>
<body>
  <div class="container">
    <header>
      <h1>🌟 语文小达人</h1>
      <p>三年级趣味闯关 · 边玩边学</p>
    </header>

    <div class="stats">
      <div class="stat">⭐ 得分:<span id="score">0</span></div>
      <div class="stat">🏆 连对:<span id="streak">0</span></div>
    </div>

    <!-- 主菜单 -->
    <div id="menu" class="card screen active">
      <div class="menu-grid">
        <button class="menu-btn btn-pinyin" onclick="startGame('pinyin')">
          <span class="icon">🔤</span>拼音配对
          <div class="desc">给汉字找正确拼音</div>
        </button>
        <button class="menu-btn btn-word" onclick="startGame('word')">
          <span class="icon">📝</span>组词挑战
          <div class="desc">用给出的字组成词语</div>
        </button>
        <button class="menu-btn btn-fill" onclick="startGame('fill')">
          <span class="icon">✏️</span>选词填空
          <div class="desc">选词完成句子</div>
        </button>
        <button class="menu-btn btn-antonym" onclick="startGame('antonym')">
          <span class="icon">🔄</span>反义词配对
          <div class="desc">找出意思相反的字词</div>
        </button>
      </div>
    </div>

    <!-- 游戏界面 -->
    <div id="game" class="card screen">
      <button class="back-btn" onclick="goMenu()">← 返回菜单</button>
      <div class="progress-bar"><div class="progress-fill" id="progress"></div></div>
      <div class="question-title" id="qTitle"></div>
      <div class="question-main" id="qMain"></div>
      <div class="question-hint" id="qHint"></div>
      <div id="gameArea"></div>
      <div class="feedback" id="feedback"></div>
      <button class="next-btn" id="nextBtn" style="display:none" onclick="nextQuestion()">下一题 →</button>
    </div>
  </div>

  <script>
    let score = 0, streak = 0, currentMode = '';
    let questions = [], qIndex = 0, answered = false;

    const ENCOURAGE = ['太棒了!🎉', '真厉害!⭐', '答对啦!👏', '语文小达人!🌟', '继续加油!💪'];
    const COMFORT   = ['再想想哦~', '没关系,下次一定行!', '加油,你可以的!'];

    // ===== 题库 =====
    const PINYIN_Q = [
      { char: '翠', answer: 'cuì', options: ['cuì', 'zuì', 'suì', 'chuì'] },
      { char: '融', answer: 'róng', options: ['róng', 'lóng', 'gōng', 'róu'] },
      { char: '翩', answer: 'piān', options: ['piān', 'biān', 'pián', 'piàn'] },
      { char: '漾', answer: 'yàng', options: ['yàng', 'yáng', 'dàng', 'tàng'] },
      { char: '逐', answer: 'zhú', options: ['zhú', 'zhū', 'dú', 'zhǔ'] },
      { char: '胀', answer: 'zhàng', options: ['zhàng', 'zhāng', 'cháng', 'zhǎng'] },
      { char: '蓬', answer: 'péng', options: ['péng', 'bēng', 'fēng', 'pēng'] },
      { char: '蹈', answer: 'dǎo', options: ['dǎo', 'tāo', 'dào', 'chāo'] },
      { char: '挨', answer: 'āi', options: ['āi', 'ái', 'ǎi', 'ài'] },
      { char: '蓬', answer: 'péng', options: ['péng', 'pēn', 'bèng', 'měng'] },
    ];

    const WORD_Q = [
      { chars: ['美', '丽', '好', '漂', '亮', '丽'], answer: '美丽', hint: '形容好看' },
      { chars: ['春', '天', '夏', '暖', '花', '开'], answer: '春天', hint: '一年中的第一个季节' },
      { chars: ['快', '乐', '高', '兴', '欢', '乐'], answer: '快乐', hint: '心情愉快' },
      { chars: ['认', '真', '仔', '细', '用', '心'], answer: '认真', hint: '做事不马虎' },
      { chars: ['温', '暖', '热', '和', '暖', '气'], answer: '温暖', hint: '不冷,让人舒服' },
      { chars: ['聪', '明', '机', '灵', '智', '慧'], answer: '聪明', hint: '头脑灵活' },
      { chars: ['勇', '敢', '胆', '大', '无', '畏'], answer: '勇敢', hint: '不怕困难' },
      { chars: ['骄', '傲', '自', '大', '谦', '虚'], answer: '骄傲', hint: '觉得自己很厉害' },
    ];

    const FILL_Q = [
      { sentence: '春天来了,花儿___了。', answer: '开放', options: ['开放', '关闭', '睡觉', '吃饭'] },
      { sentence: '小明每天___地做作业。', answer: '认真', options: ['认真', '马虎', '随便', '懒惰'] },
      { sentence: '小鸟在天空中自由地___。', answer: '飞翔', options: ['飞翔', '游泳', '爬行', '奔跑'] },
      { sentence: '我们要___父母长辈。', answer: '尊敬', options: ['尊敬', '嘲笑', '忽视', '讨厌'] },
      { sentence: '雨后,天空出现了一道美丽的___。', answer: '彩虹', options: ['彩虹', '闪电', '乌云', '雪花'] },
      { sentence: '图书馆里很___,大家都在看书。', answer: '安静', options: ['安静', '吵闹', '热闹', '混乱'] },
      { sentence: '小兔子长着长长的___。', answer: '耳朵', options: ['耳朵', '尾巴', '翅膀', '牙齿'] },
      { sentence: '他用自己的零花钱___了一本书。', answer: '购买', options: ['购买', '扔掉', '撕毁', '借走'] },
    ];

    const ANTONYM_Q = [
      { word: '高兴', answer: '难过', options: ['难过', '快乐', '开心', '愉快'] },
      { word: '明亮', answer: '黑暗', options: ['黑暗', '光明', '灿烂', '耀眼'] },
      { word: '温暖', answer: '寒冷', options: ['寒冷', '炎热', '凉快', '温和'] },
      { word: '勤劳', answer: '懒惰', options: ['懒惰', '辛苦', '忙碌', '努力'] },
      { word: '谦虚', answer: '骄傲', options: ['骄傲', '低调', '礼貌', '客气'] },
      { word: '勇敢', answer: '胆小', options: ['胆小', '大胆', '无畏', '坚强'] },
      { word: '美丽', answer: '丑陋', options: ['丑陋', '漂亮', '好看', '迷人'] },
      { word: '增加', answer: '减少', options: ['减少', '增多', '扩大', '提高'] },
    ];

    function shuffle(arr) {
      const a = [...arr];
      for (let i = a.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [a[i], a[j]] = [a[j], a[i]];
      }
      return a;
    }

    function updateStats() {
      document.getElementById('score').textContent = score;
      document.getElementById('streak').textContent = streak;
    }

    function showScreen(id) {
      document.querySelectorAll('.screen').forEach(s => s.classList.remove('active'));
      document.getElementById(id).classList.add('active');
    }

    function goMenu() {
      showScreen('menu');
      currentMode = '';
    }

    function startGame(mode) {
      currentMode = mode;
      qIndex = 0;
      answered = false;

      const pools = { pinyin: PINYIN_Q, word: WORD_Q, fill: FILL_Q, antonym: ANTONYM_Q };
      questions = shuffle(pools[mode]).slice(0, 5);

      showScreen('game');
      renderQuestion();
    }

    function renderQuestion() {
      answered = false;
      const q = questions[qIndex];
      const titles = { pinyin: '拼音配对', word: '组词挑战', fill: '选词填空', antonym: '反义词配对' };

      document.getElementById('qTitle').textContent = `${titles[currentMode]} · 第 ${qIndex + 1}/${questions.length} 题`;
      document.getElementById('progress').style.width = `${(qIndex / questions.length) * 100}%`;
      document.getElementById('feedback').textContent = '';
      document.getElementById('feedback').className = 'feedback';
      document.getElementById('nextBtn').style.display = 'none';

      const area = document.getElementById('gameArea');
      area.innerHTML = '';

      if (currentMode === 'pinyin') {
        document.getElementById('qMain').textContent = q.char;
        document.getElementById('qHint').textContent = '请选择正确的拼音';
        renderOptions(q.options, q.answer);
      } else if (currentMode === 'fill') {
        document.getElementById('qMain').textContent = q.sentence.replace('___', '______');
        document.getElementById('qHint').textContent = '选择最合适的词语填入';
        renderOptions(q.options, q.answer);
      } else if (currentMode === 'antonym') {
        document.getElementById('qMain').textContent = q.word;
        document.getElementById('qHint').textContent = '哪个词与它的意思相反?';
        renderOptions(q.options, q.answer);
      } else if (currentMode === 'word') {
        document.getElementById('qMain').textContent = '组词';
        document.getElementById('qHint').textContent = q.hint;
        renderWordGame(q);
      }
    }

    function renderOptions(options, answer) {
      const area = document.getElementById('gameArea');
      const div = document.createElement('div');
      div.className = 'options';
      shuffle(options).forEach(opt => {
        const btn = document.createElement('button');
        btn.className = 'option-btn';
        btn.textContent = opt;
        btn.onclick = () => checkAnswer(opt, answer, btn);
        div.appendChild(btn);
      });
      area.appendChild(div);
    }

    function checkAnswer(selected, answer, btn) {
      if (answered) return;
      answered = true;

      const allBtns = document.querySelectorAll('.option-btn');
      allBtns.forEach(b => {
        b.disabled = true;
        if (b.textContent === answer) b.classList.add('correct');
      });

      const fb = document.getElementById('feedback');
      if (selected === answer) {
        btn.classList.add('correct');
        score += 10 + streak * 2;
        streak++;
        fb.textContent = ENCOURAGE[Math.floor(Math.random() * ENCOURAGE.length)];
        fb.className = 'feedback good';
      } else {
        btn.classList.add('wrong');
        streak = 0;
        fb.textContent = COMFORT[Math.floor(Math.random() * COMFORT.length)] + ` 正确答案:${answer}`;
        fb.className = 'feedback bad';
      }
      updateStats();
      document.getElementById('nextBtn').style.display = 'block';
    }

    // 组词游戏
    let wordSlots = [], wordUsed = [];

    function renderWordGame(q) {
      wordSlots = ['', ''];
      wordUsed = [];
      const area = document.getElementById('gameArea');

      const slotsDiv = document.createElement('div');
      slotsDiv.className = 'answer-slots';
      slotsDiv.id = 'slots';
      for (let i = 0; i < 2; i++) {
        const slot = document.createElement('div');
        slot.className = 'slot';
        slot.dataset.idx = i;
        slot.onclick = () => removeChar(i, q);
        slotsDiv.appendChild(slot);
      }
      area.appendChild(slotsDiv);

      const poolDiv = document.createElement('div');
      poolDiv.className = 'char-pool';
      poolDiv.id = 'charPool';
      shuffle(q.chars).forEach((ch, i) => {
        const chip = document.createElement('div');
        chip.className = 'char-chip';
        chip.textContent = ch;
        chip.dataset.idx = i;
        chip.onclick = () => pickChar(ch, i, q);
        poolDiv.appendChild(chip);
      });
      area.appendChild(poolDiv);
    }

    function pickChar(ch, idx, q) {
      if (answered) return;
      const empty = wordSlots.findIndex(s => s === '');
      if (empty === -1) return;

      wordSlots[empty] = ch;
      wordUsed.push(idx);

      const slots = document.querySelectorAll('.slot');
      slots[empty].textContent = ch;
      slots[empty].classList.add('filled');

      const chips = document.querySelectorAll('.char-chip');
      chips[idx].classList.add('used');

      if (wordSlots.every(s => s !== '')) {
        const formed = wordSlots.join('');
        setTimeout(() => checkWord(formed, q.answer), 300);
      }
    }

    function removeChar(slotIdx, q) {
      if (answered || !wordSlots[slotIdx]) return;
      const ch = wordSlots[slotIdx];
      wordSlots[slotIdx] = '';

      const slots = document.querySelectorAll('.slot');
      slots[slotIdx].textContent = '';
      slots[slotIdx].classList.remove('filled');

      const chips = document.querySelectorAll('.char-chip');
      chips.forEach((chip, i) => {
        if (chip.textContent === ch && chip.classList.contains('used')) {
          const otherUsed = wordSlots.filter(s => s === ch).length;
          const totalUsed = [...wordSlots, ch].filter(s => s === ch).length;
          if (wordUsed.includes(i)) {
            chip.classList.remove('used');
            wordUsed = wordUsed.filter(u => u !== i);
          }
        }
      });
      // 简化:重新渲染字符池状态
      const pool = document.getElementById('charPool');
      pool.querySelectorAll('.char-chip').forEach((chip, i) => {
        chip.classList.toggle('used', wordUsed.includes(i));
      });
    }

    function checkWord(formed, answer) {
      answered = true;
      const fb = document.getElementById('feedback');
      if (formed === answer) {
        score += 10 + streak * 2;
        streak++;
        fb.textContent = ENCOURAGE[Math.floor(Math.random() * ENCOURAGE.length)] + ` 「${answer}」`;
        fb.className = 'feedback good';
      } else {
        streak = 0;
        fb.textContent = COMFORT[0] + ` 正确答案是「${answer}」`;
        fb.className = 'feedback bad';
      }
      updateStats();
      document.getElementById('nextBtn').style.display = 'block';
    }

    function nextQuestion() {
      qIndex++;
      if (qIndex >= questions.length) {
        const msg = score >= 40 ? '🏆 闯关成功!你是语文小达人!' : '💪 继续加油,下次一定能拿高分!';
        document.getElementById('qMain').textContent = msg;
        document.getElementById('qHint').textContent = `本次得分:${score} 分`;
        document.getElementById('gameArea').innerHTML = '';
        document.getElementById('feedback').textContent = '';
        document.getElementById('nextBtn').textContent = '再来一轮';
        document.getElementById('nextBtn').onclick = () => {
          document.getElementById('nextBtn').textContent = '下一题 →';
          document.getElementById('nextBtn').onclick = nextQuestion;
          startGame(currentMode);
        };
        document.getElementById('progress').style.width = '100%';
        return;
      }
      renderQuestion();
    }
  </script>
</body>
</html>
相关推荐
Agatha方艺璇2 小时前
前端开发技术复习笔记
vue·bootstrap·css3·html5·web
一只fish4 小时前
一文了解Markdown
html·markdown
weixin_4462608513 小时前
Typora 插件开发实战:基于 JavaScript/HTML 构建定制化 Markdown 扩展
开发语言·javascript·html
sbjdhjd1 天前
Redis 主从复制、哨兵高可用与 Cluster 集群部署实验手册
运维·前端·redis·云原生·开源·bootstrap·html
不懂的浪漫1 天前
AI 时代还需要买课吗?我用 Skills + Markdown + HTML 搭了一套自学系统
前端·人工智能·html·skill
2501_918126911 天前
小圆点踢足球
css·html·css3
dsyyyyy11011 天前
只用HTML和CSS实现换一换效果
前端·css·html
gogoing1 天前
UnoCSS / Tailwind CSS 类名速查文档
css
2501_918126911 天前
火柴人踢任意球
javascript·css·css3