我正在编写一个基于文本的游戏,我希望用户能够操作任何项目。
我希望用户能够说,例如,"我把一瓶油扔到怪物身上。" 现在当发生这种情况时[throw]将是一个动作,[一瓶油]是一个具有属性[包含油]的库存物品,除非另有说明,否则怪物将是房间内最近的怪物。
代码需要分析所有这些事物的各种属性,然后选择导致这些事物相互作用的动作。
当我编写游戏故事代码时,它将如下所示
* room.darkroom.1"醒来" [...]一切都显得模糊,声音听起来很奇怪,好像在长长的隧道中回荡。从你所看到的你可以告诉你[你在一个黑暗的房间]你的视力从白色到黑暗模糊。 [pc在非常黑暗的房间里。在这个房间里,一切都隐藏在黑暗中。北墙有一扇厚厚的木门。南墙上有一桶装满一瓶油的油。在房间的东侧是2个中型板条箱,一个箱子包含燧石和生锈的匕首。在房间的西侧有一个[小窗口] * / room.darkroom.1
该脚本将获取所有这些单词并将属性应用于随机化某些未声明的元素。所以如果你那么说"主席"它将转到主席属性并随机分配未声明的属性。椅子的一个属性将是材料。如果没有说它是橡木椅子那么脚本应该从任何材料属性中挑选并分配它们。这个新主席将获取一些属性并保存以供将来参考具有所有属性的数据库。
另一个属性是一个动作。椅子不一定有动作......但它可能会破裂。脚本需要知道椅子是否易碎。但我认为可以嵌入另一个属性,如[韧性]。
很多东西都会有很多相同的特性:椅子,床头柜,桌子在很多方面都很相似。但是,根据应用于他们的行动,他们也会有不同的结果。
如何指定"破坏"包含椅腿和废料?椅腿和废料都需要继承被破坏的椅子的特性,例如橡木/易燃/易碎。显然,如前所述,如果橡木是保持这种价值的部分,它可能不必继承易燃或易碎。
我希望能够轻松访问存储属性的数组,并且可能包含影响行为和事物描述的脚本。
我开始创建一个循环的键控数组......但是现在我想我应该利用JavaScript的基于对象的元素。
这是我开始做的事情,但我立即停止了:
var language = {
// key currentmodifyers possible modifyers action/condition description of item
item: ";medium,material;;its a thing thats not a person",
chair: "item,chair_Legs;;pile_of.@scraps.collection.chairlegx3/broken,@[chair ]scraps/destroyed; and someone could sit on it. ",
chair_leg:"item,blunt,light,"
}
我有很多定义要编写,所以开始编写所有内容然后在我发现最佳方法时必须完成它将是一种耻辱。
我正在研究用JavaScript构建对象的各种方法,但希望有经验的人提供最好的方法。
了解问题的复杂性,存储和应用属性的最佳方法是什么?
答案 0 :(得分:1)
你的问题实际上有两个好主意:
但现在我认为我应该利用JavaScript的基于对象的元素。
您肯定需要使用对象而不是数组,OOP的想法可以直接应用于您的描述。 一些对象由较小的部分组成("组合"在OOP中),一些对象继承其他对象的属性("继承")。
所以你可以有一个基类Item
类来定义所有对象的基本操作和属性(比如它们有不同的属性,可以做一些事情)。
然后你可以添加像StaticItem
这样的对象(将是椅子,夜间等的基础)和LiveBeeing
(怪物等)。
现在你可以实际创建Chair
(伪代码):
StaticItem extends Item
this.material = oak // oak is an object of OakMaterial
// is this static item flamable?
this.isFlamable = function() {
// we "redirect" flamability detection to the material
return this.material.flamable();
}
Chair extends Static
// break this chair!
this.break = function() {
// when it is broken we return a HeapOfCrap, it is a
// Static subclass which contains some sub-items
// In this case the heap contains 4 chair legs of the
// same material as the chair
return HeapOfCrap([
new ChairLeg(this.material), new ChairLeg(this.material),
new ChairLeg(this.material), new ChairLeg(this.material)
])
}
依此类推,你需要仔细规划你的对象结构,并且有一个很好的领域来应用design patterns中的一些。
上面的例子正是我脑海中立刻想到的,而实际的设计应该花费更多的时间和思考。
你问题中的第二个好主意是关于大量的工作:
我有很多定义要编写,所以开始编写所有内容然后在发现最佳方法时必须完成它是一种耻辱。
你绝对在这里,你会选择使用对象或阵列,还是其他任何东西 - 不要试图立即描述你的所有游戏。
选择一些基本元素,例如" Room"," Door"," Chair"," Monster"," Player& #34;并尝试仅使用这些元素对最小游戏进行编码。
使用结构来找到好的设计,一旦你确定它是好的 - 继续为游戏添加更多元素。