首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >用 WorkBuddy 做一个"摸鱼钓鱼"小游戏,上班也能光明正大摸鱼

用 WorkBuddy 做一个"摸鱼钓鱼"小游戏,上班也能光明正大摸鱼

原创
作者头像
用户12622092
修改2026-07-15 11:25:12
修改2026-07-15 11:25:12
30
举报

标签:#WorkBuddy# #前端# #HTML5# #Canvas# #小游戏#

前言

上班摸鱼是当代打工人的刚需。但摸鱼也得有技术含量——与其刷手机被老板抓包,不如做一个看起来像在敲代码、实际上在钓鱼的小游戏。

本文记录了用 WorkBuddy 从零到一制作「摸鱼钓鱼」小游戏的完整过程,包括设计思路、核心代码讲解、踩坑经验。单文件 HTML,开箱即玩,老板键一键切换 VS Code 界面。

游戏效果

核心玩法:点击水面下钩钓鱼,不同鱼分值不同,连击触发倍率加成,60 秒倒计时比拼分数。

月夜星空主题,降低屏幕亮度,不容易被老板发现

水面波纹、气泡、光柱、海草,Canvas 全屏渲染

按 ESC 秒变 VS Code,带语法高亮的 TypeScript 代码

亮点功能

  • 4 种鱼类(小鱼 10 分 / 草鱼 30 分 / 锦鲤 50 分 / 金鱼 100 分)
  • 连击系统(最高 x5 倍率)
  • 粒子特效(钓鱼溅水花)
  • 水下气泡 + 光线折射 + 海草摆动
  • 老板键:按 ESC 或点按钮,瞬间切换到 VS Code 编辑器界面
  • 星空月夜主题,降低屏幕亮度,不容易被老板发现

设计思路

1. 为什么选 Canvas 而不是 DOM?

游戏需要同时渲染:鱼群(4-12 条)、气泡(20 个)、粒子(20+)、水面波纹(3 层)、海草(8 株)、光柱(5 道)。DOM 操作这么多元素会很卡,Canvas 直接画帧性能更好。

2. "老板键"怎么做到以假乱真?

标签页、行号、语法高亮、状态栏,从远处看完全在写代码

核心思路:用一个 display:none 的 div 模拟 VS Code 界面,包含:

  • 顶部标签栏(main.js / utils.js / package.json)
  • 行号 + 语法高亮的代码区
  • 底部状态栏(UTF-8 / LF / JavaScript)

代码内容是一段看起来很正经的 TypeScript 用户服务类,带注释、带类型标注。老板路过扫一眼:嗯,在写后端服务,很努力。

3. 鱼的视觉设计

每条鱼由椭圆身体 + 三角尾巴 + 白色腹部 + 眼睛组成,用 ctx.scale(dir, 1) 控制朝向。金鱼额外加发光描边(shadowBlur),让玩家一眼看到高价值目标。

鱼在游动时加了 Math.sin(wobble) 偏移,让游动轨迹有自然起伏,不是死板的直线移动。

核心代码讲解

鱼类系统

代码语言:javascript
复制
const FISH_TYPES = [
    { color: '#4fc3f7', size: 20, speed: 2, points: 10, weight: 50 },
    { color: '#ffd700', size: 24, speed: 3.5, points: 100, weight: 5 },
];

class Fish {
    constructor() {
        this.type = this.pickType();  // 按权重随机
        this.x = Math.random() < 0.5 ? -50 : W + 50;
        this.dir = this.x < 0 ? 1 : -1;
        this.y = H * waterTop + 60 + Math.random() * (H * (1 - waterTop) - 120);
    }
    pickType() {
        let total = FISH_TYPES.reduce((s, t) => s + t.weight, 0);
        let r = Math.random() * total;
        for (let t of FISH_TYPES) {
            r -= t.weight;
            if (r <= 0) return t;
        }
    }
}

weight 控制出现概率:小鱼 50%、草鱼 30%、锦鲤 15%、金鱼 5%。金鱼速度最快但分值最高,制造"看到金鱼赶紧下钩"的紧张感。

钓鱼钩系统

钩子有三个状态:casting(下落)→ waiting(等待鱼咬钩)→ reeling(收杆)。

代码语言:javascript
复制
class Hook {
    constructor(x, y) {
        this.state = 'casting';
        this.targetY = y;
        this.caughtFish = null;
    }
    update(dt) {
        if (this.state === 'casting') {
            this.y += (this.targetY - this.y) * 0.15;  // 缓动下落
        } else if (this.state === 'waiting') {
            // 检测碰撞
            for (let fish of fishes) {
                if (fish.contains(this.x, this.y)) {
                    this.caughtFish = fish;
                    this.state = 'reeling';
                }
            }
            if (this.waitTimer > 3) this.state = 'reeling';  // 3秒自动收杆
        } else if (this.state === 'reeling') {
            this.y -= 6;  // 匀速上拉
            if (this.caughtFish) {
                this.caughtFish.x = this.x;
                this.caughtFish.y = this.y;
            }
        }
    }
}

