是什么
👇制作一个飞书群机器人,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>