---
description: '"Screeps 阿波罗计划" 序章'
---

# Getting started

## Hi !

这是我为我的"Screeps 阿波罗计划"写的开发设计文档。如果你不知道 Screeps 是什么，可以参考 hoho 的[《Screeps 介绍及入坑》文集](https://www.jianshu.com/p/da5ffe2c22ee)，里面的介绍和技术概念设计写的非常深入浅出。

![\<Screeps>\_](https://726355213-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqtlvcTJVEwNrHqsXK2M3%2Fuploads%2FGwtQtCZZRPSpV0nbWwKf%2Fimage.png?alt=media\&token=0f7088c1-e773-4155-a1b4-21002a799846)

## 序言

我记得我是在本科大一寒假（2020年上半年）入坑的 Screeps，那时是疫情爆发的最初阶段，待在家中有些无所事事，所以恰好有大把的休闲时间能够投入到游戏中去。从最初的角色设计，过渡到后面的任务设计系统，我的 AI 迭代了至少四次。

我还记得我最初版本的 AI 的设计思想是由**配置**驱动，程序解析配置，分配给 Creep 执行的任务（具体而言，是顺序执行的一系列函数），其中一个函数的返回值会作为 Signal 传递给下一个函数来进行条件控制。那时候搞得还挺复杂，我记得还预留了战争模式，只是没想好该怎么写，因为依赖的低级模块太多了，当时还不太会写，耦合度很高。

而在第二个还是第三个版本的 AI 当中，我就接触到了**任务设计系统**，有一个任务池，需要运行的功能会作为任务发布到任务池中，而 Creep 则通过角色控制从任务池中取任务进行执行。那时候，我还不知道怎么样进行任务的保持，所以在每一 tick，会暴力枚举所有可能的任务，检查条件，然后发布，只不过为了避免任务重复，我会对任务（本质是一个 object）通过 SHA1 算一个 hash，通过检查 hash，来保证任务不重复。现在想想也挺有意思。在这个版本中，我就实现了简单的直接防御和攻击。（这个版本可以在[这个 github 仓库](https://github.com/RaymondJiangkw/screeps_script)中找到）

第四个版本的 AI 没有完全完成，但基本的思想是**触发式的任务系统**。不再有每 tick 的暴力枚举了，而是在特定事件发生后，触发任务的发布，并且加了计时器。这个版本的 AI 架构就会更科学一些，并且也增添了一些稍微高级的"种田"功能，包括自动规划，游戏中 GUI 监视器等。但是因为任务的发布是触发式的，所以有些不太稳定。对了，这个版本的 AI 我取名为 Lucy，致敬的是那部电影，象征着最高的智能。（这个版本可以在[这个 github 仓库](https://github.com/RaymondJiangkw/screeps-Lucy)中找到）

![Logo for Lucy](https://726355213-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqtlvcTJVEwNrHqsXK2M3%2Fuploads%2FCktwz0FAyYnOlatRFeo8%2Flogo.png?alt=media\&token=6fb77976-545d-4e1e-94f9-471e0f28e5a7)

![仿照 tigga 的核心部分布局](https://726355213-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqtlvcTJVEwNrHqsXK2M3%2Fuploads%2FiVDB9U6YMyd1jIyNvVjJ%2Ffast-energy-filling.png?alt=media\&token=3ed499e4-3b10-454f-be1a-de7c13e45c47)

后来，随着游戏的深入，<mark style="color:yellow;">外矿</mark>，<mark style="color:purple;">Lab</mark>，<mark style="color:red;">Power Bank</mark>，<mark style="color:orange;">Market</mark>，防御体系，风筝战术，自动扩张都被我加进了我的 AI 当中，可以说我写几万行代码的工程项目的能力就是通过 Screeps 练出来的。每一项功能的添加一方面非常令人激动，因为设计一个鲁棒、高效的系统去探索游戏的新内容非常有意思。但另一方面却又非常的 annoying，主要还是架构的原因，在设计前面的模块的时候，往往想不到后面会怎么设计，就导致了在写后面模块的代码的时候一直要不断修改前面的代码，直至重构。

整个过程虽然在设计上非常的有趣，但在代码的反复修改上，却很累人。在刚入坑的那段时间，还对游戏比较新鲜，设计产生的有趣感压过了反复修改的疲劳。而且也因为在不断地修改中，接触了更多的设计理念和技术，像任务系统，重构一个更先进科学的系统也会有让人不断敲代码的冲动 :D

但是后来随着学业的繁忙，2020年下半年在备考 GRE，2021年上半年就进入实验室了，就越来越没有时间或者干脆点，兴趣投入到 Screeps 的开发当中了（我记得大二寒假还是又玩了一段时间）。虽然在这段时间内，我抽空也会写写 Screeps 的代码，在 Screeps Arena 刚出的时候，我还买了内测版的 early bird，玩过一段时间。但是总的来说，一直没有再完整的写过一个 work 的 AI 系统了。

如今已经到了大三下了，本科生涯也要结束了，忙于科研出国留学。但是忙碌之余，也是需要有休息的时候，我不太喜欢打游戏，因为比较累吧，我更倾向于看别人玩游戏。特别是今年1月的时候，当讨论后最终得出结论毙掉了正在做的项目，其实除了极度的失落外还是有些释然的。因为当时精神压力特别大，11月底确定项目内容，1月份就是投稿的 DDL，而且是国际最顶级会议，同时录了也会发到顶级期刊上。我其实是没什么信心的，但是指导我的老师说没事，那就没办法，当时是期末，但是我还是投入了大量精力到其中，上课都在想怎么改进，做梦也是相关的内容。现在想想，其实心态上会更轻松一些了，经历了一次，佛系了一点，哈哈。😄所以，在看到了 hoho 的"模块化设计"文章后，深受启发，加上又有敲代码的冲动了，最终决定再写一个 Screeps 的完整的 AI 系统吧！

这时候，我也经历了计算机科学与技术专业的本科教育了，相比于高中打信息学竞赛的我，学到了更多计算机底层相关的内容，数据库、计算机网络原理、操作系统、计算机体系结构的思想都让我深受启发，所以我想，或许，我可以融入这些设计理念到 Screeps 的 AI 设计当中。当然了，我估计开发也是会比较慢的，因为其实现在是最忙的时候，但是一直慢慢做也是好的吧。

最后的最后，我决定将这个项目定名为 Apollo，因为我想我现在对这个系统的设计思路非常模糊，只有一些非常抽象的想法。所以，这个项目的构建就像是当时美国完成阿波罗登月计划，有许多未知的难关需要克服。当然，跟阿波罗登月计划相比，有些自不量力，但是这个名字很酷不是吗？😎

![Logo for Apollo? (好吧，还是 Lucy 的更好看，还是用 Lucy 的吧)](https://726355213-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqtlvcTJVEwNrHqsXK2M3%2Fuploads%2FpVC9lkGh10cCGMl4Pzhc%2Fapollo.png?alt=media\&token=209a7878-459f-4704-a4a0-a75e76cae064)

Kevin Jiang

2022年3月16日晚

\---------------------------------------------------------------------

看了看上次的时间戳，已经是半年过去了。之前的开发尚未完成，就把主要的精力投入到了科研里面，幸运的是，取得了比较好的结果。然后，又把主要的精力投入到了下一个科研项目和暑研之中😂 现在已经是下下个科研项目了，压力没那么大了，申请也已经递交了（听天由命了）。又由于疫情的缘故回到了家，对于Screeps和Minecraft又有了些兴趣。

因为之前的基于操作系统、计网等的设想还是很有意思的，但是没有开发完，所以想继续沿着之前的思想推进。希望这次能够慢慢的开发好吧。😂

2022年12月16日晚更新