最多同时 3 个钩子,玩家可以多线操作——同时钓不同位置的鱼。

连击系统

代码语言:javascript
复制
function catchFish(fish) {
    let points = fish.type.points * combo;
    score += points;
    combo = Math.min(combo + 1, 5);  // 最高5倍
    comboTimer = 0;
}

连击 2.5 秒内不钓鱼就重置。倍率叠加让"金鱼 x5 倍"可以达到 500 分一跳,非常爽快。

老板键

代码语言:javascript
复制
function toggleBossMode() {
    bossMode = !bossMode;
    if (bossMode) {
        renderFakeCode();  // 生成VS Code风格的代码
        fakeWork.style.display = 'block';
    } else {
        fakeWork.style.display = 'none';
    }
}

document.addEventListener('keydown', (e) => {
    if (e.key === 'Escape') toggleBossMode();
});

代码用 span + CSS class 实现语法高亮:.keyword(蓝色)、.string(橙色)、.comment(绿色)、.type(青色)。和 VS Code Dark+ 主题几乎一致。

背景渲染

水面波纹用三层正弦曲线叠加,每层透明度递减:

代码语言:javascript
复制
for (let layer = 0; layer < 3; layer++) {
    let baseY = H * waterTop + layer * 8;
    for (let x = 0; x <= W; x += 10) {
        let y = baseY + Math.sin((x + waveOffset * (layer + 1) * 30) * 0.02) * 4;
        ctx.lineTo(x, y);
    }
    ctx.globalAlpha = 0.5 - layer * 0.15;
}

光柱用半透明三角形从水面向下扩散,配合 waveOffset 缓慢移动,模拟阳光穿透水面的效果。

完整代码结构

代码语言:javascript
复制
moyu-fishing-game.html
├── CSS
│   ├── HUD 样式(毛玻璃 + 渐变)
│   ├── 开始/结束界面
│   ├── 老板键假代码界面(VS Code 风格)
│   └── 动画 keyframes
├── HTML
│   ├── Canvas 画布
│   ├── HUD(分数/时间/连击)
│   ├── 老板键按钮
│   ├── 开始/结束弹窗
│   └── 假工作界面
└── JavaScript
    ├── Fish 类(4种鱼,权重随机)
    ├── Hook 类(三状态:下钩/等待/收杆)
    ├── Particle 类(粒子特效)
    ├── Bubble 类(背景气泡)
    ├── drawBackground()(星空+水面+海草+光柱)
    ├── gameLoop()(requestAnimationFrame)
    └── 老板键逻辑(ESC 切换)

如何使用

  1. 下载 moyu-fishing-game.html
  2. 双击用浏览器打开
  3. 点击「开始摸鱼」
  4. 点击水面下钩钓鱼
  5. 老板来了按 ESC

不需要任何依赖,不需要服务器,不需要安装任何东西。一个 HTML 文件搞定一切。

技术要点总结

技术点

实现

效果

Canvas 渲染

requestAnimationFrame 循环

60fps 流畅动画

缓动函数

y += (target - y) * 0.15

钩子自然下落

粒子系统

随机速度 + 重力 + 衰减

钓鱼溅水花效果

语法高亮

span + CSS class

假代码以假乱真

碰撞检测

圆形距离判断

鱼咬钩判定

正弦波纹

三层叠加 sin()

水面动态效果

踩坑经验

  1. Canvas 坐标系:鱼的朝向用 ctx.scale(dir, 1) 翻转,但翻转后文字和眼睛方向也会反。解决方案:在 save/restore 之间只画鱼体,翻转后再画。
  2. 多钩管理:同时多个钩子时,鱼可能被重复检测。加 hooked 标志位,上钩的鱼不再参与碰撞检测。
  3. 粒子内存泄漏:粒子如果不清理会越来越多导致卡顿。用 filter(p => p.life > 0) 每帧清理。
  4. 老板键时机:不能在游戏未开始时触发,加了 gameState === 'playing' 判断。

写在最后

这个游戏用 WorkBuddy 从构思到完成约 1 小时,全程对话式开发——描述需求,AI 生成代码,测试调整,一气呵成。

摸鱼不是偷懒,是在高压工作间隙给自己一个喘息的空间。与其焦虑地刷手机,不如钓几分钟鱼放松一下大脑,说不定灵感就来了。

当然,记得设好老板键。


本文使用的工具:WorkBuddy(AI 工作搭档)

游戏试玩:下载附件 moyu-fishing-game.html,双击打开即可。


如果觉得有意思,点个赞再走吧 🎣

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 游戏效果
  • 设计思路
    • 1. 为什么选 Canvas 而不是 DOM?
    • 2. "老板键"怎么做到以假乱真?
    • 3. 鱼的视觉设计
  • 核心代码讲解
    • 鱼类系统
    • 钓鱼钩系统
    • 连击系统
    • 老板键
    • 背景渲染
  • 完整代码结构
  • 如何使用
  • 技术要点总结
  • 踩坑经验
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档