本文转载自 新智元

一款游戏,让一位玩家皈依佛教。

这位玩家曾寄信开发者,因其开发的游戏理解了「众生皆苦,世事无常」。

究竟是什么游戏还能让人看破红尘?

Dwarf Fortress (矮人堡垒)!

2006年面世的矮人堡垒可以说是「开创类的老游戏」,就连《我的世界》开发者们表示自己深受这款游戏的启发。

你可知这个游戏背后的开发者如何将其建造出来?

矮人堡垒是由Tarn Adams(又名Toady One)一人开发,20年来,亲自写下70万行代码

最「现实」的游戏,最有理想主义的开发者

Tarn Adams 从2002年开始就在矮人堡垒工作。最初,它只是一个兼职项目。

从2006年开始,Adams一心投入,自己编写所有的代码

期间,Adams的兄弟还帮助他来设计和创建基于游戏的故事。

图右为Tarn Adams

目前,他正在开发一个带有像素图形和改进用户界面的版本,可以在Steam上购买。

近13年来,矮人堡垒并未在任何游戏平台上发售,这是因为「亚当斯兄弟」的信念。

他们希望这款游戏和市面上发布的商业版本有所不同,并且矮人堡垒也要以10年为单位,一直更新下去。

对于这漫长的更新,这对兄弟表示并没有任何规划。

「想到哪,做到哪。」

开发后的游戏不卖钱,稳定的收入从何而来?

全靠玩家捐赠维持生计!据说,亚当斯兄弟每个月可以有几千美元的捐赠收入,足以维生。

许多游戏玩家为此愤愤不平,但他们却表示,「我们只是不想成为商人,赚钱对我们来说没有意义」。

他们开发了最「现实」的游戏,却是最有理想主义的开发者。

沙盒游戏「鼻祖」,70万行代码,亚当斯兄弟自述

矮人堡垒至今已持续开发20年,有3种游玩模式。

1、要塞模式(Fortress mode):玩家要帮助一小群矮人从无到有建造城市。

2、冒险模式(Adventure mode):该模式下到处都是中世纪武器和要命的怪物。

3、传说模式(Legend mode):玩家能够体验逐渐演变的精巧历史,亲历充满英雄人物、横跨几代人的史诗战争。

那么仅凭一个人,如何敲下这70万行代码?

Adams表示,「我尝试给变量和对象一致命名,并且留下足够的注释来提醒自己到了一个代码点时会发生什么。有时候我需要多次搜索才能找到想要的线索。

当我去重温一些已经十年没有碰过的游戏片段时,这种情况经常发生。」

在矮人堡垒开发过程中,Adams 主要使用了2种编程语言,C和C++

为了将其更容易地移植到OSX和Linux系统中,Adams使用OpenGL和SDL来处理引擎问题。

整个项目中,除了SDL以便我们可以做端口之外,所有这些都一直保持不变。

在游戏机制方面,Adams并没有使用很多外部数据库,但是偶尔会选择一些随机的数字原始资料—— 比如梅森旋转算法(Mersenne twister),还有SplitMix64

其它类似于矮人堡垒的游戏会因为算法问题「夭折」。

矮人堡垒用的是A*算法,速度很快,但Tarn认为还是不够好。

一般而言,为了简化操作,开发者会在地图顶部添加各种大型结构。

但因为矮人堡垒的地图非常大,而且还会不断变化,用A*算法只会耗费大量维护时间。

所以Tarn决定,通过行走来追踪可到达的连接组件。这样就算地图变化再快,更新也很容易。

虽然更新维护变快了,但这个方法还是有缺点:

维护的部件指数只能用于行走。

针对这个问题,Tarn做过一些尝试,但都以失败告终。

他留意到有些成功的游戏用了矩形覆盖,觉得这个方法还蛮不错,但又没法确定那些游戏的地图大小和稳定性。

Tarn认为,最简单方法其实就是为飞行生物添加一个新索引。

但因为两个索引都需要同时维护,而其中一个索引已经够差了,所以这对内存和速度有很大影响。

又或者可以跟踪它们的路径属性,但是随着地图的变化,维护起来还是会变得困难缓慢。

Tarn表示,在代理和地图复杂性方面,目前已经尽最大能力来支持agent和复杂的地图了,所以如果我们想从中得到更多,就必须做出一些让步。

「失败就是乐趣!」

除了矮人堡垒,Tarn在过去十年左右的时间里也尝试做过其它游戏项目。

不多,也就大概90个吧。

不过,有些项目只能持续了几天,有些就持续了好几年。

这些游戏项目几乎都是其它类型的游戏,但也有一些是矮人堡垒的辅助项目,比如神话生成器原型。

虽然基本上没有多少个项目能够持续运作下去,但Tarn认为,偶尔摆脱矮人堡垒,开开小差还是挺不错的。

在这90个「随便做做」的项目里,Tarn也想过用其它编程语言。

他认为有些语言是能够加快实现设计,所以他觉得自己应该再学一点脚本语言,多玩一些线程。

不过人嘛,都是「想一套,做一套」。

对于更喜欢设计的Tarn来说,既然那90个项目是用来摸鱼放松的,又怎么会去学编程语言呢。

bug是所有开发人员都逃不掉的坑。

在矮人堡垒这个游戏里,Tarn最喜欢的bug是那只永远都打不赢的醉猫。

