门在身后关上的瞬间,林墨以为会陷入彻底的黑暗。
但没有。
房间里亮着光。不是灯光,而是从墙壁本身发出的淡蓝色荧光,像是整个房间被嵌入了一块巨大的屏幕。光线柔和但足够明亮,能让他看清周围的一切。
这是一间教室。
但不是普通的教室。
房间比走廊里的标准教室大了一倍,没有课桌椅,没有讲台,没有黑板。取而代之的是——代码。墙壁上、天花板上、甚至地板上,到处都是流动的代码。不是之前那种投影式的、半透明的代码流,而是真正的、像是用光刻在表面上的代码,一行一行,密密麻麻,像是某个疯狂程序员留下的遗产。
林墨站在原地,缓缓转动身体,让眼睛适应这诡异的场景。
代码的语言他认识——Java。虽然有些语法细节和他熟悉的版本有细微差异,但整体结构是一致的。类、方法、变量、循环、条件判断——一切都按照他熟悉的逻辑在运转。
系统面板自动展开了。
【检测到“核心教室”。该教室存储着副本的全部规则源代码。】
【当前可访问的代码模块:明规则模块、隐藏规则模块、NPC行为模块。】
【警告:部分代码受到加密保护,需要消耗精神力解锁。】
林墨没有急着去解锁加密代码。他先做了一件程序员最擅长的事——找入口。
整个教室的代码是连续的,从一面墙延伸到另一面墙,形成一个闭环。但代码的“起点”——也就是程序的入口函数——在哪里?
他沿着墙壁走,目光一行一行地扫过代码。Java程序的入口通常是public static void main(String[] args),但这里的代码结构和他熟悉的Java程序不太一样——它更像是某个更大系统的一个子模块,没有独立的main函数,而是通过一系列接口对外提供服务。
林墨在教室的东北角找到了入口。
不是main函数,而是一个标注为@RuleBook的注解。在Java中,注解是一种元数据,用于给代码添加额外的信息。这个@RuleBook注解下面,是一个巨大的HashMap,键是规则编号,值是规则的具体实现代码。
他找到了规则一到规则八的完整代码。每一段都比系统面板里显示的更详细,包含了注释、版本号、甚至作者签名——虽然作者签名是一串看不懂的符号,可能是高维文明的文字。
规则一的代码有一个注释:
```java
// 版本:1.0.3
// 最后修改:未记录
// 注意:时间判断使用副本服务器时间,非选手本地时间
```
规则二的代码有一个有趣的细节:
```java
// 奔跑判定:速度 > 1.5m/s 且 步频 > 2.5步/秒
// 阈值可据班主任的主观判断动态调整
```
动态调整——这意味着同样的速度,班主任心情好的时候可能不算奔跑,心情不好的时候可能就算。这是一个隐藏的变量,选手无法精确控制。
规则三的代码中,他看到了之前利用的那个漏洞:
```java
// 寻找最近的教室
public Classroom findNearestClassroom(Student s) {
List<Classroom> all = getAllClassrooms();
all.sort((c1, c2) -> {
double d1 = distance(s.position, c1.position);
double d2 = distance(s.position, c2.position);
return Double.compare(d1, d2);
});
// 注意:如果前两个距离相等,当前实现返回第一个
// 但规则文本要求“唯一的最近教室”,此处存在逻辑不一致
return all.get(0);
}
```
注释里承认了逻辑不一致,但没有修复。这不是bug,这是设计——设计者故意留下了一个漏洞,让聪明的选手可以利用。
规则四的代码比他之前看到的更复杂:
```java
// 班主任提问模块
public void askQuestion(Student s, String question) {
s.mustAnswer = true;
s.mustBeTruthful = true;
String answer = s.getAnswer();
if (answer == null) {
punish(s, "未回答");
} else if (isLie(answer, question)) {
punish(s, "撒谎");
} else {
int satisfaction = evaluateAnswer(question, answer, s.history);
if (satisfaction >= 60) {
release(s);
} else {
punish(s, "回答不令人满意");
}
}
}
```
关键变量是satisfaction——满意度。不是对错,而是满意度。这意味着即使答案是正确的,如果班主任不满意,仍然可能被惩罚。这是一个主观判断的黑盒。
规则八的代码中,他看到了“暗黑时刻”的完整逻辑:
```java
// 午夜仪式
public void midnightRitual() {
for (Student s : allStudents) {
if (s.isAtCorridorCenter() && s.isFacingEast() && s.eyesClosed() && s.duration >= 30000) {
s.passRitual();
triggerDarkMoment(); // 触发暗黑时刻
} else {
punish(s, "仪式失败");
}
}
}
```
暗黑时刻的代码被单独放在一个模块里,加密等级比明规则高。林墨消耗了10点精神力,解锁了部分内容:
```java
// 暗黑时刻
// 持续时间:11分钟(已固定)
// 规则:明规则挂起,暗黑规则生效
// 暗黑规则:
// 1. 班主任速度+300%
// 2. 班主任攻击范围=全走廊
// 3. 学生背靠背形成安全区
// 结束条件:触发规则漏洞
```
林墨看到这里,微微点头。他的判断基本正确。
现在,他要找的东西——规则全书——在哪里?
规则书他已经有了,但那只是选手可读的版本,相当于用户手册。真正的规则全书,应该是这些源代码本身。但班主任说的“规则全书”在讲台抽屉里,这个教室没有讲台。
林墨继续搜索教室。在教室的中央,地面上的代码突然中断了,取而代之的是一个凸起的平台。平台上放着一本厚厚的书,比他的规则书大三四倍,封面是黑色的,烫金的标题写着“规则全书”。
林墨走过去,伸手去拿。
手指碰到书封的瞬间,系统面板弹出警告:
【检测到“真·规则全书”。持有该书可解锁副本全部规则。】
【警告:规则全书受到保护。未经授权持有将触发班主任的强制回收机制。】
【当前授权状态:无。需要班主任的授权才能安全持有。】
班主任的授权。
他想起班主任说的话——“规则全书只有在班主任手里才是完整的。学生拿着它,看到的只是碎片信息。”她说的没错,但她的目的是让他把书带回去交给她。
如果他自己持有这本书,会触发回收机制。班主任会来抢,而且可能是强制性的、无法抵抗的。
但如果他持有助教权限呢?助教是否算作“半授权”状态?
林墨没有贸然拿起书。他先把手放在书封上,不拿起来,只是接触。系统面板更新了信息:
【接触状态:检测到“助教权限”。持有规则全书的限制部分解除。】
【当前可阅读内容:全部规则的80%。剩余20%需要班主任权限。】
【强制回收机制状态:未触发。原因:未正式持有。】
未正式持有——他只是触碰,没有拿起。这是一个文字游戏,但规则怪谈恰好就是文字游戏。
林墨翻开书的第一页。
和选手规则书不同,这本规则全书不是表格形式,而是真正的源代码打印版。每一页都是一段完整的代码,配有注释和说明。他快速翻阅,找到了隐藏规则二的相关内容:
```java
// 隐藏规则二:班主任的真实姓名
// 触发条件:班主任提问“你叫什么名字”时,反问“你叫什么名字”
// 惩罚条件:反问时若班主任好感度<20,触发惩罚
// 奖励条件:反问时若班主任好感度≥20,班主任会告知真实姓名
// 好感度要求:西侧班主任需要≥20,东侧班主任需要≥50
```
好感度。他之前看到过这个参数——西侧班主任好感度10/100,东侧0/100。都不够。他需要提升好感度才能安全触发隐藏规则二。
林墨继续翻阅,找到了规则七的“额外规则”:
```java
// 规则七额外规则:当两名及以上学生同时进入同一间教室时,触发“教室争夺战”
// 教室争夺战规则:
// 1. 进入教室的学生进行“规则问答”对决
// 2. 每轮提问由班主任出题
// 3. 答错或答不出者被淘汰
// 4. 最后留在教室的学生获得“教室控制权”
```
教室争夺战。这就是为什么之前樱花国选手和泡菜国选手没有强行冲进109教室——他们不想触发这个高风险的对决。
林墨合上规则全书,没有拿起来。
他需要做出一个决定:把书带回去给班主任,还是自己留着?自己留着只能看到80%的内容,而且随时可能触发回收机制。带回去给班主任,她可能会给他奖励,但也可能翻脸不认人。
他看了一眼手环——凌晨三点五十一分。
距离四点还有九分钟。班主任给他的时限是四点之前回去。
林墨深吸一口气,做出了选择。
他把规则全书留在平台上,转身走向门口。门在黑暗中若隐若现,他伸手去推——门开了。
走廊里的光线涌进来,刺眼。他眯着眼睛走出去,铁门在他身后再次关闭,然后像之前一样消失了。
走廊里,樱花国选手和泡菜国选手还站在原地,一脸震惊地看着他凭空出现。
“书呢?”樱花国选手问。
林墨没有回答。他快步走向109教室,手里的钥匙还握着,铜色的金属在灯光下泛着暗光。
他要在四点之前回到班主任面前。