允許效果截圖:
話不多說,直接上代碼。
#include<stdio.h>
#include<windows.h>
#include<easyx.h>
#include<conio.h>
#include<math.h>
//判斷兩種顏色是否相似
double isSamilar(int c1, int c2){
int r1 = GetRValue(c1);//位運算
int g1 = GetGValue(c1);
int b1 = GetBValue(c1);
int r2 = GetRValue(c2);//位運算
int g2 = GetGValue(c2);
int b2 = GetBValue(c2);
double d;
d = sqrt( double((r1-r2)*(r1-r2) + (g1-g2)*(g1-g2) + (b1-b2)*(b1-b2)) );
return d;
}
//鼠標點擊指定位置
void click(int x, int y){
//移動鼠標(x/y是鼠標目標位置, 1920/1080是我的電腦分辨率)
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, x*65535/1920, y*65535/1080, 0, 0);
Sleep(50);//稍微睡眠50ms
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//按下鼠標左鍵
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//松開鼠標左鍵
}
//獲取遊戲截圖
void CaptureDesktop(IMAGE *pimg)
{
int w = 440;
int h = 350;
// 調整 pimg 的大小
Resize(pimg, w, h);
// 獲取桌面 DC
HDC srcDC = GetDC(NULL);
// 獲取 IMAGE 對象的 DC
HDC dstDC = GetImageHDC(pimg);
// 在兩個 DC 之間執行圖像拷貝,將桌面抓圖拷貝到 IMAGE 對象裡面
BitBlt(dstDC, 0, 0, w, h, srcDC, 740, 388, SRCCOPY);
}
int main(){
int n;
printf("—使用手冊—n");
printf("1.使用期間盡量別操控鼠標和鍵盤,若要提前終止,則最好在每次棋子起跳後的2s左右內關閉命令窗n");
printf("2.打開小程序後不要改變跳一跳遊戲窗口在屏幕中的默認位置(即不要拖它或拉大拉小)n");
printf("3.下面輸入要跳的步數後,馬上讓跳一跳遊戲窗口在所有窗口上面n");
printf("———————————————————-nn");
printf("輸入跳多少次後結束程序:");
scanf("%d", &n);
printf("程序5s後開始跑….n");
Sleep(5000);
for(int i = 0; i < n; i++){
click(950, 110);//遊戲窗口獲取焦點(鼠標移到不影響遊戲的位置)
//獲取截圖
IMAGE img1;
CaptureDesktop(&img1);//獲取有效截圖
//找人的坐標(x1, y1)
int x1, y1;
int color;
SetWorkingImage(&img1);//在有效圖片img1上工作
for(y1 = 349; y1 >= 0; y1–){
for(x1 = 0; x1 <= 439; x1++){
color = getpixel(x1, y1);
if(color == RGB(54, 60, 102))break;//找到瞭人,跳出循環
}
if(color == RGB(54, 60, 102))break;//找到瞭人,跳出循環
}
//找目標點(x2, y2)
int x3, y3;
int bkcolor = getpixel(0, 0);
for(y3 = 0; y3 <= 349; y3++){
for(x3 = 0; x3 <= 439; x3++){
color = getpixel(x3, y3);
if(isSamilar(color, bkcolor) > 20){//跳出循環
if(abs(x3 – x1) > 15){//處理bug。人與目的平臺相距甚近時,第一個與背景不同的點不是平臺而是人的頭頂
break;
}
}
}
if(isSamilar(color, bkcolor) > 20){//跳出循環
if(abs(x3 – x1) > 15){//處理bug。人與目的平臺相距甚近時,第一個與背景不同的點不是平臺而是人的頭頂
break;
}
}
}
int x2, y2;
x2 = x3;//目標落點
y2 = y3 + 5;//目標落點
/*if(abs(x3 – x1) < 12){//處理bug。人與目的平臺相距甚近時,第一個與背景不同的點不是平臺而是人的頭頂
x2 = x1 – 83;
y2 = y1 – 52;
}*/
double d = sqrt( (double)((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) );//兩點間的距離
double t = 3.07* d;//跳距離d需要按壓屏幕的時間
int time = (int)(t + 0.5) > (int)t ? (int)t + 1 : (int)t;//四舍五入
printf("第%d次:n", i + 1);
printf("人的坐標(%d, %d),", x1, y1);
printf("落地坐標(%d, %d)", x2, y2);
printf("距離d = %f", d);
printf("按壓時間:%dn", time);
//起跳
mouse_event(MOUSEEVENTF_ABSOLUTE|MOUSEEVENTF_MOVE, 950*65535/1920, 300*65535/1080, 0, 0);
Sleep(100);
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//按下鼠標左鍵
Sleep( time );//鼠標按下的時間
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//松開鼠標左鍵
Sleep(2200);
}
return 0;
}
原理:
程序截取有效的圖片信息,默認直接截取屏幕中央
對有效圖片進行計算:
由於距離越遠,按壓屏幕時間越長,因此距離d與按壓屏幕的時間t成正比例關系,則有:t=k*d,系數k因電腦屏幕大小不同而不同,可自行微調(幅度0.01)。
計算完成後程序使用mouse_event()控制鼠標點擊,實現自動跳一跳。
考慮不懂C語言的同學,可直接使用:
-
扫码下载安卓APP
-
微信扫一扫关注我们微信扫一扫打开小程序手Q扫一扫打开小程序
-
返回顶部