Getting started

"Screeps 阿波罗计划" 序章

Hi !

这是我为我的"Screeps 阿波罗计划"写的开发设计文档。如果你不知道 Screeps 是什么,可以参考 hoho 的《Screeps 介绍及入坑》文集,里面的介绍和技术概念设计写的非常深入浅出。

<Screeps>_

序言

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

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

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

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

Logo for Lucy
仿照 tigga 的核心部分布局

后来,随着游戏的深入,外矿LabPower BankMarket,防御体系,风筝战术,自动扩张都被我加进了我的 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 的吧)

Kevin Jiang

2022年3月16日晚

---------------------------------------------------------------------

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

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

2022年12月16日晚更新

Last updated