Z-Machine解释器

一个用Go编写的Z-Machine解释器,用于运行经典的Infocom文本冒险游戏,提供命令行、浏览器UI和MCP服务器三种前端。

  • by scottmbaker
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 scottmbaker/go-zork

使用说明

去佐克

用Go编写的Z-Machine解释器,运行经典的Infocom文本冒险游戏。带有三个前端:命令行播放器、基于浏览器的web UI和允许AI代理自主玩游戏的MCP服务器。

斯科特·贝克,https://github.com/scottmbaker/

基于 MojoZork 的 Ryan C.Gordon。

仅支持Z-Machine版本3的故事文件。佐克1(zork1.dat)包括在内。

AI工具(Claude Code、Google Antigravity、Microsoft Copilot)已被用于执行该项目中的一些任务。


建筑

make             # builds _build/zork, _build/web, _build/mcp
make play        # play Zork 1 interactively in the terminal
make test        # runs the full Zork 1 walkthrough and verifies a score of 350/350
make walkthrough # runs the full Zork 1 walkthrough and prints the output
make clean       # removes all built files

需要Go 1.21+。

码头工人

make docker-build                                         # builds image tagged smbaker/go-zork
docker run -it smbaker/go-zork                            # play interactively
docker run -p 8080:8080 smbaker/go-zork ./web             # web UI
docker run -p 8081:8081 smbaker/go-zork ./mcp --mode sse  # MCP SSE server

要推送到Docker Hub:

make docker-push    # tags as docker.io/smbaker/go-zork:1.0.0 and pushes

程序

_build/zork --CLI播放器

直接在终端中播放。

Usage: zork [options] [story_file]

Options:
  -seed int      RNG seed (0 = current time)
  -save string   save file path (default "save.dat")
./_build/zork zork1.dat
./_build/zork -seed 42 zork1.dat

_build/web --浏览器用户界面

通过HTTP提供两个基于web的UI。每个浏览器选项卡都有自己的独立游戏会话。

Usage: web [options]

Options:
  -story string   story file path (default "zork1.dat")
  -save  string   save file path  (default "save.dat")
  -port  string   listen address  (default ":8080")
./_build/web --story zork1.dat --port :8080
路线 描述
/terminal 全屏xterm.js终端(黑底绿,经典外观)
/chat 轻量级聊天风格UI,无外部依赖
/ws WebSocket端点(每个连接一个ZMachine goroutine)
/ 重定向到 /terminal

_build/mcp --MCP服务器

将Zork动词暴露为 模型上下文协议 AI代理(Claude等)可以玩游戏。支持stdio和SSE传输。

Usage: mcp [options]

Options:
  -story    string   story file path (default "zork1.dat")
  -save     string   save file path  (default "save.dat")
  -mode     string   transport: stdio or sse (default "stdio")
  -port     string   listen address for SSE mode (default ":8081")
  -log               print all game input/output to stdout

stdio模式(克劳德桌面,本地代理)

./_build/mcp --story zork1.dat --mode stdio

增添 claude_desktop_config.json:

{
  "mcpServers": {
    "zork": {
      "command": "/path/to/_build/mcp",
      "args": ["--story", "/path/to/zork1.dat", "--log"]
    }
  }
}

SSE模式(远程代理、HTTP客户端)

./_build/mcp --story zork1.dat --mode sse --port :8081

MCP工具

工具 参数 说明
get_intro -- 返回开场场景(先呼叫)
restart -- 将游戏重置为开始
look -- 描述当前位置
inventory -- 列出携带物品
score -- 显示分数和移动计数
wait -- 等一下
pray -- 祈祷
verbose / brief / superbrief -- 设置描述的详细程度
north south east west -- 向主要方向移动
northeast northwest southeast southwest -- 沿对角线移动
up / down -- 垂直移动
examine take drop open close object 与单个对象交互
read eat drink turn_on turn_off object 更多单对象操作
push pull climb move object 物理操作
light extinguish wave ring rub object 特殊互动
cross echo enter exit smell listen object 环境相互作用
wind object 给发条装置上发条
put item, container 将物品放入/放在容器中
attack target, weapon (可选) 攻击生物
throw item, target 向目标投掷物品
give item, recipient 将物品赋予角色
unlock / lock object, key 用钥匙锁定或解锁
turn object, tool 用工具转动物体(例如带扳手的螺栓)
tie item, target 将物品绑在某物上
insert item, container 将物品插入容器
say text, to (可选) 说点什么
command text 发送任何原始命令(包罗万象)

这 --log 标志对于观看AI游戏很有用:所有命令和响应都会实时打印到stdout。


Helm 图表

Helm图表提供于 helm/go-zork/ 用于将web或MCP服务器部署到Kubernetes。

安装

# Web UI (default)
helm install zork helm/go-zork

# MCP SSE server
helm install zork helm/go-zork \
  --set mode=mcp

# Expose via NodePort
helm install zork helm/go-zork \
  --set service.type=NodePort \
  --set service.nodePort=31080

# Expose via Ingress
helm install zork helm/go-zork \
  --set ingress.enabled=true \
  --set ingress.host=zork.example.com

核心价值观

值 默认值 描述
image.repository smbaker/go-zork 容器映像存储库
image.tag 1.0.0 图像标签
mode web 要运行的服务器: web 或 mcp
web.port 8080 Web服务器容器端口
mcp.port 8081 MCP服务器容器端口
mcp.log false 将游戏成绩单打印到stdout
service.type ClusterIP Kubernetes服务类型
service.port 80 服务端口
service.nodePort "" 类型为时的节点端口号(30000–32767) NodePort
ingress.enabled false 创建Ingress资源
ingress.host "" 入口主机名
replicaCount 1 pod副本数量

建筑

pkg/zork/          Z-Machine interpreter (version 3)
cmd/zork/          CLI front-end
cmd/web/           HTTP + WebSocket server; terminal.html and chat.html embedded via go:embed
cmd/mcp/           MCP server (stdio + SSE via mark3labs/mcp-go)

Z-Machine完全通过Go通道进行通信:

z.InputChan  <-chan string   // lines of user input sent to the interpreter
z.OutputChan chan<- []byte   // output chunks produced by the interpreter
done         <-chan error    // closed when the game ends

所有三个前端都遵循相同的模式:将它们的传输(stdin/stdout、WebSocket或MCP工具调用)桥接到这两个通道。MCP服务器通过互斥体串行化并发工具调用,因此每个命令/响应对都是原子性的。


测试

make test

运行完整的Zork 1演练(walkthrough.txt)使用固定的RNG种子,并断言最终得分为350/350(最大值)。