ChatGPT人工智能:谁是卧底?(难度:3级)
-
介绍
游戏中传统的人工智能角色都比较“枯燥”。它们重复不断地说同样的语句,因为它们是由游戏开发人员提前编写好的“脚本”所驱动。现在这个问题可以用ChatGPT解决。ChatGPT能使游戏角色用自然语言与用户沟通,这可以让游戏更加有趣、更加不可预测。
在这篇教程中,我们将制作一个简单游戏“谁是卧底?”。玩家和几个人工智能角色对话并猜测谁是间谍,我们用ChatGPT为这些角色生成回答内容。
第1步 - 改编模板项目
从以下这个项目为起点,进行改编,该项目包含4个角色:一位博士和三个动物助理(狗、驯鹿和猴子)https://play.creaticode.com/projects/31abbb3f6b05f826173310d1
第2步 - 为ChatGPT编写游戏规则描述
当玩家开始游戏后,首先我们要向ChatGPT描述游戏。游戏描述应当包含以下几部分:- 角色分配:我们让ChatGPT扮演“游戏主持人”,帮我们主持游戏。
- 游戏背景:我们将告诉ChatGPT这是一个猜谜游戏,及其背景故事。然后ChatGPT在整个游戏中帮我们主持故事情节。
- 游戏规则:我们要告诉ChatGPT非常详细的游戏规则——它应当做什么、不应当做什么。否则,玩家会很容易诱骗ChatGPT使其泄露答案。
下面是一个游戏描述示例:你扮演一个游戏主持人,主持一个游戏《谁是卧底》。
背景:
“博士”运作一个神秘的实验室,实验室里有三个聪明的助理(小狗、驯鹿和猴子)。实验室设计了一个革命性的、能改变世界的机器人。最近,机器人的设计图纸在实验室被盗了。据传言,其中一个动物密探行为异常,是偷图纸的卧底。博士邀请游戏玩家找出谁是卧底。不知什么原因监控摄像头没有起作用,所以不能指望监控摄像头了。
说明:
你随机选择一个动物助理扮演卧底。只有你和卧底知道谁是卧底。玩家可以向医生和助理询问任意问题,你要替每个被询问的角色想出回答内容。注意,卧底会撒谎。 当你回答问题时,要始终用以下格式:
“角色:回答内容”。
游戏玩家猜过之后游戏就结束,然后你就公布谁是卧底。
注意,我们给ChatGPT确定了回答问题的特定格式:“角色:回答内容”。原因就是,ChatGPT会向我们呈现任意一个角色的回答,所以为了便于处理回答,我们要让回答的格式固定。
第3步 - 向ChatGPT发送游戏描述
现在我们把游戏描述发送给ChatGPT。我们可以在博士角色中添加如下代码:
我们用的是“系统请求”,比普通请求的权重更强。我们把ChatGPT的回复保存在变量“回复”。现在请大家把游戏描述复制到积木“系统请求”。如果谁需要编辑描述,应该还记得可以用注释框来帮助编辑。
第4步 - 打印ChatGPT的回复,用于调试
为了在开发项目中回顾ChatGPT的回复,我们可以把回复内容打印到控制台面板,如下所示:
当你运行项目后,会停顿一会儿,然后就会看到这样一条回复(看不到的话就多尝试几次):出现这种情况是因为,ChatGPT要给出一个非常长的回复,达到了字符数限制。比如,ChatGPT可能会重复说明游戏的描述,就是为了表明自己理解了游戏描述,也可能会生成一些玩家与角色之间的对话示例。
我们应当避免这种情况发生,原因有二:
- 现在我们还不需要ChatGPT生成回复内容,因为我们不能把这呈现给游戏玩家;
- 回复内容越长,玩家就必须等得越久。
为了避免这个问题,办法很简单。我们只需要优化提示语,告诉ChatGPT如何回复。比如,我们可以在系统请求提示语的末尾加上这句话:
现在你只说“准备就绪!”,不要说其他内容。然后等待游戏玩家问问题。
这是让ChatGPT尽量少说的常用办法。如果你再次运行项目,应该会很快就得到完整回复:
第5步 - 欢迎游戏玩家
现在ChatGPT做好准备了,还要告诉玩家开始游戏。我们可以让“博士”欢迎游戏玩家并说明游戏规则。例如,我们可以加入一个积木“说( )”,积木中输入以下语句:
欢迎侦探!正如我们之前在电话中所说的,一份高度保密的机器人设计图纸被盗了,我相信我的三个助理其中之一就是偷走图纸的卧底。你点击我们任意一员即可询问。
得到如下结果:
第6步 - 点击博士进行询问
我们让游戏玩家点击博士进行询问。具体而言,当玩家点击博士角色时,就会让玩家输入问题。我们还是用积木“打印( )到控制台”来回顾问题。注意,积木“回答”的值是玩家输入的内容,并不是ChatGPT的回答,这一点容易让人混淆。
之后控制台面板如下图所示:
如上图所示,如果用户不输入内容,积木“回答”的值为空。
第7步 - 获取ChatGPT的回答
现在我们把用户输入的内容发送给ChatGPT,ChatGPT就会为博士角色生成回答内容。仅当用户输入不为空时我们才能进行此操作:
说明:- 我们将“博士,”和用户输入内容连接起来,以便于ChatGPT知道我们在和博士对话。
- 我们使用模式“完整回答”,这样的话,直到我们获得ChatGPT的完整回答并存入变量“回复”,我们才运行下一个积木。
- 因为我们要让ChatGPT记住我们之前告诉它的游戏描述,所以会话类型设置为“继续”。
现在博士就能和我们对话了,对话是完全自然的,完全没有预先编排。其实,作为游戏开发人员,此时我们也不知道答案,因为我们要求ChatGPT秘密选择一个动物作为卧底。
第8步 - 整理ChatGPT的回答
目前,ChatGPT的回答以“博士:”开头。对于我们游戏开发人员来说是有好处的,但我们不应当向玩家展示这些内容。我们可以用这种办法来删除:用分隔符“:”把回答内容分开成两部分,只显示第二部分。
现在博士的回答就不包含前缀“博士:”:
第9步 - 用鼠标使医生高亮显示
由于游戏是通过点击角色来玩的,普遍的做法就是,当鼠标悬停在角色上时高亮显示,这样的话玩家才知道哪个能点击。我们可以用积木“当碰到鼠标指针时”来触发此状态。为了使角色高亮显示,我们只需要将其“亮度”设置为一个正值。当角色高亮显示时我们还可以播放声效。
结果如下:
第10步 - 退出高亮显示
当鼠标离开角色上方时,就应当退出高亮显示。我们可以用积木“等待( )不成立”一直检查角色是否还碰到鼠标指针。不再碰到鼠标指针以后,我们把亮度重置为0。
结果如下所示:
第11步 - 把代码复制到小狗角色
至此,博士角色的代码就完成了。我们可以把整串代码复制到其他角色重新使用。首先从小狗角色开始。唯一要改的地方就是向ChatGPT发送问题时所显示的名称。也需要给小狗角色添加声效“Hit 5”。
现在小狗角色也有了高亮显示和回答问题动作:
第12步 - 把代码复制到驯鹿和猴子
现在用同样的方式把代码复制到驯鹿角色和猴子角色。不要忘了修改向ChatGPT发送请求时的角色名称。
第13步 - 隐藏对话气泡
有一个新问题:当玩家切换不同的角色进行询问时,前一个角色仍然显示对话气泡。
为了解决这个问题,每当有角色被点击时我们就要让所有角色隐藏对话气泡。解决办法就是,当某个角色被点击向所有角色广播一条消息,并等待消息被处理完成。当收到广播消息时,角色只需要说0个字即可隐藏对话气泡。以防角色告诉玩家输入问题,我们还要用积木“停止提问”来使其隐藏问题。
提醒:全部4个角色都要完成此操作。
第14步 - 用一个按钮提交答案
此时,玩家为了调查案件,可以一直询问所有角色。我们还需要为玩家提供一种方式来提交最终答案。
首先,我们回到舞台上,当项目开始时添加一个按钮:
不要忘了可以用工具“控件位置”来调整按钮的位置和大小。按钮如下所示:
第15步 - 显示选项
当玩家点击按钮“谁是卧底?”,我们要显示几个单选按钮供玩家选择。除了3个动物以外,还要加一个选项,就是让用户能够回退一步并进一步思考。
输出结果如下:
第16步 - 处理玩家的选择
为了处理玩家的选择,我们可以编辑单选按钮的“点击”事件。用积木“控件( )的值”能找出玩家的选项。如果玩家选择“让我再想想”,我们就应当移除单选框。
第17步 - 把玩家的作答选项提交给ChatGPT
如果玩家选择三个动物之一,我们就提交给ChatGPT,让ChatGPT告诉我们是否正确。
注意,现在我们呼叫“游戏主持人”,因为只有游戏主持人能裁定游戏结果。
第18步 - 显示最终结果
最后一步,我们用一个文本框显示ChatGPT的回答。我们要保证文本框足够大以显示完整。我们还要移除其他控件,让玩家不能重复提交作答。
游戏最终演示如下:
创意扩展
以本项目为基础,可以按照以下思路进一步探索:
- 博士有时候把自己称为“博士”,而不是“我”。想想如何改进提示语来避免。
- 如果玩家向多个角色提问问题,比如“各位,图纸被盗的时候你们在哪里?”,我们要显示所有角色的回答。
- 大家可以用“文字转语音”积木让角色和玩家对话。
- 大家可以更改游戏的角色和背景故事,例如图书馆的书被盗、神秘朋友送的礼物盒子。甚至可以用历史人物玩游戏。