autojs连连看脚本可视化

简介: 牙叔教程 简单易懂

牙叔教程 简单易懂


下面来看看连连看脚本的制作思路



采集画面原始信息


  1. 游戏区域的左上角和右下角坐标
  2. 游戏的行列的数量
  3. 格子的原始图片


调整数据结构


我把小小的格子定义为一个Cell类, 然后所有属性都挂到他上面, 方便调用

function Cell(row, column) {
  this.row = row;
  this.column = column;
  this.state = Cell.state.NORMAL;
  this.width = 0;
  this.height = 0;
  this.centerX = 0;
  this.centerY = 0;
  this.left = 0;
  this.top = 0;
  this.right = 0;
  this.bottom = 0;
  this.canvas = null;
  this.number = null;
  this.originalImg = null;
  this.img = null;
  this.paint = paint;
}


判断格子是否连通


这个是该教程的重点, 网上已经有很多的方法了, 大家可以博采众长, 然后写出自己的脚本.


下面来看看这个脚本是怎么判断的


连通类别我分为三种



图形化展示三种连通分类


第一种: 两个格子紧挨着



第二种: 一个格子周围的空格和另一个格子周围的空格有交集



第三种:
一个格子周围的空格集合A,


另一个格子周围的空格集合B,


集合B周围的空格集合C,


集合A和集合C有交集



几个小问题


1 怎么判断格子是不是空的


Celll有一个属性originalImg, 保存的是游戏刚开始格子里面的图片,


截图以后, 拿当前的图片和原始图片做对比, 不一样的话, 就是格子就是空的


2 怎么判断两个格子图片是不是一样的


我用的是多点比色, 在一张图中取多个点的颜色数据, 然后去另一张图中找;


能找到符合条件的多个点, 就说明两张图一样.

function isSameTwoImg(img1, img2) {
  // 在图中间找固定数量的点, 然后去大图里面多点找色
  let colorDataList = getColorDataList(img1);
  // [图片与颜色 - Images](https://pro.autojs.org/docs/#/zh-cn/images?id=imagesfindmulticolorsimg-firstcolor-colors-options)
  let firstColor = colorDataList[0][2];
  let colors = colorDataList.slice(1);
  try {
    let p = images.findMultiColors(img2, firstColor, colors);
    return p;
  } catch (error) {
    log("error", error);
  }
}
function getColorDataList(img) {
  let count = 25;
  let row = Math.sqrt(count);
  let column = Math.sqrt(count);
  let padding = 10;
  let width = img.getWidth();
  let height = img.getHeight();
  let contentWidth = width - padding * 2;
  let contentHeight = height - padding * 2;
  let unitWidth = contentWidth / (row - 1);
  let unitHeight = contentHeight / (column - 1);
  let colorDataList = [];
  let rowIndex = 0;
  let columnIndex = 0;
  let firstPoint;
  for (let i = 0; i < count; i++) {
    let x = padding + unitWidth * rowIndex;
    let y = padding + unitHeight * columnIndex;
    if (i === 0) {
      firstPoint = {
        x: x,
        y: y,
      };
    }
    let color = images.pixel(img, x, y);
    let relativeX = x - firstPoint.x;
    let relativeY = y - firstPoint.y;
    colorDataList.push([relativeX, relativeY, color]);
    rowIndex++;
    if (rowIndex === row) {
      rowIndex = 0;
      columnIndex++;
    }
  }
  return colorDataList;
}


3 调试脚本怎样可视化


调试的时候, 我会增加一个悬浮窗, 在符合条件的格子上方涂上颜色

Cell.prototype.renderDebug = function (color) {
  color = color || "#33f44336";
  paint.setColor(colors.parseColor(color));
  paint.setStrokeWidth(1);
  // paint.setStyle(Paint.Style.STROKE);
  paint.setStyle(Paint.Style.FILL);
  paint.setXfermode(null);
  let left = this.left;
  let top = this.top;
  let right = this.right;
  let bottom = this.bottom;
  let rect = new RectF(left, top, right, bottom);
  this.canvas.drawRect(rect, paint);
  // this.canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
};


