0

我正在开发一个小型浏览器游戏,我遇到了一个设计问题,我能想到的唯一解决方案很糟糕。

它是一个典型的网络应用程序 - Angular2/HTML/JS 前端、带有 PostgreSQL DB 的 Java 服务器、托管在 nginx 和 Tomcat 上的内容

用户可以与具有自定义行为的各种 NPC(非玩家角色)进行交互。我已经通用化了这个逻辑,NPC 作为配置行存储在数据库中,

  • 编号:1
  • 名称:Sam The NPC
  • ImgURL:“www.mygame.com/img/npc/sam.png”

访问 mygame.com/npc/1 会在 JS 中向 Java 中的后端 API 发出一个 GET,以从数据库中获取该行,然后绑定并显示这些值。将这些作为配置行存储在数据库中允许我添加新的 NPC 或编辑现有的 NPC,而无需重新部署服务器或前端代码。

到目前为止,标准。但是,我希望 NPC Sam 友好,拜访他会增加玩家的金钱。另一个 NPC,史蒂夫,应该是敌对的,并从玩家库存中移除金钱或物品。NPC 鲍勃有时可以解锁玩家任务。

这就是我卡住的地方:每个 NPC 都有完全不同的任意行为意味着我需要每个 NPC 的可执行代码。

在我看来,我的两个选择都很糟糕,但方式不同。

  1. 每个 NPC 都有自己的 Java 类,并且是服务器逻辑中的第一类实体。所有 NPC 都实现一个interact()方法,添加或更改 NPC 需要代码推送。

  2. 每个 NPC 都会在数据库中获得一个包含可执行 JS 的新列,以通过 Java 中的脚本引擎运行。这有点危险,但也很麻烦。编写可以通过与 Java 代码库交互然后将其作为字符串保存在数据库中来调用 DB 函数的 JS 是很笨拙的。

我目前正在使用选项 2,但并不太深入,我想知道是否有一种公认的方式来处理这样的事情会更好。

4

1 回答 1

1

将源代码存储在数据库中与存储图像或文档没有太大区别。但是,我相信您正在寻找一些声明性语言 ( DSL ) 来描述 NPC,而不是实现它的命令式程序。最简单的方法是创建基于 XML 或 JSON 的可扩展 DSL。在这种情况下,XML 文档可以作为角色配置文件数据的一部分存储在数据库中。

于 2019-01-29T12:49:02.707 回答