我拥有一个游戏群,我还有一个机器人,棒极了,我有一个游戏机器人~ - 飞书官网
解决方案

我拥有一个游戏群,我还有一个机器人,棒极了,我有一个游戏机器人~

飞书

2024-12-23

推荐理由​
是什么​
为什么​
怎么办​
写在后面​
作者:孝夕夕​
推荐理由​
外部群仅支持自定义机器人,在收集信息时较为不畅,本篇以2048游戏案例为背景,提供了一种收集外部群消息的思路。​
是什么​
👇制作一个飞书群机器人,ta 可以陪你玩 2048 小游戏。​
本教程以外部群为例,按需修改步骤可支持内部群;支持多人同时游戏,每个人都在玩自己的4*4盘面。​
​
为什么​
外部群仅支持自定义机器人,在收集信息时较为不畅,本篇以游戏案例为背景提供一种收集外部群消息的思路。可将本文视为一篇关于机器人助手与集成平台的启蒙教程。​
本篇侧重剖析、记录制作过程,工作流能跑通,但所用节点不一定是最精简的。​
​
怎么办​
1.创建自定义机器人​
👇在群里添加自定义机器人​
👇复制webhook地址,https://open.feishu.cn/open-apis/bot/v2/hook/后面的字符部分为机器人ID。 记住这个机器人id,以后会用到。为了好记,我们就叫他迷失的羔羊吧~​
新手很难记住哪步需要用到哪个,不如起一个绰号​
​
250px|700px|reset
​
​
2.创建工作流​
👇工作流概览​
判断是否存在记录,若没有,储存记录后判断方向;若有,直接判断方向。 按方向去移动、合并数字,增加随机2 判断:若盘面没有变化,失败并重开;若有2048,成功并重开;其他情况,发送当前盘面。​
​
250px|700px|reset
​
​
👇触发器为网址触发器​
接收来自自定义机器人的消息​
👆记住这个回调地址,以后会用到​
为了容易记住,我们就叫他维纳斯的断臂吧​
👇设置助手-JSON助手​
将收到的消息转换为字符串​
​
250px|700px|reset
​
​
​
250px|700px|reset
​
​
👇设置助手-数据储存​
目的是查找用户之前是否玩过​
​
250px|700px|reset
​
​
👇设置逻辑-分支​
判断是否存在记录,若没有,储存记录后判断方向;若有,直接判断方向。​
​
250px|700px|reset
​
​
👇设置助手-动态脚本​
👇设置助手-数据储存​
​
250px|700px|reset
​
​
👇设置助手-设置变量​
​
250px|700px|reset
​
​
​
250px|700px|reset
​
​
👇设置助手-设置变量​
​
250px|700px|reset
​
​
👇设置逻辑-分支​
判断移动、合并数字的方向​
👇上下左右四个方向只是在代码里有少量差异,以分支“左”为例,需要3个节点:​
助手-动态脚本用途是按方向去移动、合并数字,增加随机2​
助手-数据储存把变换后的数组存起来,供以后查询​
助手-设置变量把变换后的数组临时存起来,供下一个节点查询(变量名叫z2048)​
​
250px|700px|reset
​
​
👇设置助手-动态脚本​
用途是把二维数组转换成字符串,供机器人发给用户。主要是把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个飞书自定义机器人节点使用​
​
250px|700px|reset
​
​
👇设置逻辑-分支​
判断:若盘面没有变化,失败并重开;若有2048,成功并重开;其他情况,发送当前盘面并终止。 最初判断失败的标准是是否剩余空位,后修改为变量num与变量z2048是否相等—— 即便没有空位,只要存在变换的可能就允许继续游戏。​
​
250px|700px|reset
​
​
👇设置飞书-飞书自定义机器人​
👇设置助手-动态脚本​
成功或失败后都需要重新生成初始局​
​
250px|700px|reset
​
​
👇设置助手-数据储存​
​
250px|700px|reset
​
​
👆单击右上角完成并发布吧​
3.创建机器人助手​
👇访问飞书机器人助手,新建机器人指令​
注意不要选成我的应用​
👇设置触发器为@机器人的群聊消息​
​
250px|700px|reset
​
​
👇设置触发器的参数​
​
250px|700px|reset
​
​
👇操作设置为发送HTTP请求​
​
250px|700px|reset
​
​
👇URL需要填写维纳斯的断臂​
👇设定流程名称并启用​
​
250px|700px|reset
​
​
运行​
👇在群内@机器人并留言你的操作方向。​
​
250px|700px|reset
​
​
删除(若有需要)​
👇群中删除自定义机器人​
👇在飞书机器人助手删除指令​
​
写在后面​
  • ta太笨,不会玩2048​
  • 我太笨,说不清2048​
  • 最终只好自己调整代码。 这是孝夕夕第一次使用JS, 总体感受是可以把 AI 用作提词器—— 自己把逻辑捋清楚,不会的函数去问 AI。​
  • 在🎮2048多维表格中使用了一维数组,本次有了集成平台加持,直接使用二维数组。并且解决了一个问题——多维表格不支持遍历,所以8-2-2-4会变成8-4-4;集成平台经过遍历3次,能充分合并变成16。​