在酒馆里的猫在地板上走来走去,猫爪就沾了不少洒出来的酒,结果猫在舔爪的时候就喝醉了。

这个bug是因为在猫舔爪摄入东西的代码里,有个数字出错了,结果这个bug就让猫显示出了酒精中毒的症状。

不过,这个bug反倒是被Tarn利用起来,添在了有毒生物的设计代码里了。

参考资料:

https://stackoverflow.blog/2021/07/28/700000-lines-of-code-20-years-and-one-developer-how-dwarf-fortress-is-built/

20年,1人写出70万行代码!沙盒游戏「鼻祖」13年靠玩家捐赠维生相关推荐

  1. 那个 CEO 写下 70 万行代码的公司,马上要上市了

    作者 | 小智 5000 研发,24 万台服务器,CEO 写下 70 万行 C++ 代码,这家技术基因驱动的短视频公司,就是快手. 5000 名研发员工,24 万台服务器,22 个网络数据中心,半年研 ...

  2. 市值超万亿港元!那个CEO写下70万行代码的公司上市了

    本文转载自 今天,快手正式在香港上市,开盘涨194%,报338港元/股,发行价为115港元/股.快手总市值一度高达1.39万亿港元. 快手联合创始人.董事长兼CEO宿华在上市致辞中提到,快手最在意的始 ...

  3. 快手上市 CEO写下70万行代码 致敬程序员改变世界

    今天,快手正式在香港上市,开盘涨194%,报338港元/股,发行价为115港元/股.快手总市值一度高达1.39万亿港元. 快手联合创始人.董事长兼CEO宿华在上市致辞中提到,快手最在意的始终是人,是对 ...

  4. 70万行代码、历时20年,一名开发人员写出的史诗般的计算机程序

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 编译丨核子可乐.Tina 来源丨InfoQ(ID:infoqchina) "开发到死,永不停更 ...

  5. 写了100万行代码的程序员?

    今天在社群上闲逛,突然发现一个十分有趣的帖子,<写了100W行的代码是啥感觉?>看完之后就头皮一阵发麻,让我写一万行的代码?!are you kidding me? 我估计写到20万的时候 ...

  6. 如何写出漂亮的代码:七个法则

    如何写出漂亮的代码:七个法则. 首先我想说明我本文阐述的是纯粹从美学的角度来写出代码,而非技术.逻辑等.以下为写出漂亮代码的七种方法: 1, 尽快结束 if语句 例如下面这个JavaScript语句, ...

  7. 怎样写出无法维护的代码

    每次写代码的时候,我都尽量写出一个尽可能方便其他人看得懂的代码,没办法,很多时候维护也是我自己,活着小的看不懂,还是我自己出手.但今天我想反其道而行之,怎样才能写出一份无法维护的代码. 原文在这里,原 ...

  8. java好的代码_做java软件工程师,怎样才能写出好的代码?

    原标题:做java软件工程师,怎样才能写出好的代码? Java代码之于java程序员而言就是左膀右臂,java代码写的好的java程序员明显更是企业的欢迎,一个优秀的java程序员的考核标准之一也是看 ...

  9. 如何写出无法维护的代码

    本文来自:酷壳--CoolShell 地址:https://coolshell.cn/articles/4758.html 如何写出无法维护的代码 2011年06月03日  陈皓 评论 120 条评论 ...

最新文章

  1. MVC+EF三层+抽象工厂
  2. qt 串口 环形缓存_qt linux串口 缓冲区多大
  3. 开发人员转售前工程师_工程师和营销人员可以从中学到什么
  4. leetcode题库522 --最长特殊序列 II
  5. 二分查找递归、非递归实现(Python)
  6. LaTex论文排版 | (18)算法流程图(伪代码)
  7. 《规划力:如何清晰预见成功轨迹》PDF文字版电子书下载
  8. 连表时数据量翻倍问题
  9. 华为交换机初始化_华为S5700交换机初始化配置举例
  10. 安全架构--2--关于企业安全体系建设历程的思考
  11. 2019年高三自主招生面试考生如何自我介绍?范文3篇整理
  12. 跨期套利的四大核心逻辑
  13. 拼多多商家推广常见问题解答!
  14. vue怎么调用子元素的方法_vue 父组件中调用子组件函数的方法
  15. 通过图轻松了解各种协议
  16. 用词袋(bag of word)实现场景识别
  17. 校验国内外的座机和手机号码
  18. 自动还原魔方算法数据结构
  19. java画哆啦A梦_java如何绘制哆啦A梦 java绘制哆啦A梦代码示例
  20. 3D/VR/AR简易技术原理介绍

热门文章

  1. Java对象内存分析【基础版】
  2. 关于人工智能的9个可能让你大吃一惊的事实
  3. 山石网科防火墙绑定AD域实现远程办公
  4. 虚拟偶像秦佑之担任推广大使,虚拟人制作技术带来文化艺术新体验
  5. CodeBlocks+c+lua+iup
  6. 聚合支付解决了商户哪些问题?
  7. 觖决Caused by: org.quartz.SchedulerException will never fire.抛的异常
  8. VS2012下基于Glut OpenGL GL_QUADS示例程序:
  9. 【软件构造】第二章知识整理
  10. 【密歇根大学博士论文】深度强化学习进展:内在奖励,时间信用分配,状态表示和价值等效模型...