- 博客(42)
- 收藏
- 关注
原创 后端复盘(6):配置到底放哪里?普通常量和业务配置不要混在一起
本文从一个 Balatro 风格实时游戏后端项目出发,复盘业务配置归属的设计问题。文章不重点讲具体游戏功能,而是抽象出一个更通用的后端场景:为什么有些配置看起来只是常量,但放错位置后会越来越难改。本文结合阶段配置、奖励配置、经济规则配置等例子,区分普通常量、业务配置、运行时状态和本次结果的不同含义,并总结配置应该按业务概念归属,而不是简单按照“谁使用它”来摆放。普通常量解决魔法数字问题,业务配置解决规则归属问题。
2026-07-14 10:47:25
197
原创 从0到1实现Balatro游戏后端(11):商店商品池与运行时商品实例生成
继续推进我的个人项目:从 0 到 1 实现一个 Balatro 风格的游戏后端。上一篇刚把商店购买闭环跑通,这一篇开始继续拆商店背后的商品生成逻辑:商品不是简单写死在配置里,而是要从商品池中生成运行时实例。看起来只是“商店卖什么”的小问题,但实际会牵扯到配置设计、状态建模、服务拆分和后续扩展。也算是一次从能跑,到更像系统的重构记录。
2026-07-10 11:55:24
309
原创 后端复盘(5):接口越写越大怎么办?行为职责和返回结构要一起收敛
很多后端接口一开始都很简单,但随着项目推进,往往会在一次次“顺手加一点”之后慢慢变大:初始化、状态重置、流程推进、结算结果、返回字段全都塞进同一个接口里。本文从一个实际项目出发,复盘接口膨胀是如何发生的,以及当接口行为边界和返回字段归属同时开始变模糊时,应该如何拆行为、拆返回结构,让调用方更容易理解接口到底负责什么、这些返回值又分别代表什么。
2026-07-07 10:11:05
236
原创 从0到1实现Balatro游戏后端(10):商店阶段与商品购买闭环实现
本篇实现 Balatro 后端中的商店阶段与商品购买闭环,围绕 Blind 结算后的商店进入、商品生成、购买校验、金币扣减、状态更新以及离开商店进入下一 Blind 展开。通过实际项目代码,梳理游戏后端中“阶段状态 + 商品系统 + 购买流程”的完整设计思路。
2026-06-30 17:20:40
395
原创 后端复盘(4):阶段结束不等于流程结束,一个 finished 字段为什么不够用
很多后端系统一开始只需要一个 finished 或 gameOver,但当业务出现多阶段流程后,一个结束状态往往不够用了。本文基于一个实时游戏后端项目,复盘“阶段结束不等于流程结束”这个问题,拆解操作生命周期、阶段生命周期和整体流程生命周期的区别,并讨论不同层级结束后,状态应该如何保留、推进或清理。
2026-06-30 10:57:58
326
原创 后端复盘(3):聚合状态拆分设计,如何避免一个对象变成状态垃圾桶
本文从一个 Balatro 风格实时游戏后端项目出发,复盘聚合状态对象从“字段平铺”到“按职责拆分”的设计过程。文章不重点讲具体游戏功能,而是抽象出一个更通用的后端问题:当一个状态对象里的字段越来越多时,什么时候应该继续放在一起,什么时候应该拆成更清晰的子状态。本文结合 GameState 的重构过程,分析“状态垃圾桶对象”是如何形成的,并从字段分组、业务归属、生命周期、更新边界、重置边界等角度,总结如何让顶层状态成为聚合入口,而不是所有字段的临时仓库。
2026-06-23 20:07:29
369
原创 后端复盘(2):从功能接口到状态流转,后端复杂度是怎么出现的
本文从一个 Balatro 风格实时游戏后端项目出发,复盘后端接口从“功能调用”演变为“状态流转”的过程。文章不重点讲具体游戏功能,而是抽象出一个更通用的后端设计问题:为什么一个接口最开始只是接收参数、执行计算、返回结果,但随着业务推进,会逐渐依赖当前状态、修改多个字段、影响后续判断,并最终推动系统进入下一阶段。本文结合游戏、电商下单、活动奖励、审批流程等场景,梳理后端复杂度出现的原因,以及状态流转型接口在设计时需要关注的处理顺序、返回结构和状态一致性。
2026-06-23 10:31:32
417
1
原创 后端复盘(1):服务端状态归属设计,为什么关键状态不能交给客户端
本文从一个 Balatro 风格实时游戏后端项目出发,复盘“关键状态应该由谁维护”这个后端设计问题。文章不重点讲具体游戏功能,而是抽象出更通用的系统设计思路:客户端可以负责展示和提交操作意图,但只要状态会影响业务结果、流程推进、资源结算或权限判断,就不应该只交给客户端维护。本文结合游戏、电商、任务活动等场景,梳理服务端状态归属、请求校验、状态更新和生命周期设计的基本原则。
2026-06-19 11:21:49
230
原创 从0到1实现Balatro游戏后端(9):Blind奖励结算与金币系统实现
本篇基于 Balatro 风格后端项目,实现 Blind 胜利后的金币奖励结算,并引入 money 作为玩家资源状态。文章重点拆解奖励从哪里来、如何配置、如何结算、如何写入 PlayerState,以及如何通过 settlement.reward 返回给前端展示,为后续商店、购买、刷新与构筑成长系统打下基础。
2026-06-16 10:49:36
159
原创 从0到1实现Balatro游戏后端(8):Skip Blind与Tag奖励机制设计与实现
从0到1实现 Balatro 游戏后端系列第8篇。本篇围绕跳过 Blind 与 Tag 奖励机制展开,完成了奖励配置、状态管理、效果触发以及流程推进等核心设计。通过实际项目案例,展示如何利用配置驱动与模块化设计实现可扩展的游戏玩法系统,为后续更多特殊机制的接入奠定基础。
2026-06-12 11:28:02
409
4
原创 Balatro后端进阶(3):为什么机制设计比写代码更难
本文是 Balatro 后端项目的第 3 篇进阶分支,写在主分支第 8 篇“跳过 Blind 与 Tag 奖励机制设计”之前。文章记录了我在机制设计前的一次卡住:从过去按照明确需求写代码,到现在需要自己判断规则、状态、生命周期和扩展性。跳过 Blind 不只是按钮,Tag 奖励也不是简单返回值,而是会影响后续流程的机制设计。本文更多记录这次从实现功能到理解规则的转变。
2026-06-09 10:15:56
249
原创 从0到1实现Balatro游戏后端(7):Boss Blind与特殊规则实现
本篇正式接入 Balatro 的 Boss Blind 系统。相比普通 Blind 只关注目标分数,Boss Blind 开始引入特殊规则与限制机制。为了让这些规则能够持续扩展,我重新设计了 Boss Blind 配置结构,拆分 initGame 生命周期,并重构 SelectCardsResult 返回模型,最终实现 disableSuit 与 disableHandType 两种特殊规则。这一篇的重点不是实现多少规则,而是让规则系统第一次真正进入当前后端架构。
2026-06-05 10:56:27
358
原创 从0到1实现Balatro游戏后端(6):Blind关卡状态设计与回合推进实现
本篇记录 Balatro 游戏后端第二阶段开发过程。通过引入 Blind 关卡系统,实现 Ante、Round、BlindState 等核心状态设计,并对 GameState 进行职责拆分,完成 Blind 生命周期、目标分配置、阶段结算与回合推进逻辑。项目开始从“单局流程”演化为“关卡生命周期”,也为后续 Boss Blind、特殊规则与奖励机制扩展预留了架构空间。
2026-06-02 10:52:45
252
原创 从0到1实现Balatro游戏后端(5):得分计算与单局结算流程实现
- 本篇博文主要说明了如何实现 Balatro 游戏后端的单局得分计算与回合结算流程。- 文章展示了从 dealCards 升级为 startGame 的生命周期入口、统一处理出牌/弃牌的 selectCards 接口、牌型分数计算及 validCards 的设计。-服务端统一维护玩家核心状态(总分、本次操作分、目标分数、游戏状态),形成单局闭环。读者可以清楚理解如何将离散接口整合为完整单局游戏流程,为后续 Blind、关卡、Boss 和 Modifier 等扩展打下基础。
2026-05-29 11:42:16
419
原创 从0到1实现Balatro游戏后端(4):玩家手牌操作(出牌 / 弃牌 / 补牌)与状态流转设计
本篇开始实现 Balatro 游戏中的核心交互流程:出牌、弃牌与补牌。在完成基础发牌后,我开始尝试将玩家操作真正接入服务端状态流转,包括手牌移除、牌堆补牌以及回合内操作次数管理。文章中会结合实际项目,讲清为什么游戏状态必须由服务端维护,以及玩家操作与牌堆状态之间的联动设计。
2026-05-26 11:22:41
448
原创 Balatro后端进阶(2):基于GitHub Actions的CI自动化验证实现
本篇是「Balatro后端进阶系列」第二篇,记录我在项目中引入 GitHub Actions 实现 CI 自动化验证的过程。从最开始依赖手动执行 npm test,到后面通过 push 自动触发安装、构建、测试流程,我开始真正意识到:代码不仅要“能跑”,还需要“可验证”。这篇文章会结合实际项目,讲清 Node.js + NestJS 项目中,CI 为什么重要,以及一套最基础的自动化验证流程是如何搭建的。
2026-05-22 10:43:04
560
原创 从0到1实现Balatro游戏后端(3):洗牌、发牌与服务端牌堆状态管理
本篇开始正式进入 Balatro 游戏回合流程的实现。在完成 NestJS 架构搭建后,我开始实现洗牌、发牌以及服务端牌堆状态管理,并尝试解决一个核心问题:如何让牌堆状态始终由服务端维护,而不是依赖前端传值。文章中会结合实际项目,讲清牌堆生成、随机洗牌、玩家发牌流程,以及为什么游戏状态必须放在服务端管理。
2026-05-19 11:00:57
412
原创 Balatro后端进阶(1):自定义NestJS WebSocket Adapter实现消息拦截
本篇记录了我在 Balatro 游戏后端项目中,自定义 NestJS WebSocket Adapter 的过程。在使用默认 `WsAdapter` 时,我发现消息会在进入 `@SubscribeMessage` 前被内部解析,一旦消息格式异常,很难拿到原始 `message`,也不方便统一处理日志与协议错误。于是我开始尝试接管 WebSocket 消息入口层,在 Adapter 中实现原始消息日志、协议校验、统一错误返回以及消息分发链路。
2026-05-15 11:27:28
495
原创 从0到1实现 Balatro 游戏后端(2):NestJS框架搭建与项目结构设计
本篇记录了我将 Balatro 游戏后端,从单文件 TypeScript 逻辑迁移到 NestJS 的过程。随着功能逐渐增加,原本所有逻辑集中在一个文件中的方式,开始暴露出扩展性与维护性问题。于是我开始引入 NestJS,并重新设计项目结构。文章中会结合实际项目,讲清为什么拆分 Game 与 Poker 模块、为什么使用 WebSocket,以及 Gateway → Service → PokerService 的调用链设计思路。
2026-05-13 11:09:27
535
原创 从0到1实现 Balatro 游戏后端(1):项目规划与牌型判断实现
从0开始实现一个 Balatro 风格的实时游戏后端。这一篇主要记录项目的整体规划,以及德州扑克牌型判断模块的实现过程,包括牌面解析、顺子、同花、葫芦等核心牌型的识别逻辑。项目目标并不只是完成一个算法 Demo,而是一步步构建一个真正可运行、可扩展的实时游戏后端系统。
2026-05-11 20:15:00
865
原创 程序员前沿技术英语指南:从1000词到读懂Next.js / AI / Node文档
很多程序员在学习前沿技术时,最大的障碍不是代码,而是英文文档。本文整理了一套程序员英语 Ultimate 学习方案,从高频技术词汇、GitHub常见句、核心语法到 Next.js、Node.js、AI 等前沿技术阅读训练,帮助开发者逐步提升英语阅读能力,能够直接阅读官方文档和技术博客。
2026-03-09 11:53:27
365
原创 为什么 WebSocket 收到的是 object,但 length 却像字符串?
在使用 Node.js 的 ws 模块配合 Postman 调试 WebSocket 时,我遇到了一个坑:发送 JSON 数组后,服务端收到的 type 是 object,但 length 却像字符串。排查后发现,WebSocket 协议并不识别 JSON,Postman 实际发送的是文本帧,ws 默认接收到的是 Buffer。文章记录了这一踩坑过程,并延伸梳理了 JSON.parse 的常见误区,最终给出更安全的消息解析方式,避免类似问题再次出现。
2026-01-12 17:05:26
600
原创 TypeScript实用笔记(三):泛型<T>的使用 && <T>的12种工具类型的使用
typescript中泛型的使用,以及12种工具类型[Partial,Required,Readonly,Record,Pick,Omit,Extract,Exclude,NonNillable,ReturnType,InstanceType,ThisType]的使用
2024-11-04 11:09:29
1560
原创 TypeScript实用笔记(一):初始化、类型定义与函数使用
TypeScript实用笔记,类型、别名、Function、Interface的使用
2024-10-31 16:53:17
1804
原创 Mac的docker安装与Jenkins部署
文章目录一、 docker的安装二、 Jenkins建议使用镜像jenkinsci/blueocean三、 运行Jenkins容器四、 解锁Jenkins五、 安装途中出行的问题及解决办法一、 docker的安装1⃣️ https://docs.docker.com/desktop/ 进入到官网进行下载,左侧进行选择事Mac还是windows系统- Mac需要选择是Intel还是Apple处理器,- 查看方式点击左上角 苹果图标 -> 关于本机 -> 处理器,我的这个是Intel的
2021-09-14 11:17:16
1296
原创 Redis开发与运维学习笔记 — 第3章 小功能大用处
文章目录3.1 慢查询分析3.2 Redis Shell3.3 Pipeline3.4 事务3.1 慢查询分析1.所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详情)记录下来.2.Redis客户端执行一条命令的步骤 : 发送命令 -> 命令排队 -> 命令执行 -> 返回结果 - 注意 : 慢查询只提供步骤3(命令执行)的时间,所以没有慢查询并不代表客户端没有超时的问题慢查询的配置参数
2021-02-22 19:45:20
414
原创 Redis开发与运维学习笔记 -- 第2章 API的理解和使用
文章目录1.1 全局命令1.2 字符串string1.2 哈希hash1.3 列表list1.4 集合1.5 有序集合1.7 键管理1.1 全局命令查看所有的键keys * : 对所有的key进行遍历并输出.键总数dbsize : 直接获取Redis内置的键总数变量,不会遍历所有的键因keys*是遍历所有的key,所以在key值很大时,不建议使用查看键是否存在exists key : 存在返回1 不存在返回0删除键del key [key...] : 任何类型
2021-02-15 12:47:18
283
原创 项目版本低但却不能更改SyntaxError: Block-scoped declarations (let, const, function, class)
本文记录了一次旧版 Node.js / pomelo 项目运行报错的排查过程。由于项目版本不能升级,而服务器插件版本过高,导致 let / const 语法不兼容。最终通过定位报错路径,找到对应依赖,并将服务器插件降级到兼容版本,解决了旧项目无法正常运行的问题。
2020-12-25 11:29:03
706
原创 MySQL慢查询、索引优化
文章目录一、慢查询1、什么是慢查询2、如何查看慢查询时间3、开启慢查询二、索引基本知识1、索引的优点2、索引的用处3、索引的分类4、面试技术名词5、索引采用的数据结构6、索引匹配方式三、哈希索引1、概念2、哈希索引的限制四、组合索引五、聚簇索引与非聚簇索引1、聚簇索引1、优点2、缺点2、非聚簇索引六、覆盖索引1、基本介绍2、优势七、优化小细节八、索引监控1、参数解释一、慢查询1、什么是慢查询- 如果查询一个语句超过设置的时间,日志就会存储到慢查询日志中.例如我系统设置的是10秒,那么我查询一条语句用了
2020-09-25 16:42:41
1212
原创 MongoDB命令笔记
文章目录一、基础操作一、数据库操作二、集合操作三、文档基本的CRUD1、文档的插入(也可用.save())2、文档的基本查询3、文档的更新(也可用.save())4、删除文档五、文档的更多查询1、统计查询2、分页列表查询3、排序查询4、正则的复杂条件查询5、比较查询6、包含查询7、条件链接查询二、索引一、索引的管理操作1、索引的查看2、索引的创建3、索引的删除二、索引的使用1、执行计划explain一、基础操作一、数据库操作1、启动mongo --host XX --port XX2、查看现有库 s
2020-09-11 11:35:29
3831
原创 Redis单纯的命令
目录一、基础命令二、数据库类型1.String(字符串)2.List3.Set(集合)4.Hash(哈希)5.Zset(有序集合)三、三种特殊数据类型一、基础命令1.连接redisredis-cli2.删除redis数据 1. flushdb //删除当前 2. flushall //删除全部数据库的内容(16个database的数据)3.切换数据库select 15 //(0-15)任意的数字进行进入其中的database,默认是0,redis默认16个database4.查看DB
2020-08-06 10:46:34
220
原创 Git学习笔记 — 借鉴bilibili 鱼C-小甲鱼的教学视频
【注:本地我直接用的git可视化工具sourceTree,记录笔记方便在服务器操作】【鱼C-小甲鱼的同步教学视频 https://www.bilibili.com/video/BV1bs411N7ny?p=2】【如转载此文章,请标明出处 https://editor.csdn.net/md?articleId=107533322】一、Git理论查看git信息git config --list2. git记录的是版本变动,每个版本都是独立保存的3. git是维护三棵树来实现版本控制的
2020-07-23 18:07:07
2337
3
原创 webStrom ->node.js express框架连接数据库mysql的登录系统
第一次用弄,中间来回百度了好多次,但对于什么都不知道的自己还是很乱很迷茫,刚写完登录页面,在此捋一下希望可以帮助到他人。此项目希望达到的需求:___创建登录页面,输入账号和密码点击登录时后端可以获取到输入的账号与密码和数据库进行对比后知道是否成功安装node和express可以自行百度下。1、打开控制台进入想要创建项目的文件下 输入 express Show_Page(项目名)。这样名字为...
2019-10-16 18:32:15
476
原创 webStrom用node写的html页面Failed to load resource: the server responded with a status of 404 (Not Found)
webStrom 用node写的html页面1、页面显示的错误信息,因为找不到js和css文件2、网页点击右键检查后看console输出 显示的错误3、控制台输出4、我原来把页面放到的是views目录下,就会上述的错误,当我把index.html放到public目录下后就可以正常显示页面了,但是需要把app.js里面的app.set(‘views’,path.join(__dirnam...
2019-10-16 11:46:17
1121
原创 .ajax里面的url参数无法跳转到controller,2种情况
1.首次.click触发的时候 下面的.ajax进不去,url怎么跳转都过不去,是因为WEB-INF下的web.xml的配置没改,更改如下后可用<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file...
2019-09-21 11:45:47
3437
原创 Ubuntu的ibus输入法,JDK,TOMCAT,MySQL(MariaDB),Nginx,Redis安装配置教程
ibus输入法1.设置->Language Support->Install/Remove Languages…->Chinese(simplified)->Apply(安装中文包)2.打开Terminal控制台1) sudo apt-get install ibus ibus-clutter ibus-gtk ibus-gtk3 ibus-qt4 (安装输入法)2...
2019-05-01 14:16:14
475
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