GPT3.5的代码​
​
​
​
function moveRight(input) {​
// 遍历每一行​
for (let i = 0; i < 4; i++) {​
// 向右移动非0数字​
let currentCol = 3;​
let merged = false; // 标记是否已经合并过数字​
for (let j = 2; j >= 0; j--) {​
if (input.num[i][j] !== 0) {​
// 查找右侧的非零数字位置​
let nextCol = currentCol - 1;​
while (nextCol >= 0 && input.num[i][nextCol] === 0) {​
nextCol--;​
}​
// 如果当前位置右侧的数字为0,并且左侧相邻数字与当前数字相等,则合并数字​
if (nextCol !== -1 && input.num[i][nextCol] === input.num[i][j] && !merged) {​
input.num[i][nextCol] *= 2;​
input.num[i][j] = 0;​
merged = true;​
} else {​
// 否则,将数字移到当前位置右侧​
currentCol--;​
input.num[i][currentCol] = input.num[i][j];​
if (currentCol !== j) {​
input.num[i][j] = 0;​
}​
merged = false;​
}​
}​
}​
}​
​
// 随机生成一个2在空位上​
let emptyPositions = [];​
for (let i = 0; i < 4; i++) {​
for (let j = 0; j < 4; j++) {​
if (input.num[i][j] === 0) {​
emptyPositions.push({​
row: i,​
col: j,​
});​
}​
}​
}​
if (emptyPositions.length > 0) {​
let randomPosition =​
emptyPositions[Math.floor(Math.random() * emptyPositions.length)];​
input.num[randomPosition.row][randomPosition.col] = 2;​
}​
​
return input.num;​
}​
我调整后的代码​
​
​
function moveRight(input) {​
// 遍历三次,8-2-2-4能变成16,不遍历会变成8-4-4​
for (let k = 0; k < 3; k++) {​
for (let j = 1; j < 4; j++) {​
// 遍历每一行​
for (let i = 0; i < 4; i++) {​
// 如果当前位置右方的数字为0,或者相等,就合并​
if (input.num[i][j] === 0 || input.num[i][j] === input.num[i][j - 1]) {​
input.num[i][j] = input.num[i][j] + input.num[i][j - 1];​
input.num[i][j - 1] = 0;​
// 否则,不变动​
} else {​
input.num[i][j] = input.num[i][j];​
}​
}​
}​
}​
​
// 随机生成一个2在空位上​
let emptyPositions = [];​
for (let i = 0; i < 4; i++) {​
for (let j = 0; j < 4; j++) {​
if (input.num[i][j] === 0) {​
emptyPositions.push({​
row: i,​
col: j,​
});​
}​
}​
}​
if (emptyPositions.length > 0) {​
let randomPosition =​
emptyPositions[Math.floor(Math.random() * emptyPositions.length)];​
input.num[randomPosition.row][randomPosition.col] = 2;​
}​
​
return input.num;​
}​
​
预约飞书企业效能顾问 深度诊断企业痛点,定制专属 AI 办公方案

先进团队,先用飞书

欢迎联系我们,飞书效能顾问将为您提供全力支持
分享先进工作方式
输送行业最佳实践
全面协助组织提效
标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题

字节跳动旗下 AI 工作平台

联系我们立即试用