自动签到、抽奖?弱爆了!简简单单教你自动挖矿!

6,675 阅读7分钟

前言

自动签到、抽奖什么的Low爆了,今天新生代内卷农民工带你们实现海底掘金挑战赛自动挖矿

项目地址

Github项目地址:点击打开

本项目在@Simund的基础之上增加了:钉钉webhook提醒通知自动沾喜气自动挖矿 功能

自动签到已经有许多同学实现了这里就不再重复造轮子,这里使用@Simund [原帖]的项目作为基础,在此之上继续完成我们的自动挖矿。

ps

如果还不知道什么是海底掘金挑战赛,先前往这里了解一下游戏规则:

image.png

核心讲解

游戏规则解析

这次的海底掘金挑战赛有点像那种儿童启蒙可视化编程游戏,但是难点在于需要通过计算行走路线保证自己有足够移动指令来延长游戏进度、得到更多矿石奖励。

寻路算法

算法解析

由于自动寻路的算法超纲不在我们本次讨论范围之内,所以我们来实现一个弱智版人工智能即:在初始移动指令只有上下左右各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代表障碍物石头
  • 除了06以外的数值不是移动指令就是矿石奖励
  • 数组的[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

结果是这样婶儿的 123.png

云函数部署

云函数部署就不细讲了,很简单的好伐,可参照@Simund [原帖]

如果要自动挖矿,只需要比他的操作多一个步骤: 在config.js中添加uid字段,具体获取方法也写在代码中了

image.png

写在最后

自动挖矿记录

Snipaste_2022-01-09_00-36-23.png

更多

更多细节查看 Github

比如:

  1. 自动刷到奖励上限
  2. 刷图次数过多强制终止(防止异常情况导致死循环,毕竟云函数免费额度也是有限的)
  3. 奖励过少自动刷新地图 等等...

总之非常的银性,解放双手拥抱人工智障!