标签:#WorkBuddy# #前端# #HTML5# #Canvas# #小游戏#
上班摸鱼是当代打工人的刚需。但摸鱼也得有技术含量——与其刷手机被老板抓包,不如做一个看起来像在敲代码、实际上在钓鱼的小游戏。
本文记录了用 WorkBuddy 从零到一制作「摸鱼钓鱼」小游戏的完整过程,包括设计思路、核心代码讲解、踩坑经验。单文件 HTML,开箱即玩,老板键一键切换 VS Code 界面。
核心玩法:点击水面下钩钓鱼,不同鱼分值不同,连击触发倍率加成,60 秒倒计时比拼分数。

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

水面波纹、气泡、光柱、海草,Canvas 全屏渲染
按 ESC 秒变 VS Code,带语法高亮的 TypeScript 代码
亮点功能:
游戏需要同时渲染:鱼群(4-12 条)、气泡(20 个)、粒子(20+)、水面波纹(3 层)、海草(8 株)、光柱(5 道)。DOM 操作这么多元素会很卡,Canvas 直接画帧性能更好。

标签页、行号、语法高亮、状态栏,从远处看完全在写代码
核心思路:用一个 display:none 的 div 模拟 VS Code 界面,包含:
代码内容是一段看起来很正经的 TypeScript 用户服务类,带注释、带类型标注。老板路过扫一眼:嗯,在写后端服务,很努力。
每条鱼由椭圆身体 + 三角尾巴 + 白色腹部 + 眼睛组成,用 ctx.scale(dir, 1) 控制朝向。金鱼额外加发光描边(shadowBlur),让玩家一眼看到高价值目标。
鱼在游动时加了 Math.sin(wobble) 偏移,让游动轨迹有自然起伏,不是死板的直线移动。
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(收杆)。
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 个钩子,玩家可以多线操作——同时钓不同位置的鱼。
function catchFish(fish) {
let points = fish.type.points * combo;
score += points;
combo = Math.min(combo + 1, 5); // 最高5倍
comboTimer = 0;
}连击 2.5 秒内不钓鱼就重置。倍率叠加让"金鱼 x5 倍"可以达到 500 分一跳,非常爽快。
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+ 主题几乎一致。
水面波纹用三层正弦曲线叠加,每层透明度递减:
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 缓慢移动,模拟阳光穿透水面的效果。
moyu-fishing-game.html
├── CSS
│ ├── HUD 样式(毛玻璃 + 渐变)
│ ├── 开始/结束界面
│ ├── 老板键假代码界面(VS Code 风格)
│ └── 动画 keyframes
├── HTML
│ ├── Canvas 画布
│ ├── HUD(分数/时间/连击)
│ ├── 老板键按钮
│ ├── 开始/结束弹窗
│ └── 假工作界面
└── JavaScript
├── Fish 类(4种鱼,权重随机)
├── Hook 类(三状态:下钩/等待/收杆)
├── Particle 类(粒子特效)
├── Bubble 类(背景气泡)
├── drawBackground()(星空+水面+海草+光柱)
├── gameLoop()(requestAnimationFrame)
└── 老板键逻辑(ESC 切换)moyu-fishing-game.html不需要任何依赖,不需要服务器,不需要安装任何东西。一个 HTML 文件搞定一切。
技术点 | 实现 | 效果 |
|---|---|---|
Canvas 渲染 | requestAnimationFrame 循环 | 60fps 流畅动画 |
缓动函数 | y += (target - y) * 0.15 | 钩子自然下落 |
粒子系统 | 随机速度 + 重力 + 衰减 | 钓鱼溅水花效果 |
语法高亮 | span + CSS class | 假代码以假乱真 |
碰撞检测 | 圆形距离判断 | 鱼咬钩判定 |
正弦波纹 | 三层叠加 sin() | 水面动态效果 |
ctx.scale(dir, 1) 翻转,但翻转后文字和眼睛方向也会反。解决方案:在 save/restore 之间只画鱼体,翻转后再画。hooked 标志位,上钩的鱼不再参与碰撞检测。filter(p => p.life > 0) 每帧清理。gameState === 'playing' 判断。这个游戏用 WorkBuddy 从构思到完成约 1 小时,全程对话式开发——描述需求,AI 生成代码,测试调整,一气呵成。
摸鱼不是偷懒,是在高压工作间隙给自己一个喘息的空间。与其焦虑地刷手机,不如钓几分钟鱼放松一下大脑,说不定灵感就来了。
当然,记得设好老板键。
本文使用的工具:WorkBuddy(AI 工作搭档)
游戏试玩:下载附件 moyu-fishing-game.html,双击打开即可。
如果觉得有意思,点个赞再走吧 🎣
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。