我有一个游戏群,我有一个机器人,棒,我有一个游戏机器人~

195 阅读9分钟

是什么

👇制作一个飞书群机器人,ta 可以陪你玩 2048 小游戏。

本教程以外部群为例,按需修改步骤可支持内部群;支持多人同时游戏,每个人都在玩自己的4*4盘面。

为什么

外部群仅支持自定义机器人,在收集信息时较为不畅,本篇以游戏案例为背景提供一种收集外部群消息的思路。可将本文视为一篇关于机器人助手集成平台的启蒙教程。

本篇侧重剖析、记录制作过程,工作流能跑通,但所用节点不一定是最精简的。

怎么办

1.创建自定义机器人

👇在群里添加自定义机器人

官方文档见如何在群组中使用机器人?

👇复制webhook地址,open.feishu.cn/open-apis/b… 记住这个机器人id,以后会用到。为了好记,我们就叫他迷失的羔羊吧~

新手很难记住哪步需要用到哪个,不如起一个绰号

2.创建工作流

👇工作流概览

判断是否存在记录,若没有,储存记录后判断方向;若有,直接判断方向。 按方向去移动、合并数字,增加随机2 判断:若盘面没有变化,失败并重开;若有2048,成功并重开;其他情况,发送当前盘面。

👇触发器为网址触发器

接收来自自定义机器人的消息

👆记住这个回调地址,以后会用到

为了容易记住,我们就叫他维纳斯的断臂

👇设置助手-JSON助手

将收到的消息转换为字符串

👇设置助手-数据储存

目的是查找用户之前是否玩过

👇设置逻辑-分支

判断是否存在记录,若没有,储存记录后判断方向;若有,直接判断方向。

👇设置助手-动态脚本

👇设置助手-数据储存

👇设置助手-设置变量

👇设置助手-设置变量

👇设置逻辑-分支

判断移动、合并数字的方向

👇上下左右四个方向只是在代码里有少量差异,以分支“左”为例,需要3个节点:

助手-动态脚本用途是按方向去移动、合并数字,增加随机2

助手-数据储存把变换后的数组存起来,供以后查询

助手-设置变量把变换后的数组临时存起来,供下一个节点查询(变量名叫z2048)

👇设置助手-动态脚本

用途是把二维数组转换成字符串,供机器人发给用户。主要是把0变成四个下划线,不足4位的数字补足位数

比如将[[2,4,16,4],[0,0,4,128],[0,0,256,32],[0,0,0,2]]

转换为

___2.___4.__16.___4.

____.____.___4._128.

____.____._256.__32.

____.____.____.___2.

👇设置助手-设置变量

这里填写机器人id,id 这是什么来着? 就是上面遇到的迷失的羔羊,我们可以把他填过来了。 这个节点的目的是把机器人id存起来,供以后3个飞书自定义机器人节点使用

👇设置逻辑-分支

判断:若盘面没有变化,失败并重开;若有2048,成功并重开;其他情况,发送当前盘面并终止。 最初判断失败的标准是是否剩余空位,后修改为变量num与变量z2048是否相等—— 即便没有空位,只要存在变换的可能就允许继续游戏。

👇设置飞书-飞书自定义机器人

👇设置助手-动态脚本

成功或失败后都需要重新生成初始局

👇设置助手-数据储存

👆单击右上角完成发布

3.创建机器人助手

👇访问飞书机器人助手新建机器人指令

注意不要选成我的应用

👇设置触发器为@机器人的群聊消息

👇设置触发器的参数

👇操作设置为发送HTTP请求

👇URL需要填写维纳斯的断臂

👇设定流程名称并启用

运行

👇在群内@机器人并留言你的操作方向。

删除(若有需要)

👇群中删除自定义机器人

👇在飞书机器人助手删除指令

写在后面

  • 此前写过#📋教程#山谷里的回声#开放+集成#等教程,用到了少量代码,均由GPT3.5提供,运行正常。 本次,GPT3.5 却提供了错误的代码,原因可能是:
    • ta太笨,不会玩2048
    • 我太笨,说不清2048
    • 最终只好自己调整代码。 这是孝夕夕第一次使用JS, 总体感受是可以把 AI 用作提词器—— 自己把逻辑捋清楚,不会的函数去问 AI。
  • 🎮2048多维表格中使用了一维数组,本次有了集成平台加持,直接使用二维数组。并且解决了一个问题——多维表格不支持遍历,所以8-2-2-4会变成8-4-4;集成平台经过遍历3次,能充分合并变成16。

GPT3.5的代码

