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

目录

大纲
任务
文件格式
编程实现

从这篇博客开始,我将无人在意地开始一个名为Rusty Town的新项目,参考的便是知名的“斯坦福小镇”,最终目标是利用现有的知识创建一个合理、多样、自运行的小世界。另外,本项目需要用Rust语言进行编写,这也是为了检验上个学期自学的成果,所以说这也可以看作是Rust的一次小练习(存疑),而这些博客也将是本项目推进的过程中所记下的开发日志。

其实我的目标只有一个:不咕就好_(:зゝ∠)_

大纲

咱毕竟也是个成熟的软件工程专业的学生了,往日那一言不合就直接开干的日子也一去不复返了。虽然未必真的要和书本上那样教的一板一眼地画各种图、写各种文档,但最基本的大纲还是要列的,就像写作文那样~~(说起来我好像也不喜欢在写作文时列大纲)~~。而且将大纲一条条列出来还有一种畅快的满足感,就像自己真的一条条完成了一样(雾)。

那么话不多说,直接开始:

小镇里最重要的是什么?当然是智能体所扮演的角色啦。每个角色都有其不变的属性与不断变化的状态,角色与角色之间会有复杂的人际关系,不同的角色会有其独一无二的作息时间表,有其独特的偏好,也有其专属的记忆。角色要身处在环境中才有其意义,环境既包含时间,也包含小镇中的不同地点,地点之间或直接或间接地相连,角色可以在地点中进行该地点独属的活动。而要让这一切变得合理、多样、自运行,就要求智能体能够考虑其属性与状态,综合人际关系、偏好与记忆,依据外部的环境,从当前可选的活动中进行选择,并随着时间的推进不断迭代更新。而这也就是本项目运行的逻辑。

环境 +-时间 +-日期 +-时刻 +-地点 +-地名 +-(可做)行为 +-(与其他地点的)关联 +-连通 +-距离 +-天气 角色 +-属性 (固定不可变) +-姓名 +-性别 +-年龄 +-身份 +-能力 +-住所 +-状态 (随时间变动) +-位置 +-金币 +-心情 +-生理状态 +-饥饿 +-口渴 +-精力 +-便意 +-清洁 +-衣着 +-人际 +-好感 +-关系 +-家庭 +-情侣 +-朋友 +-活动表 日常活动记录 +-工作日/休息日 +-睡眠时间 +-工作时间 +-闲散时间 +-工作地点 +-娱乐场所 +-偏好 +-理想(整体长期) +-目标(局部短期) +-物品 +-关系 +-资产 +-爱好/厌恶 +-食物 +-衣着 +-地点 +-行为

以上就是我们的大纲,虽然未必尽善尽美,但至少能对我们的创作进行一定的指导。

任务

这次的任务比较简单(大概),需要完成小镇中关于地点的的部分。为了后续的可扩展性,显然需要使用文件来存储地点信息,这就需要我们设计文件应有的结构,以及地点类的接口。

当然与此同时我们也需要设计Rusty Town对应的地图,下面便是我用网站Excalidraw制作的灵魂绘图:

锈镇地点图.png

先不说合不合理,就说像不像那回事吧(

文件格式

关于数据该如何存储的问题,我们还是要用到我们的老朋友json,正好Rust也有专门用于处理json数据的包serde

整个小镇的总览文件看起来是这样的:

json
// resources/places/town.json {     "name": "rusty town",     "cname": "锈镇",     "description": "一个宁静的小镇",     "places": [         "houses",         "school",         "library",         "hospital",         "church",         "inn",         "tavern",         "park",         "farm",         "town-square",         "business-district",         "government"     ] }

主要作用是列出小镇中会出现的所有地点,便于读取各个地点所对应的json文件。

而记录某某地点的json文件看起来是这样的:

json
// resources/places/school.json {     "name": "school",     "cname": "学校",     "description": "教师在这里为学生授课",     "activities": [],     "distances": {         "library": 3,         "business-district": 5,         "town-square": 4     } }

该文件主要记录了在学校可以进行的活动,以及其相邻地点与距离。

编程实现

本次主要实现了三个类:记录小镇整体信息的Town类,代表地点的Place类,以及将字符串匹配到对应Place的PlaceMap类。

在文档和AI的帮助下完成了对代码的模块化,但感觉还是有些别扭,果然还是C++写多了吧( ̄▽ ̄)

其余的我也就一笔带过了,毕竟我这样的Rust初学者也不好意思再在这指导些什么。总之,最终测试程序的输出结果像是这样的:

Hello, Rusty Town! 锈镇: 一个宁静的小镇 places: houses, school, library, hospital, church, inn, tavern, park, farm, town-square, business-district, government places: ["houses", "church", "farm", "business-district", "school", "town-square", "park", "government", "library", "tavern", "inn", "hospital"] place: 学校: 教师在这里为学生授课 activities: neighbors: town-square, library, business-district distance between school and library: 3

虽然肯定还有许多要改进的地方,不过看上去作为第一阶段已经差不多了。现在还是祈祷第二篇开发日志能够赶紧出来吧(逃