You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SWI-Prolog游戏门锁逻辑异常:无钥匙仍可通行问题求助

修复SWI-Prolog文本冒险游戏的锁门验证问题

问题描述

开发的SWI-Prolog文本冒险游戏中,玩家无需拾取花园中的钥匙,即可通过use(door(garden,hallway))命令进入走廊,违反了“必须持钥匙解锁该门”的需求。

故障原因分析

  1. 语法错误:can_access(hallway)谓词中的条件分支使用了HTML转义字符->,而非Prolog标准的->操作符,导致钥匙检查逻辑完全失效,无论玩家是否持有钥匙,该谓词都会直接成功。
  2. 逻辑设计缺陷:can_access以目标房间为参数,而非具体的门实例,无法区分双向门的不同权限(比如从走廊返回花园无需钥匙,但从花园进入走廊需要钥匙)。

修复方案

步骤1:修正语法错误

将can_access(hallway)中的->替换为Prolog标准的->操作符。

步骤2:重构锁门验证逻辑

把针对房间的can_access/1改为针对门的验证,确保每个门的锁状态独立检查:

  1. 删除原有的can_access(hallway)谓词,替换为以下代码:
% 检查门是否可通行
can_access(Door) :-
    % 判断门是否上锁
    (   locked_door(Door, RequiredKey)
    ->  % 上锁的门:检查是否持有对应钥匙
        (   inventory(RequiredKey)
        ->  write('You unlocked the door and entered the next room.'), nl
        ;   write('The door is locked, you need a '), write(RequiredKey), write(' to unlock it.'), nl,
            fail  % 阻止移动
        )
    ;   % 未上锁的门:直接通行
        write('You opened the door and entered the next room.'), nl
    ).
  1. 修改use(door(Room1, Room2))谓词,将房间级的权限检查改为门级检查:
% 使用门的逻辑
use(door(Room1, Room2)) :-
    current_room(Room1),
    door(Room1, Room2),  % 确认门存在
    can_access(door(Room1, Room2)),  % 检查该门的通行权限
    retract(current_room(Room1)),
    asserta(current_room(Room2)),
    !.

修复后的完整核心代码片段

% 使用门的逻辑
use(door(Room1, Room2)) :-
    current_room(Room1),
    door(Room1, Room2),  % 确认门存在
    can_access(door(Room1, Room2)),  % 检查该门的通行权限
    retract(current_room(Room1)),
    asserta(current_room(Room2)),
    !.

% 门无法解锁时的提示
use(door(_, _)) :-
    write('You cannot unlock the door.'), nl,
    fail.

% 检查门是否可通行
can_access(Door) :-
    % 判断门是否上锁
    (   locked_door(Door, RequiredKey)
    ->  % 上锁的门:检查是否持有对应钥匙
        (   inventory(RequiredKey)
        ->  write('You unlocked the door and entered the next room.'), nl
        ;   write('The door is locked, you need a '), write(RequiredKey), write(' to unlock it.'), nl,
            fail  % 阻止移动
        )
    ;   % 未上锁的门:直接通行
        write('You opened the door and entered the next room.'), nl
    ).

验证效果

修复后:

  • 玩家未拾取钥匙时调用use(door(garden,hallway)),会提示“门已锁,需要钥匙”,无法进入走廊。
  • 玩家拾取钥匙后调用该命令,会解锁门并成功进入走廊。
  • 从走廊返回花园时,由于locked_door未定义该方向的锁,可直接通行。

内容的提问来源于stack exchange,提问作者Darren Ch'ng

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 23:15:53