C語言實現跳一跳輔助器

刘三好 2024-06-05 02:24 1次浏览 0 条评论 taohigo.com

允許效果截圖:

話不多說,直接上代碼。

#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語言的同學,可直接使用: