前言
自动签到、抽奖什么的Low爆了,今天新生代内卷农民工带你们实现海底掘金挑战赛
自动挖矿!
项目地址
Github项目地址:点击打开
本项目在@Simund的基础之上增加了:钉钉webhook提醒通知、自动沾喜气、自动挖矿 功能
自动签到已经有许多同学实现了这里就不再重复造轮子,这里使用@Simund [原帖]的项目作为基础,在此之上继续完成我们的自动挖矿。
ps
如果还不知道什么是海底掘金挑战赛
,先前往这里了解一下游戏规则:
核心讲解
游戏规则解析
这次的海底掘金挑战赛
有点像那种儿童启蒙可视化编程游戏,但是难点在于需要通过计算行走路线保证自己有足够移动指令
来延长游戏进度、得到更多矿石奖励。
寻路算法
算法解析
由于自动寻路的算法超纲不在我们本次讨论范围之内,所以我们来实现一个弱智版
的人工智能
即:在初始移动指令
只有上下左右各3个的情况下,只在上 下 左 右 四个位置移动,这样在只使用初始移动指令
的情况下也可完成这四个位置的移动,极大程度降低了算法难度。
算法实现
首先我们获取到地图的数据:
[0,0,230,136,0,228,0,243,129,248,0,0,0,114,224,0,114,128,0,256,0,232,0,0,0,6,108,0,6,0,0,6,6,159,0,102,157,0,112,0,0,6,0,221,248,6,246,0,1310,6,0,0,0,0,0,0,0,138,237,243,6,157,224,0,128,158,139,0,134,0,6,0,0,113,258,6,0,6,0,0,227,6,0,3,115,28,105,6,6,0,6,133,126,0,3,108,6,133,0,216,146,0,6,6,0,0,0,106,6,0,6,0,0,6,215,255,152,6,0,6,136,6,0,102,0,6,0,6,0,28,6,6,158,0,6,116,0,113,6,6,0,0,6,6,0,6,0,6,6,6,6,133,0,258,6,6,0,6,6,0,6,0,6,0,0,154,108,0,230,142,6,6,0,6,0,27,0,0,6,0,0,118,6,5,0,6,6,0,6,135,0,221,154,248,0,234,6,6,103,6,3,136,6,0,0,6,0,257,6,6,0,6,0,1110,107,0,4,256,0,0,241,6,0,0,106,6,6,6,107,0,132,0,6,0,219,6,122,0,237,113,6,223,6,227,0,158,105,1210,0,133,129,0,27,210,158,218,6,241,6,0,1310,154,4,6,6,0,6,256,6,0,0,117,4,6,0,6,104,6,231,6,104,0,0,0,132,6,235,6,6,3,6,152,6,1311,6,239,0,235,113,6]
经分析
0
代表空白位置6
代表障碍物石头- 除了
0
和6
以外的数值不是移动指令
就是矿石奖励
- 数组的
[0-5]
是第1行数据、数组的[6-11]
是第2行数据、以此类推
首先我们先把地图数据转为二维数组,第一层数组里存放的就是每一行的数据组,第二层呢就是某一行的所有列数组,代码如下
/**
* @desc 一维数组转二维数组
* @param {Array} arr 原数据
* @param {Number} num 每个维度的元素数量
*/
function ArrayOneToTwo(arr, num) {
let arrList = [];
arr.map((item, index) => {
if (index % num == 0) {
arrList.push([item]);
} else {
arrList[arrList.length - 1].push(item);
}
});
return arrList;
}
经转后数据是这样的
[[0,0,230,136,0,228],[0,243,129,248,0,0],[0,114,224,0,114,128],[0,256,0,232,0,0],[0,6,108,0,6,0],[0,6,6,159,0,102],[157,0,112,0,0,6],[0,221,248,6,246,0],[1310,6,0,0,0,0],[0,0,0,138,237,243],[6,157,224,0,128,158],[139,0,134,0,6,0],[0,113,258,6,0,6],[0,0,227,6,0,3],[115,28,105,6,6,0],[6,133,126,0,3,108],[6,133,0,216,146,0],[6,6,0,0,0,106],[6,0,6,0,0,6],[215,255,152,6,0,6],[136,6,0,102,0,6],[0,6,0,28,6,6],[158,0,6,116,0,113],[6,6,0,0,6,6],[0,6,0,6,6,6],[6,133,0,258,6,6],[0,6,6,0,6,0],[6,0,0,154,108,0],[230,142,6,6,0,6],[0,27,0,0,6,0],[0,118,6,5,0,6],[6,0,6,135,0,221],[154,248,0,234,6,6],[103,6,3,136,6,0],[0,6,0,257,6,6],[0,6,0,1110,107,0],[4,256,0,0,241,6],[0,0,106,6,6,6],[107,0,132,0,6,0],[219,6,122,0,237,113],[6,223,6,227,0,158],[105,1210,0,133,129,0],[27,210,158,218,6,241],[6,0,1310,154,4,6],[6,0,6,256,6,0],[0,117,4,6,0,6],[104,6,231,6,104,0],[0,0,132,6,235,6],[6,3,6,152,6,1311],[6,239,0,235,113,6]]
这样一来数据结构会清晰许多,我们可以通过地图数组[行][列]
的方式取到某个具体坐标的数据。
综合以上数据我们可以这样计算行走轨迹
const COLUMN = 6; // 列数
const OBSTACLE = 6; // 障碍物
/**
* U 上方
* L 左方
* R 右方
* D 下方
*/
const mapsTrack = [
[3, 1, "U"],
[2, 2, "L"],
[4, 2, "D"],
[3, 3, "R"],
]; // xy坐标和相对于初始坐标([3, 2])的方向 例:目标坐标[3, 1]相较于初始坐标[3, 2]:x坐标相等,y坐标比初始坐标小1,所以目标在初始目标的上面,此时用'U'表示
const NAGETIVE_DIRECTION = {
"U": "D",
"L": "R",
"D": "U",
"R": "L",
};
/**
* @desc 计算行走轨迹
* @param {Array} maps 地图
*/
const getTarck = (maps) => {
const mapsTree = ArrayOneToTwo(maps, COLUMN);
// 过滤掉有障碍物的位置
const trackXY = mapsTrack.filter((item) => {
const x = item[0];
const y = item[1];
const xy = mapsTree[x][y];
return xy !== OBSTACLE; // 判断是否为障碍物
});
// 向目标方向移动后反方向移动回初始位置
const trackList = trackXY.map((item) => {
const direction = item[2];
const nDirection = NAGETIVE_DIRECTION[item[2]];
return [direction, nDirection];
}).flat();
return trackList;
};
此时计算完轨迹后我们得到的轨迹数据是这样的
["U","D","L","R","D","U","R","L"]
角色选择
由于我们的行走位置只有5格,能吃到的矿石
也有限,提升单个奖励加成的能力非常适合我们的人工智障
,所以我们选择这个绿绿的角色:CLICK
部署
本地部署:
$ git clone https://github.com/yunying1/juejin_auto_sign
$ cd ./juejin_auto_sign
$ npm install
$ npm run test
结果是这样婶儿的
云函数部署
云函数部署就不细讲了,很简单的好伐,可参照@Simund [原帖]
如果要自动挖矿,只需要比他的操作多一个步骤:
在config.js
中添加uid字段,具体获取方法也写在代码中了
写在最后
自动挖矿记录
更多
更多细节查看 Github
比如:
- 自动刷到奖励上限
- 刷图次数过多强制终止(防止异常情况导致死循环,毕竟云函数免费额度也是有限的)
- 奖励过少自动刷新地图 等等...
总之非常的银性,解放双手拥抱人工智障!