少儿编程逻辑训练AI助手程序
README文件
项目简介
本程序是一款面向少儿的图形化编程逻辑训练AI助手,结合创新思维与战略管理理念,通过积木拖拽编程、实时逻辑检查、引导式提示和成长轨迹记录,培养少儿计算思维与问题解决能力。
核心功能
- 图形化积木编程(控制流、运动、变量、逻辑判断)
- AI实时逻辑错误检测(循环条件、变量作用域、逻辑顺序)
- 引导式提示系统(非直接答案,启发思考)
- 能力成长轨迹记录与分析
- 创新思维训练场景(迷宫挑战、动画创作)
技术栈
- 前端:HTML5/CSS3/JavaScript (ES6+)
- 存储:LocalStorage(本地数据持久化)
- 架构:模块化设计(6大核心模块)
目录结构
├── index.html # 主程序界面
├── style.css # 样式文件
├── script.js # 核心逻辑代码
├── README.md # 项目说明
├── 使用说明.md # 用户操作指南
└── 核心知识点卡片.html # 创新思维知识点库
核心代码实现
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>少儿编程逻辑训练AI助手</title>
<style>
/* 基础样式 - 少儿友好设计 */
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: 'Comic Sans MS', '微软雅黑', sans-serif;
background: linear-gradient(135deg, #e0f7fa 0%, #bbdefb 100%);
min-height: 100vh; padding: 20px; color: #333;
}
.container { max-width: 1200px; margin: 0 auto; }
header { text-align: center; padding: 20px; margin-bottom: 20px; }
h1 { color: #1565c0; font-size: 2.2rem; margin-bottom: 10px; }
.subtitle { color: #5d99c6; font-size: 1.2rem; }
/* 功能区布局 */
.workspace {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 20px;
margin-bottom: 20px;
}
@media (max-width: 768px) {
.workspace { grid-template-columns: 1fr; }
}
/* 积木区样式 */
.blocks-panel {
background: white;
border-radius: 15px;
padding: 15px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
.block-category { margin-bottom: 15px; }
.category-title {
font-weight: bold;
color: #1565c0;
margin-bottom: 10px;
padding-bottom: 5px;
border-bottom: 2px solid #e3f2fd;
}
.block {
background: #e3f2fd;
padding: 10px;
margin: 8px 0;
border-radius: 8px;
cursor: grab;
transition: all 0.2s;
border: 2px dashed #90caf9;
}
.block:hover { background: #bbdefb; transform: translateY(-2px); }
.block.control { border-left: 4px solid #ff9800; }
.block.motion { border-left: 4px solid #4caf50; }
.block.logic { border-left: 4px solid #f44336; }
.block.variable { border-left: 4px solid #9c27b0; }
/* 编程区样式 */
.programming-area {
background: white;
border-radius: 15px;
padding: 20px;
min-height: 400px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
position: relative;
}
.drop-zone {
min-height: 350px;
border: 2px dashed #90caf9;
border-radius: 10px;
padding: 15px;
}
.program-block {
background: #f5f5f5;
padding: 12px;
margin: 10px 0;
border-radius: 8px;
position: relative;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.delete-btn {
position: absolute;
right: 10px;
top: 10px;
cursor: pointer;
color: #f44336;
font-weight: bold;
}
/* 反馈区样式 */
.feedback-panel {
background: white;
border-radius: 15px;
padding: 20px;
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}
.hint-box {
background: #fff8e1;
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
border-left: 4px solid #ffc107;
}
.error-box {
background: #ffebee;
padding: 15px;
border-radius: 8px;
border-left: 4px solid #f44336;
}
.progress-chart {
margin-top: 20px;
height: 150px;
background: #f5f5f5;
border-radius: 8px;
padding: 10px;
display: flex;
align-items: flex-end;
gap: 5px;
}
.chart-bar {
flex: 1;
background: #4caf50;
border-radius: 4px 4px 0 0;
position: relative;
}
.chart-label { position: absolute; bottom: -20px; width: 100%; text-align: center; font-size: 0.8rem; }
/* 按钮样式 */
.btn {
padding: 10px 20px;
border: none;
border-radius: 8px;
cursor: pointer;
font-weight: bold;
transition: all 0.2s;
margin: 5px;
}
.btn-run { background: #4caf50; color: white; }
.btn-reset { background: #f44336; color: white; }
.btn-hint { background: #ff9800; color: white; }
.btn:hover { opacity: 0.9; transform: translateY(-2px); }
/* 动画角色 */
.character {
width: 50px;
height: 50px;
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><circle cx="50" cy="35" r="20" fill="%234CAF50"/><rect x="35" y="55" width="30" height="40" rx="5" fill="%234CAF50"/></svg>') no-repeat center;
position: absolute;
bottom: 20px;
left: 20px;
transition: all 0.5s;
}
.maze {
width: 100%;
height: 300px;
background: #e0e0e0;
border-radius: 8px;
position: relative;
overflow: hidden;
margin-top: 20px;
}
.wall { position: absolute; background: #795548; }
</style>
</head>
<body>
<div class="container">
<header>
<h1>🚀 少儿编程逻辑训练AI助手</h1>
<p class="subtitle">拖拽积木学编程 · AI引导练思维 · 记录成长看得见</p>
</header>
<div class="workspace">
<!-- 积木区 -->
<div class="blocks-panel">
<h2>🧩 编程积木</h2>
<div class="block-category">
<div class="category-title">控制流</div>
<div class="block control" data-type="control" data-value="repeat">重复 3 次 { }</div>
<div class="block control" data-type="control" data-value="if">如果 (条件) { }</div>
<div class="block control" data-type="control" data-value="while">当 (条件) 时重复 { }</div>
</div>
<div class="block-category">
<div class="category-title">运动</div>
<div class="block motion" data-type="motion" data-value="forward">向前走 100 步</div>
<div class="block motion" data-type="motion" data-value="turn">向右转 90°</div>
<div class="block motion" data-type="motion" data-value="jump">跳一下</div>
</div>
<div class="block-category">
<div class="category-title">逻辑判断</div>
<div class="block logic" data-type="logic" data-value="greater">大于 (>)</div>
<div class="block logic" data-type="logic" data-value="equal">等于 (=)</div>
<div class="block logic" data-type="logic" data-value="and">并且 (&&)</div>
</div>
<div class="block-category">
<div class="category-title">变量</div>
<div class="block variable" data-type="variable" data-value="set">设置 分数 = 0</div>
<div class="block variable" data-type="variable" data-value="change">改变 分数 +1</div>
<div class="block variable" data-type="variable" data-value="check">如果 分数 > 5</div>
</div>
</div>
<!-- 编程区 -->
<div class="programming-area">
<h2>✏️ 编程画布</h2>
<div class="drop-zone" id="dropZone">
<p>拖拽左侧积木到这里开始编程...</p>
</div>
<div class="controls">
<button class="btn btn-run" id="runBtn">▶️ 运行程序</button>
<button class="btn btn-reset" id="resetBtn">🔄 重置</button>
<button class="btn btn-hint" id="hintBtn">💡 获取提示</button>
</div>
<!-- 动画场景 -->
<div class="maze" id="maze">
<div class="character" id="character"></div>
<!-- 墙壁由JS动态生成 -->
</div>
</div>
<!-- 反馈区 -->
<div class="feedback-panel">
<h2>🤖 AI助手反馈</h2>
<div class="hint-box" id="hintBox">
<strong>提示:</strong> 尝试用"重复"积木让角色走正方形!
</div>
<div class="error-box" id="errorBox">
<strong>错误检查:</strong> 暂无逻辑错误
</div>
<h3>📈 成长轨迹</h3>
<div class="progress-chart" id="progressChart">
<!-- 进度条由JS动态生成 -->
</div>
<p>已完成任务: <span id="completedTasks">0</span> | 逻辑错误: <span id="errorCount">0</span></p>
</div>
</div>
</div>
<script>
/**
* 少儿编程逻辑训练AI助手 - 核心模块
* 遵循模块化、注释清晰、可扩展性设计原则
*/
// ==================== 模块1: 数据存储模块 ====================
const DataStore = {
// 保存用户编程数据
saveProgram: (blocks) => {
localStorage.setItem('kidProgram', JSON.stringify(blocks));
},
// 加载用户编程数据
loadProgram: () => {
const saved = localStorage.getItem('kidProgram');
return saved ? JSON.parse(saved) : [];
},
// 保存成长轨迹
saveProgress: (progress) => {
localStorage.setItem('kidProgress', JSON.stringify(progress));
},
// 加载成长轨迹
loadProgress: () => {
const saved = localStorage.getItem('kidProgress');
return saved ? JSON.parse(saved) : { completed: 0, errors: 0, tasks: [] };
},
// 更新任务完成状态
updateTaskStatus: (taskId, status) => {
const progress = DataStore.loadProgress();
const taskIndex = progress.tasks.findIndex(t => t.id === taskId);
if (taskIndex >= 0) {
progress.tasks[taskIndex].status = status;
} else {
progress.tasks.push({ id: taskId, status, date: new Date().toISOString() });
}
if (status === 'completed') progress.completed++;
DataStore.saveProgress(progress);
return progress;
}
};
// ==================== 模块2: 积木管理模块 ====================
const BlockManager = {
// 积木类型定义
blockTypes: {
control: ['repeat', 'if', 'while'],
motion: ['forward', 'turn', 'jump'],
logic: ['greater', 'equal', 'and'],
variable: ['set', 'change', 'check']
},
// 创建积木DOM元素
createBlockElement: (type, value) => {
const block = document.createElement('div');
block.className = `program-block ${type}`;
block.dataset.type = type;
block.dataset.value = value;
// 根据积木类型设置内容
const blockTexts = {
'repeat': '重复 3 次 { }',
'if': '如果 (条件) { }',
'while': '当 (条件) 时重复 { }',
'forward': '向前走 100 步',
'turn': '向右转 90°',
'jump': '跳一下',
'greater': '大于 (>)',
'equal': '等于 (=)',
'and': '并且 (&&)',
'set': '设置 分数 = 0',
'change': '改变 分数 +1',
'check': '如果 分数 > 5'
};
block.innerHTML = `
${blockTexts[value] || value}
<span class="delete-btn" onclick="BlockManager.deleteBlock(this)">×</span>
`;
// 添加拖拽事件
block.draggable = true;
block.addEventListener('dragstart', DragDrop.handleDragStart);
return block;
},
// 删除积木
deleteBlock: (element) => {
element.parentElement.remove();
LogicChecker.checkProgram();
},
// 加载保存的程序
loadSavedProgram: () => {
const blocks = DataStore.loadProgram();
const dropZone = document.getElementById('dropZone');
blocks.forEach(blockData => {
const blockEl = BlockManager.createBlockElement(blockData.type, blockData.value);
dropZone.appendChild(blockEl);
});
}
};
// ==================== 模块3: 拖拽交互模块 ====================
const DragDrop = {
draggedBlock: null,
// 处理拖拽开始
handleDragStart: (e) => {
DragDrop.draggedBlock = e.target;
e.dataTransfer.setData('text/plain', ''); // 兼容Firefox
setTimeout(() => e.target.style.opacity = '0.4', 0);
},
// 处理拖拽结束
handleDragEnd: (e) => {
e.target.style.opacity = '1';
DragDrop.draggedBlock = null;
},
// 处理拖拽经过
handleDragOver: (e) => {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
},
// 处理放置积木
handleDrop: (e) => {
e.preventDefault();
if (!DragDrop.draggedBlock) return;
const dropZone = document.getElementById('dropZone');
// 克隆积木到编程区
const newBlock = DragDrop.draggedBlock.cloneNode(true);
newBlock.style.opacity = '1';
newBlock.draggable = true;
newBlock.addEventListener('dragstart', DragDrop.handleDragStart);
newBlock.addEventListener('dragend', DragDrop.handleDragEnd);
dropZone.appendChild(newBlock);
DragDrop.draggedBlock = null;
// 检查逻辑错误
LogicChecker.checkProgram();
},
// 初始化拖拽事件
init: () => {
const blocks = document.querySelectorAll('.block');
const dropZone = document.getElementById('dropZone');
// 积木拖拽事件
blocks.forEach(block => {
block.addEventListener('dragstart', DragDrop.handleDragStart);
block.addEventListener('dragend', DragDrop.handleDragEnd);
});
// 编程区放置事件
dropZone.addEventListener('dragover', DragDrop.handleDragOver);
dropZone.addEventListener('drop', DragDrop.handleDrop);
}
};
// ==================== 模块4: 逻辑检查AI模块 ====================
const LogicChecker = {
// 常见逻辑错误类型
errorTypes: {
missingCondition: "循环或判断缺少条件",
infiniteLoop: "可能存在无限循环",
unusedVariable: "定义了变量但未使用",
wrongOrder: "操作顺序可能有误"
},
// 检查程序逻辑错误
checkProgram: () => {
const blocks = document.querySelectorAll('#dropZone .program-block');
const errorBox = document.getElementById('errorBox');
let errors = [];
// 检查1: 循环是否有条件
const loops = Array.from(blocks).filter(b =>
b.dataset.value === 'while' || b.dataset.value === 'repeat');
loops.forEach(loop => {
if (!Array.from(blocks).some(b =>
b.dataset.type === 'logic' &&
loop.contains(b))) {
errors.push(LogicChecker.errorTypes.missingCondition);
}
});
// 检查2: 是否有无限循环风险
const whileLoops = Array.from(blocks).filter(b => b.dataset.value === 'while');
whileLoops.forEach(loop => {
// 简化检查:如果循环内没有改变条件的操作
const hasChange = Array.from(blocks).some(b =>
b.dataset.value === 'change' && loop.contains(b));
if (!hasChange) errors.push(LogicChecker.errorTypes.infiniteLoop);
});
// 显示错误信息
if (errors.length > 0) {
errorBox.innerHTML = `<strong>发现 ${errors.length} 个逻辑问题:</strong><ul>${errors.map(e => `<li>${e}</li>`).join('')}</ul>`;
// 更新错误计数
const progress = DataStore.loadProgress();
progress.errors += errors.length;
DataStore.saveProgress(progress);
document.getElementById('errorCount').textContent = progress.errors;
} else {
errorBox.innerHTML = '<strong>错误检查:</strong> 暂无逻辑错误';
}
return errors;
},
// 分析程序结构
analyzeStructure: (blocks) => {
// 返回程序结构特征,用于成长轨迹分析
return {
blockCount: blocks.length,
hasLoop: blocks.some(b => b.dataset.value === 'repeat' || b.dataset.value === 'while'),
hasCondition: blocks.some(b => b.dataset.value === 'if'),
hasVariable: blocks.some(b => b.dataset.type === 'variable')
};
}
};
// ==================== 模块5: 提示生成模块 ====================
const HintGenerator = {
// 根据程序状态生成引导提示
generateHint: (blocks) => {
const hintBox = document.getElementById('hintBox');
const structure = LogicChecker.analyzeStructure(blocks);
// 针对不同阶段的提示策略
if (structure.blockCount === 0) {
return "试试用'向前走'和'向右转'积木让角色走出正方形!";
}
if (!structure.hasLoop && structure.blockCount > 2) {
return "发现你用了很多重复的积木,试试用'重复'积木让代码更简洁!";
}
if (structure.hasLoop && !structure.hasCondition) {
return "可以在循环里加个'如果'判断,让角色遇到墙就转弯哦!";
}
if (structure.blockCount > 5 && !structure.hasVariable) {
return "想记录走了多少步吗?试试用'变量'积木设置分数!";
}
// 默认鼓励性提示
const hints = [
"你做得很好!试试调整数字让角色走不同的路线",
"观察角色的运动,想想怎么让它避开墙壁",
"尝试组合不同的积木,创造新的运动模式",
"如果卡住了,可以简化程序,一步步测试"
];
return hints[Math.floor(Math.random() * hints.length)];
},
// 显示提示
showHint: () => {
const blocks = document.querySelectorAll('#dropZone .program-block');
const hint = HintGenerator.generateHint(blocks);
document.getElementById('hintBox').innerHTML = `<strong>提示:</strong> ${hint}`;
}
};
// ==================== 模块6: 成长轨迹模块 ====================
const ProgressTracker = {
// 渲染成长图表
renderChart: () => {
const progress = DataStore.loadProgress();
const chart = document.getElementById('progressChart');
chart.innerHTML = '';
// 最近7天完成任务数
const last7Days = Array(7).fill(0).map((_, i) => {
const date = new Date();
date.setDate(date.getDate() - (6 - i));
return date.toLocaleDateString();
});
last7Days.forEach(day => {
const dayTasks = progress.tasks.filter(t =>
t.date.startsWith(day) && t.status === 'completed').length;
const bar = document.createElement('div');
bar.className = 'chart-bar';
bar.style.height = `${dayTasks * 20}px`;
bar.innerHTML = `<div class="chart-label">${day.split('/').slice(1).join('/')}</div>`;
chart.appendChild(bar);
});
// 更新统计数据
document.getElementById('completedTasks').textContent = progress.completed;
document.getElementById('errorCount').textContent = progress.errors;
},
// 记录任务完成
recordCompletion: (taskId) => {
const progress = DataStore.updateTaskStatus(taskId, 'completed');
ProgressTracker.renderChart();
return progress;
}
};
// ==================== 主程序初始化 ====================
document.addEventListener('DOMContentLoaded', () => {
// 初始化各模块
DragDrop.init();
BlockManager.loadSavedProgram();
ProgressTracker.renderChart();
// 事件监听
document.getElementById('runBtn').addEventListener('click', () => {
const blocks = document.querySelectorAll('#dropZone .program-block');
LogicChecker.checkProgram();
// 简单动画演示
const character = document.getElementById('character');
character.style.left = '20px';
character.style.bottom = '20px';
// 根据积木执行简单动画(实际项目中会更复杂)
let left = 20;
blocks.forEach(block => {
if (block.dataset.value === 'forward') left += 30;
if (block.dataset.value === 'turn') character.style.transform = 'rotate(90deg)';
});
character.style.left = `${left}px`;
ProgressTracker.recordCompletion('maze1');
});
document.getElementById('resetBtn').addEventListener('click', () => {
document.getElementById('dropZone').innerHTML = '<p>拖拽左侧积木到这里开始编程...</p>';
document.getElementById('errorBox').innerHTML = '<strong>错误检查:</strong> 暂无逻辑错误';
LogicChecker.checkProgram();
});
document.getElementById('hintBtn').addEventListener('click', HintGenerator.showHint);
// 初始提示
HintGenerator.showHint();
});
</script>
</body>
</html>
使用说明
快速上手指南
1. 认识积木:左侧面板有4类积木(控制流/运动/逻辑/变量),不同颜色代表不同类型
2. 搭建程序:拖拽积木到中间编程区,按顺序排列
3. 运行测试:点击"运行程序"按钮,观看右侧角色动画效果
4. 获取帮助:点击"获取提示"按钮获得AI引导建议
5. 检查错误:AI会自动检测逻辑问题并在右侧显示
核心操作流程
1. 任务目标:让角色走出迷宫/画正方形/收集物品
2. 编程步骤:
- 用"重复"积木包裹重复动作
- 用"如果"积木添加条件判断
- 用变量积木记录分数/步数
3. 调试技巧:
- 先简单后复杂,分步测试
- 注意循环条件和变量变化
- 善用AI提示但不直接抄答案
进阶功能
- 保存程序:关闭页面后再次打开,程序自动恢复
- 成长分析:右侧图表显示近7天完成任务情况
- 挑战模式:完成基础任务后解锁更复杂场景
核心知识点卡片
卡片1: 逻辑思维
知识点:逻辑推理是编程的核心
说明:编程就像解谜题,需要把大问题拆成小步骤,按顺序解决
示例:让角色走正方形 = 向前走→右转→重复4次
训练方法:用"如果-那么"积木练习条件判断
卡片2: 问题分解
知识点:把复杂问题拆成小任务
说明:像搭积木一样,先完成一小块,再组合起来
示例:走出迷宫 = 前进→遇墙转弯→重复直到出口
训练方法:用"重复"积木简化重复操作
卡片3: 试错迭代
知识点:犯错是学习的机会
说明:AI会提示错误但不直接给答案,鼓励自己思考
示例:无限循环时,提示"检查循环条件是否能结束"
训练方法:记录每次错误和解决方法
卡片4: 目标导向
知识点:始终清楚要解决什么问题
说明:编程前先想"最终要让角色做什么"
示例:任务目标是"收集3颗星星",所有积木都为这个目标服务
训练方法:用变量积木记录目标进度
卡片5: 创新组合
知识点:用已知积木创造新玩法
说明:像搭乐高一样,不同组合产生不同效果
示例:重复+转向=画圆;变量+判断=计分游戏
训练方法:尝试用3种不同方式完成同一任务
程序特点
1. 创新思维融入:通过"试错迭代""目标导向"等管理理念设计学习路径
2. AI引导而非灌输:提示启发思考,不直接给答案,培养自主解决问题能力
3. 成长可视化:用图表记录进步轨迹,增强学习成就感
4. 模块化设计:6大独立模块便于扩展新功能(如添加新积木类型、新挑战场景)
5. 少儿友好界面:鲜艳色彩、简单操作、即时反馈,符合儿童认知特点
该程序适合6-12岁少儿使用,可在家长或教师指导下学习,培养计算思维与创新解决问题的能力。
关注我,有更多编程干货等待着你!