<div class="hljs-line" data-start="1"> function moveRight(input) {</div><div class="hljs-line" data-start="2"> // 遍历每一行</div><div class="hljs-line" data-start="3"> for (let i = 0; i < 4; i++) {</div><div class="hljs-line" data-start="4"> // 向右移动非0数字</div><div class="hljs-line" data-start="5"> let currentCol = 3;</div><div class="hljs-line" data-start="6"> let merged = false; // 标记是否已经合并过数字</div><div class="hljs-line" data-start="7"> for (let j = 2; j >= 0; j--) {</div><div class="hljs-line" data-start="8"> if (input.num[i][j] !== 0) {</div><div class="hljs-line" data-start="9"> // 查找右侧的非零数字位置</div><div class="hljs-line" data-start="10"> let nextCol = currentCol - 1;</div><div class="hljs-line" data-start="11"> while (nextCol >= 0 && input.num[i][nextCol] === 0) {</div><div class="hljs-line" data-start="12"> nextCol--;</div><div class="hljs-line" data-start="13"> }</div><div class="hljs-line" data-start="14"> // 如果当前位置右侧的数字为0,并且左侧相邻数字与当前数字相等,则合并数字</div><div class="hljs-line" data-start="15"> if (nextCol !== -1 && input.num[i][nextCol] === input.num[i][j] && !merged) {</div><div class="hljs-line" data-start="16"> input.num[i][nextCol] *= 2;</div><div class="hljs-line" data-start="17"> input.num[i][j] = 0;</div><div class="hljs-line" data-start="18"> merged = true;</div><div class="hljs-line" data-start="19"> } else {</div><div class="hljs-line" data-start="20"> // 否则,将数字移到当前位置右侧</div><div class="hljs-line" data-start="21"> currentCol--;</div><div class="hljs-line" data-start="22"> input.num[i][currentCol] = input.num[i][j];</div><div class="hljs-line" data-start="23"> if (currentCol !== j) {</div><div class="hljs-line" data-start="24"> input.num[i][j] = 0;</div><div class="hljs-line" data-start="25"> }</div><div class="hljs-line" data-start="26"> merged = false;</div><div class="hljs-line" data-start="27"> }</div><div class="hljs-line" data-start="28"> }</div><div class="hljs-line" data-start="29"> }</div><div class="hljs-line" data-start="30"> }</div><div class="hljs-line" data-start="31"></div><div class="hljs-line" data-start="32"> // 随机生成一个2在空位上</div><div class="hljs-line" data-start="33"> let emptyPositions = [];</div><div class="hljs-line" data-start="34"> for (let i = 0; i < 4; i++) {</div><div class="hljs-line" data-start="35"> for (let j = 0; j < 4; j++) {</div><div class="hljs-line" data-start="36"> if (input.num[i][j] === 0) {</div><div class="hljs-line" data-start="37"> emptyPositions.push({</div><div class="hljs-line" data-start="38"> row: i,</div><div class="hljs-line" data-start="39"> col: j,</div><div class="hljs-line" data-start="40"> });</div><div class="hljs-line" data-start="41"> }</div><div class="hljs-line" data-start="42"> }</div><div class="hljs-line" data-start="43"> }</div><div class="hljs-line" data-start="44"> if (emptyPositions.length > 0) {</div><div class="hljs-line" data-start="45"> let randomPosition =</div><div class="hljs-line" data-start="46"> emptyPositions[Math.floor(Math.random() * emptyPositions.length)];</div><div class="hljs-line" data-start="47"> input.num[randomPosition.row][randomPosition.col] = 2;</div><div class="hljs-line" data-start="48"> }</div><div class="hljs-line" data-start="49"></div><div class="hljs-line" data-start="50"> return input.num;</div><div class="hljs-line" data-start="51">}</div>

我调整后的代码

<div class="hljs-line" data-start="1">function moveRight(input) {</div><div class="hljs-line" data-start="2"> // 遍历三次,8-2-2-4能变成16,不遍历会变成8-4-4</div><div class="hljs-line" data-start="3"> for (let k = 0; k < 3; k++) {</div><div class="hljs-line" data-start="4"> for (let j = 1; j < 4; j++) {</div><div class="hljs-line" data-start="5"> // 遍历每一行</div><div class="hljs-line" data-start="6"> for (let i = 0; i < 4; i++) {</div><div class="hljs-line" data-start="7"> // 如果当前位置右方的数字为0,或者相等,就合并</div><div class="hljs-line" data-start="8"> if (input.num[i][j] === 0 || input.num[i][j] === input.num[i][j - 1]) {</div><div class="hljs-line" data-start="9"> input.num[i][j] = input.num[i][j] + input.num[i][j - 1];</div><div class="hljs-line" data-start="10"> input.num[i][j - 1] = 0;</div><div class="hljs-line" data-start="11"> // 否则,不变动</div><div class="hljs-line" data-start="12"> } else {</div><div class="hljs-line" data-start="13"> input.num[i][j] = input.num[i][j];</div><div class="hljs-line" data-start="14"> }</div><div class="hljs-line" data-start="15"> }</div><div class="hljs-line" data-start="16"> }</div><div class="hljs-line" data-start="17"> }</div><div class="hljs-line" data-start="18"></div><div class="hljs-line" data-start="19"> // 随机生成一个2在空位上</div><div class="hljs-line" data-start="20"> let emptyPositions = [];</div><div class="hljs-line" data-start="21"> for (let i = 0; i < 4; i++) {</div><div class="hljs-line" data-start="22"> for (let j = 0; j < 4; j++) {</div><div class="hljs-line" data-start="23"> if (input.num[i][j] === 0) {</div><div class="hljs-line" data-start="24"> emptyPositions.push({</div><div class="hljs-line" data-start="25"> row: i,</div><div class="hljs-line" data-start="26"> col: j,</div><div class="hljs-line" data-start="27"> });</div><div class="hljs-line" data-start="28"> }</div><div class="hljs-line" data-start="29"> }</div><div class="hljs-line" data-start="30"> }</div><div class="hljs-line" data-start="31"> if (emptyPositions.length > 0) {</div><div class="hljs-line" data-start="32"> let randomPosition =</div><div class="hljs-line" data-start="33"> emptyPositions[Math.floor(Math.random() * emptyPositions.length)];</div><div class="hljs-line" data-start="34"> input.num[randomPosition.row][randomPosition.col] = 2;</div><div class="hljs-line" data-start="35"> }</div><div class="hljs-line" data-start="36"></div><div class="hljs-line" data-start="37"> return input.num;</div><div class="hljs-line" data-start="38">}</div>

相关文档

工作流文件 zp2g08z4bq.feishu.cn/file/HHlibs…