一句话里藏着的七个问题

玩家输入“做一个打飞碟的小游戏,子弹打中飞碟就得分”。看似完整,其实缺少的信息很多:飞碟怎么出现,一屏几个;子弹有没有数量限制;打中之后飞碟是消失还是爆炸;得分是每个固定值还是与速度有关;玩家什么时候算输;输了能不能重开;分数显示在哪里。

如果让模型直接写出一段代码,这些空缺会被模型“默默补上”,而且每次补的都不一样。玩家看到的是:同一句话,今天生成的飞碟会飞出屏幕不消失,明天生成的子弹无限多。所以比较稳的做法,是让空缺变成一个可见的中间层,再从中间层往下走。

中间表示:规则Schema

规则Schema就是一份约定好格式的清单,描述游戏“是什么”,不描述“怎么写”。一个小游戏的Schema大致包含这些部分:

部分 记录的内容 举例(示意)
实体场上有哪些对象及其属性 飞碟:速度、生命;子弹:伤害
资源 会变化的数值 分数、剩余子弹、生命值
规则 事件、条件、动作 见下一节
胜负 胜利与失败条件 分数达到目标;生命归零
界面 需要显示的信息分数、弹药、倒计时

金沙娱乐AI的设计思路是让模型把自然语言填进这份结构,遇到空缺就用默认值补上,同时把“补了什么”明确告诉玩家,比如“我假设一屏最多三个飞碟,可以改”。这样的补全是留痕的,玩家可以在后续对话里直接修改某一项,而不是重新描述整个游戏。

事件、条件、动作

规则本身用最朴素的三段式表达:事件是发生了什么,条件是在什么情况下,动作是接着做什么。前面那句话可以写成:

  • 事件:子弹与飞碟发生碰撞。
  • 条件:飞碟生命大于零。
  • 动作:飞碟生命减一;若生命归零,销毁飞碟并让分数加上飞碟的分值;销毁子弹。

这个形式的好处,是每条规则都能单独检查。事件是否真实存在于引擎里?条件里引用的属性是不是定义过?动作改的资源是否在资源表里?这些问题不需要运行游戏就能回答。把逻辑拆到这种粒度之后,多条规则之间的冲突也更容易暴露,比如两条规则都在碰撞时销毁子弹,就可能重复扣除。

校验:在运行之前就拦下一批错

从自然语言到Schema,再到可执行逻辑,中间应该有一道静态校验。典型的检查包括:

  • 引用完整性:规则里用到的实体、属性、资源都已定义。
  • 类型与范围:分数是数值,生命不能为负,数值上下限成立。
  • 胜负可达:存在至少一条路径能触发胜利,也存在失败条件,避免游戏永远不结束。
  • 死规则:某条规则的条件永远不可能成立,或者没有任何事件会触发它。
  • 循环冲突:两条规则互相触发,造成无限连锁。

静态校验只能挡下“写错了”,挡不了“不好玩”或“根本不能玩”。这时就需要让程序真的把游戏跑起来。有研究把游戏生成改成“写代码与试玩的对话”,用真正会玩游戏的GUI Agent按游戏内应有的行为来打分,说明只靠一次性生成、不试玩,很难保证结果。这部分的完整思路,可以看 自然语言已经能生成小游戏以后,为什么下一步是检查它能不能玩

从规则到可运行,再回到可视化

通过校验后,规则才交给引擎去执行。这里常见的两种方式:直接把规则解释执行,或者由模型生成对应脚本,再由校验环节比对脚本行为与规则是否一致。后者灵活,但需要把校验放在生成之后,并把失败原因回传给模型重写,属于典型的工具调用循环,见 为什么需要Function Calling和工具链

对无代码用户来说,最有价值的是规则始终保持可见。把事件、条件、动作画成积木或流程图,也就是Visual Logic,玩家不必读懂脚本,也能把“得1分”改成“得3分”,或者给飞碟加一个“被击中后分裂”的规则。修改落在Schema上,再重新校验、重新生成,而不是重写整段代码。金沙娱乐游戏在这里的目标,是让第二句话的修改也像第一句话一样可靠。

收束:写不出代码不是门槛,说不清规则才是

在金沙娱乐官网的思路里,无代码降低的是写代码的门槛,却没有降低“把规则想清楚”的门槛。一个好用的生成器,应当在玩家说得含糊时主动追问,或者明确告诉玩家它做了哪些假设。当每一条假设都能被看见、被改动,自然语言才算真的变成了游戏规则。