【新春创造营】小马接元宝 🐴

【新春创造营】小马接元宝 :horse_face:

项目介绍

「小马接元宝」是一款专为马年设计的新春趣味小游戏,玩家通过鼠标或键盘控制底部的小马,接住从天而降的元宝和红包,同时要避开小石头。游戏融合了传统新春元素与现代交互体验,是一款老少皆宜的轻度休闲游戏。

游戏特色:


使用工具

本项目使用 iFlow CLI 辅助开发,通过其强大的文件操作和项目管理功能,快速完成了从创意到实现的全过程。

主要使用的功能:

  • write_file - 快速生成 HTML 文件

  • read_file - 读取参考文件样式

  • run_shell_command - 文件预览和验证

  • todo_write - 项目任务规划


实现过程

1. 核心架构设计

采用经典的 HTML5 + CSS3 + 原生 JavaScript 三层架构,无需任何依赖即可运行:

┌─────────────────────────────────────┐
│           HTML 结构层               │
│  - 游戏容器 .game-area              │
│  - 小马元素 #pony                   │
│  - 道具容器(动态生成)              │
│  - UI信息栏(分数/时间)             │
├─────────────────────────────────────┤
│           CSS 样式层                │
│  - 渐变背景                         │
│  - 绝对定位布局                     │
│  - 动画效果(得分浮动)              │
├─────────────────────────────────────┤
│           JS 逻辑层                 │
│  - 游戏状态管理                     │
│  - 事件监听(鼠标/键盘)             │
│  - 碰撞检测算法                     │
│  - 游戏循环控制                     │
└─────────────────────────────────────┘

2. 关键技术实现

2.1 小马坐标跟随(核心亮点)

鼠标控制实现:

gameArea.addEventListener('mousemove', (e) => {
    const rect = gameArea.getBoundingClientRect();
    const mouseX = e.clientX - rect.left;
    
    // 边界限制
    const maxX = gameArea.offsetWidth - 50;
    const minX = 25;
    
    gameState.ponyX = Math.max(minX, Math.min(mouseX, maxX));
    pony.style.left = gameState.ponyX + 'px';
});

键盘控制实现:

document.addEventListener('keydown', (e) => {
    if (e.key === 'ArrowLeft') {
        gameState.ponyX = Math.max(25, gameState.ponyX - CONFIG.ponySpeed);
    } else if (e.key === 'ArrowRight') {
        const maxX = gameArea.offsetWidth - 25;
        gameState.ponyX = Math.min(maxX, gameState.ponyX + CONFIG.ponySpeed);
    }
    pony.style.left = gameState.ponyX + 'px';
});

2.2 道具下落与碰撞检测

// 下落逻辑
function dropItems() {
    gameState.items.forEach((item, index) => {
        item.y += gameState.dropSpeed;
        item.element.style.top = item.y + 'px';
        // 碰撞检测
        if (checkCollision(ponyRect, itemRect)) {
            handleCollision(item, index);
        }
        // 落地检测
        if (item.y > gameArea.offsetHeight) {
            item.element.remove();
            gameState.items.splice(index, 1);
        }
    });
}
// 碰撞检测算法
function checkCollision(rect1, rect2) {
    return rect1.x < rect2.x + rect2.width &&
           rect1.x + rect1.width > rect2.x &&
           rect1.y < rect2.y + rect2.height &&
           rect1.y + rect1.height > rect2.y;
}

2.3 难度渐进系统

// 游戏循环中逐步提升速度
function gameLoop() {
    // ...
    gameState.dropSpeed += CONFIG.speedIncrease / 60;
    // ...
}

3. 配置化设计

游戏支持灵活定制,通过 CONFIG 对象轻松调整:

const CONFIG = {
    gameTime: 90,           // 游戏时间(秒)
    initialSpeed: 2,        // 初始掉落速度
    speedIncrease: 0.05,    // 速度增量
    spawnInterval: 1000,    // 生成间隔(毫秒)
    ponySpeed: 8,           // 键盘移动速度
    ponyPosition: 20,       // 小马距底部距离
    boundaryPadding: 25     // 边界留白
};
// 道具类型配置
const ITEMS = [
    { type: 'coin', emoji: '🪙', score: 10, weight: 50 },
    { type: 'redpacket', emoji: '🧧', score: 20, weight: 30 },
    { type: 'stone', emoji: '🪨', score: -10, weight: 20 }
];

游戏预览

┌──────────────────────────────────────────────────┐
│              🏮 小马接元宝 🐴                      │
├──────────────────────────────────────────────────┤
│    分数:150    ████████████░░░    时间:67秒    │
├──────────────────────────────────────────────────┤
│                                                  │
│                    🧧                             │
│                                                  │
│              🪙                                  │
│                                                  │
│                                                  │
│                    🪨                            │
│                                                  │
│         🐴 ← 小马(玩家控制)                      │
│                                                  │
└──────────────────────────────────────────────────┘

视觉效果:

  • :artist_palette: 深色渐变背景,营造沉稳的游戏氛围

  • :sparkles: 金色边框和按钮,呼应新春主题

  • :bar_chart: 实时分数动画,接住道具时弹出 +10 / -10 提示

  • :bullseye: 鼠标隐藏,游戏区域更加沉浸


可定制方向

关闭单一控制方式

// 仅保留鼠标控制
document.removeEventListener('keydown', keyHandler);
// 仅保留键盘控制
gameArea.removeEventListener('mousemove', mouseHandler);

添加新道具

{ type: 'fu', emoji: '🧧', score: 0, effect: 'pause', weight: 10 }
// 效果:接中暂停游戏5秒

调整难度

initialSpeed: 3,        // 提高初始速度
speedIncrease: 0.1,    // 加快难度递增
spawnInterval: 600,    // 加快道具生成

总结

「小马接元宝」是一个典型的「入门到进阶」HTML5 游戏项目:

:white_check_mark: 入门友好:无需框架,纯原生实现

:white_check_mark: 逻辑清晰:状态管理 + 事件监听 + 游戏循环

:white_check_mark: 扩展性强:配置化设计,支持灵活定制

:white_check_mark: 体验流畅:60fps 动画,响应式控制

整个制作过程仅用时约 15 分钟,非常适合作为前端新手练手项目。


体验链接

:file_folder: 小马接元宝 🐴

直接用浏览器打开即可体验!祝大家马年大吉,财源滚滚!:horse_face::money_bag:

1 个赞

还有左右滑动不是特别丝滑hhh 家人们玩玩试试~

这是故意做的 鼠标进去了就被那个小马接管了 所以会消失 哈哈

更新啦

现在点击开始游戏 才会隐藏 鼠标显示
支持按 esc 显示鼠标
使用纯 js 控制小马移动 更流畅啦

丝滑很多了!