编辑
2025-02-18
夺巧
00
请注意,本文编写于 121 天前,最后修改于 121 天前,其中某些信息可能已经过时。

目录

角色类
人际关系
角色文件

幸运的是,学期刚开始的我似乎是干劲十足(其实主要是因为无事可做),于是Rusty Town的第二篇开发日志也很快写了出来,本次日志主要实现了Character类,即角色部分,以及角色间人际关系的实现。完成这两个部分后,我们将得以获取并修改角色状态,以及维持一个不断变动的人际关系表来影响角色可能做出的决策。当然,只实现这两个部分是远远不够的,毕竟Character也即智能体在这个项目中始终处于核心地位,而另外的部分也将会在之后的日志中逐渐完善。

话不多说,我们直接开始(。・ω・。)

角色类

很自然的是,角色需要用一个类来集成与其相关的属性和信息。一旦完成了角色类,再结合由我们之前实现的地点和时间组成的环境,以及之后我们将要实现的活动,就组成了接下来这个简单又重要的循环:

(角色,环境)决策活动(角色,环境)\overset{决策}{\longrightarrow} 活动

角色活动新角色角色\overset{活动}{\longrightarrow}新角色

环境活动新环境环境\overset{活动}{\longrightarrow}新环境

这之中负责改变角色与环境状态的其实还是活动,因此理论上说角色类只需要负责记录与角色相关的信息即可。

来看看Character类的实现:

Rust
pub struct CharacterStatus {     pub location: String,     pub gold: u32,     pub energy: u8,     pub health: u8,     pub hunger: u8,     pub mood: u8,         relations: HashMap<String, (Relationship, i8)>, } pub struct Character {     name: String,     gender: String,     age: u8,     identity: String,     residence: String,     status: CharacterStatus, }

其实细心的同学在上一篇日志中应该也注意到了,我刻意地将属性状态这两个词区分开来,在我的理解中,属性指的是那些不会变动或至少不会经常变动的信息,而状态指的是那些随着时间推进不断更新变化的信息。因此姓名、性别、年龄(我们的项目暂时不考虑年龄的变化)、身份、居住地这些被视为属性,而所在地、金币数、精力、健康、饥饿度、心情这些则是状态。状态可读可写,而属性只可读。

将属性和状态分离还有一个好处。与地点类似,角色的属性和状态也需要从文件中读取。但属性可以提前设定好,但每个角色的状态在每次开局都应该是一成不变的吗?显然不是如此,存储属性和状态的文件应该分离开,设定属性的文件只需要一份就够了,但设定起始状态的文件却可以有很多份。另外,本项目在之后也将不可避免地涉及到存档的问题,只需要将当时的状态保存为文件,之后再次运行时读取为起始状态即可。

人际关系

刚刚我们一直没有解释relations的由来,其实表示的就是该角色的人际关系表,类型是键为人名,值为关系、好感度二元组构成的哈希表。要注意到本项目的人际关系其实是双向的,不同于许多游戏的好感度实际上表示的是其他角色对主角的好感度(毕竟谁也不知道你到底更喜欢哪个角色),角色A的relations记录的是A对其他角色B、C、D的好感度与关系,而B对A的好感度和关系则记录在B的relations中。每个角色只知道自己对其他人的看法,而这也会影响角色做出的决策,而其他人怎么看待自己却不得而知,如此的设定显然更符合现实中的人际关系。(同时也能轻松复现暗恋一类的扭曲场景)

关于人际关系究竟该怎么实现我也纠结了很久(刚刚还推倒重来了一次)。一开始我想的是用一个单例来集成所有人之间的人际关系,后来想想这样意味着要用键为两个人名的哈希表,实在是有些丑陋。而且单例模式个人也不是太喜欢,恰好这里的人际关系是双向的,对统一调配的需求也较低,不如就放在各自的角色类中。如此一来人际关系也将作为一种状态,需要设定初始值,以及在存档时保存,而这也是符合直觉的。

角色文件

接下来,我们就可以给锈镇中的居民写json设定文件啦。如上所述,设定文件需要由属性文件以及初始状态文件两部分组成。

json
// resources/characters/Alice.json {     "name": "Alice",     "gender": "female",     "age": 25,     "identity": "shopkeeper",     "residence": "houses 101" }
json
// resources/characters/initial_status/Alice.json {     "location": "houses",     "gold": 200,     "energy": 100,     "health": 80,     "hunger": 40,     "mood": 50,     "relations": {         "Bob": ["Girlfriend", 80],         "Daisy": ["Friend", 50]     } }

像这样我已经在锈镇中添加了一共7个角色,虽然目前看上去有些少,但好消息是后续可以即插即用地添加更多的角色。虽然这些设定文件只有寥寥几行,但相信在不久的将来会演绎出丰富多彩的故事的。