function renderTwoCell(emptyCell, currentCell, cellList) {
  let emptyCellRow = emptyCell.row;
  let emptyCellColumn = emptyCell.column;
  let currentCellRow = currentCell.row;
  let currentCellColumn = currentCell.column;
  if (emptyCellRow === currentCellRow) {
    if (emptyCellColumn < currentCellColumn) {
      let len = currentCellColumn - emptyCellColumn;
      for (let i = 0; i < len; i++) {
        let cell = cellList[emptyCellRow][emptyCellColumn + i];
        cell.renderDebug();
      }
    } else {
      let len = emptyCellColumn - currentCellColumn;
      for (let i = 0; i < len; i++) {
        let cell = cellList[emptyCellRow][emptyCellColumn - i];
        cell.renderDebug();
      }
    }
  } else if (emptyCellColumn === currentCellColumn) {
    if (emptyCellRow < currentCellRow) {
      let len = currentCellRow - emptyCellRow;
      for (let i = 0; i < len; i++) {
        let cell = cellList[emptyCellRow + i][emptyCellColumn];
        cell.renderDebug();
      }
    } else {
      let len = emptyCellRow - currentCellRow;
      for (let i = 0; i < len; i++) {
        let cell = cellList[emptyCellRow - i][emptyCellColumn];
        cell.renderDebug();
      }
    }
  }
}


也可以打印格子的状态

function printCellData(cellList) {
  let str = "";
  for (var i = 0; i < cellList.length; i++) {
    let cellRow = cellList[i];
    for (var j = 0; j < cellRow.length; j++) {
      let cell = cellRow[j];
      str += cell.isEmpty() ? "X" : "O";
    }
    str += "\n";
  }
}


4 autojs8和9模块导出格式不一样


autojs8

module.exports = {
  viewImg: viewImg,
  isSameTwoImg: isSameTwoImg,
};


autojs9

module.exports = {
  viewImg,
  isSameTwoImg,
};


备注


如果你要使用脚本的话, 你要修改config.js里面的

left, top, right, bottom


为手机不一样, 游戏的显示区域就不一样


环境


手机: Mi 11 Pro


Android版本: 12


Autojs版本: 9.1.3


名人名言


思路是最重要的, 其他的百度, bing, stackoverflow, github, 安卓文档, autojs文档, 最后才是群里问问
--- 牙叔教程


声明


部分内容来自网络
本教程仅用于学习, 禁止用于其他用途

相关文章
|
3月前
|
开发工具 开发者
如何用 CocosCreator 对接抖音小游戏的侧边栏复访
最近小游戏的软著下来了,用 CocosCreator 做的游戏也完成了 1.0 版本。而当我打包成抖音小游戏进行提交时,还没到初审就给拒了,因为还有一个机审,机器检测到代码中没有接入 “侧边栏复访功能”。这个我还真不知道,那只能去官方看文档了,位置是小游戏开发文档 -> 指南 -> 开放能力 -> 侧边栏能力。
42 2
|
Python
Python实战项目2——自动获取酷狗音乐工具
Python实战项目2——自动获取酷狗音乐工具
173 0
|
6月前
|
小程序 API
微信小程序飞机大战游戏步骤及代码
微信小程序飞机大战游戏步骤及代码
226 0
|
6月前
微信小游戏制作工具中的分享功能怎么用?
微信小游戏制作工具中的分享功能怎么用?
79 0
|
图形学 数据安全/隐私保护
还在用Unity开发游戏?那你就out了,试试用Unity做一个答题系统吧
大家都支持Unity是用来做游戏开发,比如说做2D游戏、3D游戏,或者工业虚拟仿真软件的开发。 其他Unity可以做的有很多,比如答题系统。 本篇就介绍答题系统的开发 这个答题系统,可以从文本文档中提取题目和分数,然后绑定到UI上,在答题的过程中,自动判断分数,自动判断正确率。 目的是实现一个可快速导入到项目中使用的小模块。
|
Python
python小游戏——贪吃蛇游戏4.0版本の背景音乐和音效功能实现
python小游戏——贪吃蛇游戏4.0版本の背景音乐和音效功能实现
190 0
|
搜索推荐 开发工具 Android开发
更“大”的微信小游戏制作工具
为什么这么久都不开发新功能了呢?因为人手和资源有限。这个可能跟很多人想的不一样,这个不是微信的产品吗?腾讯公司会没人没资源?大公司的实际情况可能还真跟很多人想的不一样。微信小游戏制作工具背后的团队不大,甚至比你想要的还要小,而且团队除了需要负责这个工具的维护之外,还有很多其它的事情需要处理。
270 0
|
机器人 图形学 Ruby
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
239 0
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
|
定位技术 网络安全
我用WireShark结合一款神器成功绘画出入侵者的地图!
我用WireShark结合一款神器成功绘画出入侵者的地图!
285 0
|
Android开发
autojs牙叔工具箱
牙叔教程 简单易懂
778 0