【Java版】【游戏理论研究】村民与村庄的工作原理
minecraft吧
全部回复
仅看楼主
level 4
Sinnaruil 楼主
因为本人是建筑玩家的缘故,不是特别喜欢传统村民交易所的设计,一直计划着制造一个自然的真正意义上的村庄,同时还很能很好地满足交易的需求。
为了完成这一点,这两天花了点时间研究了一下一个自然存在的村庄的可行性。本文是这个研究的副产物,用以说明游戏里的村庄具体是如何工作的。
由于英文wiki对此也有些语焉不详,本文应该还是有一点价值的。当然总体上本文没有什么原创的东西,做的还是总结整理的工作。
如有纰漏,恳请指出。
少女祈祷中......
2026年06月22日 08点06分 1
level 4
Sinnaruil 楼主
二楼备用。
本文尽量写的通俗易懂一点,毕竟多少带点科普性质。
有留言可以在本楼楼中楼提出。
2026年06月22日 08点06分 2
level 4
Sinnaruil 楼主
【Part I 真实的村庄】
本节的目的是描述Minecraft游戏运算中对村庄的定义,以及描述村民是如何与村庄进行互动的。
参考:英文wiki,一些零散的网页,还有本人的游戏实践。
所用版本:26.2 + Fabric
请注意本文整个贴子从始至终只适用于Java版,Bedrock的村庄系统与Java版完全不同。
2026年06月22日 08点06分 3
前排字词
2026年06月23日 02点06分
level 4
Sinnaruil 楼主
需要先介绍一下子区块的概念。
大部分Minecraft玩家应该都熟悉区块的概念,这是minecraft保存很多数据所用的最小单元,大小是一个16x16的长方柱。
为了直观看到区块,在游戏中按下F3+G可以打开区块边界,这应该是大家都熟悉的。
2026年06月22日 08点06分 4
level 4
Sinnaruil 楼主
那么什么是子区块呢?
子区块是比区块更小的单元格。一个子区块是16x16x16的正方体区域,坐落于一个区块里,其将一个完整的区块从上到下分割成很多个小块。
为了直接看到子区块,同样地打开F3+G之后,图中的蓝色线正是子区块的边缘。
2026年06月22日 08点06分 5
level 4
Sinnaruil 楼主
接下来就可以介绍游戏里对于村庄的定义了。
首先,一个村民会绑定,或者说claim一个【床/钟/工作方块】(其中床绑定在床头)。被至少一个村民绑定的【床/钟/工作方块】,或者说一个claimed的【床/钟/工作方块】,就成为一个POI(Point of Interest),具体来说,被claimed的【床头/钟/工作方块】会带上一个claimed的NBT标签,以表明这个方块被某个村民绑定了。
村民绑定一个方块的过程我们留到后面说。目前大家只需要知道任何一个被绑定的【床/钟/工作方块】上带着某个NBT标签,告诉游戏这个方块是被村民绑定了。
接下来,这个被绑定的方块唯一存在于某个子区块里面,那么游戏就会将这个子区块转变为一个“村庄中心”(village center),并进一步将这个子区块以及其周围3x3x3范围的共计27个子区块转变为村庄。
那么游戏会不会判定两个位置属不属于同一个村庄呢?不会!在Java版本里,游戏从来没有过“一个村庄”的概念;它只会判断一个位置究竟是不是村庄,这就是全部了。
2026年06月22日 08点06分 6
level 4
Sinnaruil 楼主
写起来有点复杂,让我们看一个例子。
打开minecraft,按F3+G打开边界显示,在某个子区块里放下一张床。
此时由于没有村民与这个床链接,也就是这个床处于“unclaimed”的状态,这张床不会生成村庄。
2026年06月22日 08点06分 7
level 4
Sinnaruil 楼主
接下来放下一个村民。村民被放下之后立即冒出绿色粒子,表明其已经与这个床建立了链接。
2026年06月22日 08点06分 8
level 4
Sinnaruil 楼主
此时床转变为“claimed”状态,随即开始生成村庄,将其床头所在的子区块,连同周围的3x3x3的子区块全部转变为村庄。
这个村庄的真实边框用红色羊毛标记,在陆地上给出的边框用青色羊毛标记。
特别地,只要在同一个子区块内,无论你是用床,用工作方块,还是用钟,无论你是放在子区块中间,还是放在子区块角落,生成的都是同样大小的同一个村庄,没有任何区别。
(其中床所在的子区块由床头判定)
2026年06月22日 08点06分 9
level 4
Sinnaruil 楼主
手造太慢了,从这一楼开始加入了worldeditor mod。
2026年06月22日 08点06分 10
level 4
Sinnaruil 楼主
接下来,如果我们有许多个claimed的床,或者是claime的工作方块等,游戏就会生成许多块村庄。如果(比如说)两个claimed的工作方块离得很近,他们生成的村庄范围有重叠,那么游戏也不会认为这两个是“一个村庄”;游戏只是会认为边框内所有的位置在属性上都是“村庄的一部分”而已,至于是哪个村庄游戏并不关心。
下图是由一个claimed的工作方块与一个claimed床所生成的村庄大小。
2026年06月22日 08点06分 11
level 4
Sinnaruil 楼主
以上就是Java版村庄判定的全部内容。这个判定相比Bedrock版简单了很多很多倍。
接下来我们转向村民与村庄的交互问题。
2026年06月22日 08点06分 12
level 4
Sinnaruil 楼主
与Bedrock版本不一样的是,游戏里村民几乎没有什么关于村庄的行为。
后文即将看到,Java版本里面村民的各种行为和村庄基本无关,而只和真是的工作方块、钟、床这些可交互方块有关系。这是某种意义上Java版本各种与村民有关的机器都容易建造的原因和解释。
那么游戏里村民是不是就没有关于村庄的行为了呢?
也不是。村民还是有一定的行为的,其中之一(也是我知道的所有,在翻了一天的wiki和各种王爷之后)就是migration。
2026年06月22日 08点06分 13
level 4
Sinnaruil 楼主
migration翻译成移民,当然对于村庄来说用“移民”就太大了。对于Java版本的Minecraft,migration的意思其实非常简单,就是村民离开村庄之后重新移动回村庄的行为。
但是这里请注意,根据Wiki的解释,当村民离开村子之后它们就会立即开始尝试回到村子里。我们现在来做实验证明这一点其实是不对的(加粗)。
2026年06月22日 08点06分 14
level 4
Sinnaruil 楼主
事实上,村民在离开村庄之后的行为与昼夜有密切联系。
根据下图的村民行为时刻表我们能看到,村民一共有几个状态,分别是游荡(wondering)、工作(working)、聚会(gathering)、以及睡觉(sleeping)。对于小村民,还多了一个玩耍(Playing)。
2026年06月22日 08点06分 16
乐,这里就打成按w寻思的wonder了
2026年06月23日 01点06分
1 2 3 4 尾页