我正在开发一款小型浏览器游戏,但遇到了一个设计问题,我能想到的唯一解决方案是不好的。
它是一个典型的Web应用-Angular2 / HTML / JS前端,带有PostgreSQL DB的Java服务器,托管在nginx和Tomcat上的内容
用户可以与均具有自定义行为的各种NPC(非玩家角色)进行交互。我已经概括了这种逻辑,NPC作为配置行存储在数据库中,
访问mygame.com/npc/1会向Java中的后端API发出JS中的GET,以从数据库中获取该行,并绑定并显示这些值。将这些作为配置行存储在数据库中,使我可以添加新的NPC或编辑现有的NPC,而无需重新部署服务器或前端代码。
到目前为止,还算标准。但是,我希望全国人大对萨姆友善,拜访他会增加玩家的金钱。另一个NPC史蒂夫(Steve)应该怀有敌意,并从玩家清单中删除金钱或物品。 NPC鲍勃有时可以解锁玩家的任务。
这就是我遇到的问题: 每个NPC都有完全不同的行为,这意味着每个NPC都需要可执行代码。
我看到的两个选项都很糟糕,但是方式不同。
每个NPC都有自己的Java类,并且是服务器逻辑中的第一类实体。所有NPC都实现interact()
方法,添加或更改NPC都需要进行代码推送。
每个NPC在数据库中都有一个新列,其中包含可执行JS,可通过Java脚本引擎运行。这有点危险,但也很麻烦。编写可通过与Java代码库进行交互然后将其另存为字符串的形式调用数据库功能的JS,这很麻烦。
我目前正在使用选项2,但距离不远,想知道是否有一种可以接受的更好的方法来处理这种情况。
答案 0 :(得分:1)
在数据库中存储源代码与存储图像或文档没有太大区别。但是,我相信您正在寻找一种描述性语言(DSL)来描述NPC,而不是执行它的命令性程序。最简单的方法是创建基于XML或JSON的可扩展DSL。在这种情况下,XML文档可以作为角色的个人资料数据的一部分存储在数据库中。