在当前的计算机游戏状态下,在线游戏为王。 无论是久负盛名的MMORPG魔兽世界(在13年后仍然保持强劲势头),免费增值的MOBA英雄联盟,抽搐射击游戏(例如CounterStrike:Global Offensive),甚至是卑鄙的Scrabble克隆版Words With Friends,在线多人游戏体验都令人赞叹不已所有游戏活动的72%。 这种现象背后的驱动力是无数的,包括光滑的图形,引人入胜的游戏玩法以及复杂的UX设计,以及与他人一起玩游戏比独自玩耍更有趣的事实。
然而,尽管网络游戏在当前的气候下占据着主导地位,但它们的起源却非常卑鄙。 早在出现逼真的3D模型,高保真声音和清晰灵敏的控件之前,最早的在线游戏就包含基于文本的世界和用于浏览它们的简单命令行。 它们被称为MUD,是多用户地牢(或Dimension,取决于您与之交谈的人)的缩写,并且其游戏玩法受到了Dungeons and Dragons的强烈启发。 人们通过telnet连接到他们,telnet是一种预万维网协议,允许远程用户为服务器创建虚拟终端。 MUD充当聊天室和角色扮演游戏的一部分; 有时前者要比后者多,因为游戏玩法非常有限,几乎完全由基于d20的战斗组成。
尽管与公认的现代RPG相比,它们看上去非常原始,但值得一提的是,按游戏标准,MUD作为一种流派非常古老-第一个最初是在1978年编码的,而最受欢迎的代码库可以追溯到1991年。 ,并且仍然大部分是用C编写的; 其他MUD代码库已经使用新的编程语言(包括Ruby!)创建,但是C仍是其选择的语言,因为它的速度很快,它也是MUD多年来积累的大量旧代码的语言。
实际上,MUD在13岁时首先引起了我对编码的兴趣,因为我想从事这些从中获得很多乐趣的游戏。 我最初尝试学习编码的尝试没有成功(当您甚至还没有上过高中代数时,学习C语言就不会发生),因此我将这一想法搁置了22年。
不过,既然现在我正在学习编码,我认为现在是重新审视青年游戏并了解我可以从中学习的内容以及如何通过更现代的编程来改进它们的好时机。 如果可以管理的话,最终目标是在Ruby中重建MUD。
在计划这个副项目时,我设法掌握了EliteMUD的代码库,这是一个1993年在瑞典皇家理工学院和我的在线家庭中创建的MUD,比我想承认的要长得多。 但是,通读那些为我提供很多娱乐的代码行是一次艰难的经历,因为它们都是用-是的-C编写的。
因此,当我尝试将我的新编码技能应用于我以前的迷恋时,遇到了一个难题:要么尝试反向工程一个我只能理解一点点的代码库,要么从头开始构建没有任何东西的新代码库。但是我对Ruby的了解以及我二十年前的记忆。
好吧,在Flatiron,我们正在学习成为Rubyists。 选择很明确。
在思考如何构建游戏代码时,对我而言立即突出的一件事是,Ruby中提供的选项对我来说不是90年代的C程序员。 上述选项中最重要的选项是Ruby与C相比如何处理面向对象的编程。C并不真正具有我们理解的对象,而是使用称为struct的东西,它类似于类,但是没有方法或public /私人规格。
为了解释为什么这很重要,我首先需要回溯并解释诸如MUD的基于文本的游戏如何在后台运行。 MUD的世界通常由对象(玩家可以与之交互,拾取,放置,装备等物品),小怪(MOBile对象的缩写)组成,这些NPC是玩家可以查看,购买物品的NPC,将物品卖给或(通常是杀死)物品和房间(包含以上两个条件,并且可以由玩家和暴徒随意穿越)。 然后,将代表这三种类型的数据作为变量传递,以创建它们在游戏中的表示形式。 但是,由于C通过结构创建事物,因此对象,生物和房间数据存储为*字符串*而不是对象,然后将其作为变量传递到结构中。
这不仅使代码极难阅读(请注意用于指定对象属性的难以理解的字母汤),而且还会在创建游戏资产时造成一些障碍-每次游戏创建房间,暴民或项,它必须将字符串作为变量传递到结构中。 此外,结构不能具有类或实例方法,这意味着我们可能要在游戏资产上使用的每个方法都必须分别编码和单独编码。
因此,将游戏资产表示为类而不是结构会给我们带来一些好处。 可以将对象本身用作数据存储,并通过例如Mob.new(mob_id)创建它们,而不是每次我们要创建一个新对象时都将所有内容作为变量传递。 这将提高代码的可读性,并允许我们使用实例和类方法,从而使我们能够对对象,生物和房间执行操作。 因此,而不是上面的屏幕截图,我们最终得到的对象数据的结构如下:
当然,这是一个非常粗糙的示例,但我发现在Ruby中如何构造游戏资产是一个更为简化的过程。
与原始C实现相比,Ruby为我们提供的另一个巨大优势是它们不使用数据库。 相反,“一切”作为字符串存储在游戏文件中。 下次,我将探讨如何使用ActiveRecord来发挥我们在存储游戏数据方面的优势。