#游戏
10 篇
让弹球对手会算落点,但算不太准
一个能打赢的 Pong 对手需要两件事:把球的落点算准,再故意算错一点。前者用三角波一次算完,后者每次接球重抽一个偏差。
游戏主循环:为什么必须用 delta time
每帧固定移动 5 像素,在 60Hz 屏幕上快一倍、在 144Hz 上快两倍半。把时间差乘进去,物理才与刷新率解耦;再加一个上限,切标签页回来才不会瞬移。
五子棋 AI:算杀层与搜索层怎么分工
纯 alpha-beta 在五子棋上会漏掉必杀。我把决策拆成三层——成五、堵五、算杀各司其职,剩下的才交给迭代加深加置换表,快棋也能下出像样的棋。
把 AI 的思考过程做成一棵能翻的树
给搜索过程做可视化,难点不在画树,而在数据要是真的、面板不能把棋盘顶来顶去、以及它得按需加载不拖累不点它的人。
写中国象棋规则,四处最容易错的地方
蹩马腿、塞象眼、炮打隔子、将帅照面。我把走法生成拆成几何层与合法性层,前者只管兵种怎么走,后者统一兜住送将,四处坑各配了断言。
黑白棋的合法落点:一次扫描,八个方向
一个空位合法,当且仅当八个方向里至少有一个方向能夹住对方的棋子。判断与翻转用的是同一次扫描,不必先模拟再回滚。
数独生成器:挖洞、唯一解,以及一个把页面卡死的 bug
生成器先填一个完整解,再逐格挖洞并验证唯一性。我在求解器里把「不限」写成 0,结果空盘要枚举全部解,点新局直接卡死。
五子棋的胜负判定:只查刚落下的那一点就够
每次落子后全盘扫描是浪费:胜负只可能因为最新一手而改变。沿四个方向从落子点向两侧延伸计数,判定成本与棋盘大小无关。
2048:把四个方向归一成同一个操作
滑动、合并、计分只需要写一遍,其余三个方向靠转置与反转复用。真正的难点是「每个方块一回合只能合并一次」,写错就得到不该出现的数字。
扫雷:把布雷推迟到第一次点击
第一下就踩雷的扫雷是没写完的扫雷。把布雷推迟到首次点击、并排除点击点周围 3×3,是这类实现最重要的一处设计。
