/// <summary> /// 检查toolName是否存在 /// </summary> /// <param name="toolName"></param> /// <returns></returns> public bool CheckToolsStatus(string toolName) { //移动鼠标到边上 MoveToConer(); string subPic = Singleton.GetInstance().PicRootDir + "tools\\" + toolName + ".png"; if (!File.Exists(subPic)) { log.Error("不存在路径" + subPic); return(false); } Bitmap bm = PicUtil.GetScreen(CenterPoint.X + 200, CenterPoint.Y + 40, 120, 200); List <Point> list = PicCorFinder.FindPicture(subPic, bm, Rectangle.Empty, 2); //没有被找到 if (list.Count == 0) { return(false); } else { Point p1 = Singleton.GetInstance().dicWindows[WindowNum].Point; WindowAPI.MMouseMoveTo(0, p1.X + 540, p1.Y - 170); return(true); } }
/// <summary> /// 获取所需用时 /// </summary> /// <param name="cityName"></param> /// <returns></returns> public int GetWalkSeconds(string cityName) { WindowAPI.MMouseMoveTo(0, 0, 0); Point p1 = Singleton.GetInstance().dicWindows[WindowNum].Point; Bitmap bm = PicUtil.GetScreen(p1.X, p1.Y - 480, 640, 480); //数点的个数,100px与等于15秒,ZZ100px约等于10点,1个点的时间2.3倍 //平均每个点为3.5/XS City city = new City() { CityName = cityName, MapMaxGameCoor = new GameCoordinate(191, 119), MapSize = new int[2] { 441, 276 } }; List <Point> list = PicCorFinder.FindPicture(Singleton.GetInstance().PicRootDir + "wp.png", bm, Rectangle.Empty, 2, 0.9, true); //额外加出3个点,防止几类情况 1、最后个棋子的挡住1个+自己一个2、大红点挡住一个 return((int)((list.Count + 3) * 3.5 / city.XS)); }
/// <summary> /// 检查Dialog打开状态 /// </summary> /// <param name="dialogName"></param> /// <returns></returns> public bool CheckDialogStatus(string dialogName) { //移动鼠标到边上 MoveToConer(); string subPic = Singleton.GetInstance().PicRootDir + "dialog\\" + dialogName + ".png"; if (!File.Exists(subPic)) { log.Error("不存在路径" + subPic); return(false); } Bitmap bm = PicUtil.GetScreen(CenterPoint.X, CenterPoint.Y - 240, 320, 240); List <Point> list = PicCorFinder.FindPicture(subPic, bm, Rectangle.Empty, 2); //没有被找到 if (list.Count == 0) { return(false); } else { return(true); } }
/// <summary> /// 根据桌面坐标获取返回当前坐标 /// </summary> /// <param name="po"></param> /// <returns></returns> public GameCoordinate MapOcr(City city, GameCoordinate targetGC_JQ) { string words = ""; int isize = 3; string[] strWords = { "0", "0" }; GameCoordinate nowgc = new GameCoordinate(0, 0); int times = 0; while (true) { if (times > 10) { throw new HengTimeOutException("restart"); } Point po_nowdeskzuobiao = new Point(); WindowAPI.GetCursorPos(out po_nowdeskzuobiao); if (isize < 8) { isize++; } try { new GameCommonUtil().ThreadRest(2); //获取到键盘的,然后截图大约是x-60 y-40 大小是120,80 Bitmap bm = PicUtil.GetScreen(po_nowdeskzuobiao.X - 50, po_nowdeskzuobiao.Y - 50, 100, 80); // 处理坐标图像 // 1、截图 // 2、分析点图,黄色图片,减少变换量 // 3、颜色反转 // 4、放大图片 List <Point> lisp = PicCorFinder.FindColor(bm, "#FFFF00", Rectangle.Empty, 0); if (lisp.Count == 0) { bm.Dispose(); return(new GameCoordinate(-1, -1)); } bm = PicUtil.CaptureImage(bm, new Point(lisp[0].X - 10, lisp[0].Y - 8), 60, 25); bm = PicUtil.ChangeColor(bm, Color.FromArgb(255, 255, 0)); //百度人工智能有一定错误率,主要95%集中在了,所以这边只要有,就放大图片重新识别,直到ok Bitmap bm2 = PicUtil.PicSized(bm, isize); JObject jobject = PicUtil.BaiDuOCR(bm2); JArray jarr = (JArray)jobject["words_result"]; //如果超出边界,移动移出来 if (jarr.Count == 0) { DoMove(targetGC_JQ); bm2.Dispose(); bm.Dispose(); continue; } bm.Dispose(); bm2.Dispose(); bool flag = false; for (int i = 0; i < jarr.Count; i++) { words = jarr[i]["words"].ToString(); flag = StringUtil.IsNumber(words.Replace(",", "")); if (flag) { break; } } Console.WriteLine("words:" + words); if (!words.Contains(',') || !flag) { //大概率没识别出来,就动下鼠标 Move11Step(city, targetGC_JQ, ref times); continue; } strWords = words.Split(','); nowgc = new GameCoordinate(Convert.ToInt32(strWords[0]), Convert.ToInt32(strWords[1])); //if (IsErrorRange(nowgc, targetGC_JQ, isize)) //{ // //大概率没识别出来,就动下鼠标 // Move11Step(city, targetGC_JQ, ref times); // continue; //} break; } catch (Exception) { //大概率没识别出来,就动下鼠标 Move11Step(city, targetGC_JQ, ref times); continue; } } return(nowgc); }