QQ游戏连连看的脚本
生活随笔
收集整理的這篇文章主要介紹了
QQ游戏连连看的脚本
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用vs 2019和easyx圖形庫完成QQ游戲連連看的腳本
需要的工具:
main.cpp
#include <stdio.h> #include <easyx.h>#define ROW 11 #define COL 19HWND qqHwnd = NULL; IMAGE image(800, 600); HDC qqHdc, imgHdc; IMAGE img[ROW][COL]; RECT rect;void ClearImage(IMAGE* pimg) {SetWorkingImage(pimg);setbkcolor(RGB(48, 76, 112));cleardevice();SetWorkingImage(NULL); }bool IsSimilar(IMAGE* pimg1, IMAGE* pimg2) {//10 10SetWorkingImage(pimg1);COLORREF color11 = getpixel(3, 3);COLORREF color12 = getpixel(3, 6);COLORREF color13 = getpixel(6, 3);COLORREF color14 = getpixel(6, 6);COLORREF color15 = getpixel(5, 5);SetWorkingImage(pimg2);COLORREF color21 = getpixel(3, 3);COLORREF color22 = getpixel(3, 6);COLORREF color23 = getpixel(6, 3);COLORREF color24 = getpixel(6, 6);COLORREF color25 = getpixel(5, 5);if (color11 == color21 && color12 == color22 && color13 == color23 && color14 == color24 && color15 == color25)return true;elsereturn false; }bool IsBlank(IMAGE* pimg) {SetWorkingImage(pimg);COLORREF color11 = getpixel(2, 2);COLORREF color12 = getpixel(2, 7);COLORREF color13 = getpixel(7, 2);COLORREF color14 = getpixel(7, 7);COLORREF color15 = getpixel(5, 5);if (color11 == RGB(48, 76, 112) &&color12 == RGB(48, 76, 112) &&color13 == RGB(48, 76, 112) &&color14 == RGB(48, 76, 112) &&color15 == RGB(48, 76, 112))return true;elsereturn false; }void GameInit() {//初始化image對象qqHwnd = FindWindowA(NULL, "QQ游戲 - 連連看角色版"); //獲取連連看窗口句柄if (qqHwnd == NULL){printf("沒有找到游戲窗口\n");system("pause");exit(0);}qqHdc = GetDC(qqHwnd); //獲取游戲窗口繪圖句柄imgHdc = GetImageHDC(&image); //獲取image繪圖句柄BitBlt(imgHdc, 0, 0, 800, 600, qqHdc, 0, 0, SRCCOPY); //調用winapi將窗口圖像繪制到image中SetWorkingImage(&image); //設置image位當前工作對象setorigin(15, 182); //設置坐標原點for (int i = 0; i < ROW; i++) //切割圖像for (int j = 0; j < COL; j++)getimage(&img[i][j], j * 31 + 10, i * 35 + 10, 10, 10); //縮小范圍SetWorkingImage(NULL); }bool IsExist() {for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){if (!IsBlank(&img[i][j]))return true;}}return false; }bool HorizConnect(int row1, int col1, int row2, int col2) {if (row1 != row2) { //如果r1 != r2 return false; //不連通}int maxCol = col1 > col2 ? col1 : col2; //最大的列int minCol = col1 > col2 ? col2 : col1; //最小的列if (maxCol - minCol == 1) { //兩圖塊相鄰return true; //連通}for (int i = minCol + 1; i < maxCol; i++) {if (!IsBlank(&img[row1][i])) {return false;}}return true; }bool VerticConnect(int row1, int col1, int row2, int col2) {if (col1 != col2) {return false;}int maxRow = row1 > row2 ? row1 : row2;int minRow = row1 > row2 ? row2 : row1;if (maxRow - minRow == 1) { //兩圖塊相鄰return true;}for (int i = minRow + 1; i < maxRow; i++) {// 水平方向遇到一個非空節點,就認為水平連接失敗if (!IsBlank(&img[i][col1])) {return false;}}return true; }bool OneTurnConnect(int row1, int col1, int row2, int col2) {if (row1 == row2 || col1 == col2) {return false; //不能在同一水平線,或同一垂直線上}// 第1個拐點int turnRow1 = row1;int turnCol1 = col2;// 第2個拐點int turnRow2 = row2;int turnCol2 = col1;if (IsBlank(&img[turnRow1][turnCol1]) && //第1個拐點是空節點HorizConnect(row1, col1, turnRow1, turnCol1) &&VerticConnect(turnRow1, turnCol1, row2, col2)) {return true;}if (IsBlank(&img[turnRow2][turnCol2]) && //第2個拐點是空節點VerticConnect(row1, col1, turnRow2, turnCol2) &&HorizConnect(turnRow2, turnCol2, row2, col2)) {return true;}return false; }bool TwoTurnConnect(int row1, int col1, int row2, int col2) {for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (!IsBlank(&img[i][j])) { // 尋找空節點continue;}// 雙折拐點必須和起點(或終點)同一行(或同一列),// 否則不能作為雙折拐點if (i != row1 && i != row2 && j != col1 && j != col2) {continue;}if (OneTurnConnect(row1, col1, i, j) &&(HorizConnect(i, j, row2, col2) ||VerticConnect(i, j, row2, col2))) {return true;}if (OneTurnConnect(i, j, row2, col2) &&(HorizConnect(row1, col1, i, j) ||VerticConnect(row1, col1, i, j))) {return true;}}}return false; }bool CheckConnect(int row1, int col1, int row2, int col2) {// 1. 起點和終點都不能是空白點if (IsBlank(&img[row1][col1]) ||IsBlank(&img[row2][col2]) ||// 2. 起點和終點不能是同一個點row1 == row2 && col1 == col2 ||// 3. 起點和終點必須是相同的圖塊!IsSimilar(&img[row1][col1], &img[row2][col2])) {return false;}if (HorizConnect(row1, col1, row2, col2) || // RedmiVerticConnect(row1, col1, row2, col2) ||OneTurnConnect(row1, col1, row2, col2) ||TwoTurnConnect(row1, col1, row2, col2)) {return true;}return false; }void Match() {//找第一個點 起點/終點for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){if (IsBlank(&img[i][j])) //不管 0空的continue;//找下一個//找下一個for (int m = i; m < ROW; m++){for (int n = 0; n < COL; n++){if (IsSimilar(&img[i][j], &img[m][n])) //找到2個一樣{if (CheckConnect(i, j, m, n)) //判斷是否連通{//鼠標移動到起點上。SetCursorPos((rect.left + 15 + j * 31) + 10, (rect.top + 182 + i * 35) + 10);//鼠標點擊一下起點。mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//Sleep(20);//鼠標設置到終點。SetCursorPos((rect.left + 15 + n * 31) + 10, (rect.top + 182 + m * 35) + 10);//鼠標點擊一下終點。mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);ClearImage(&img[i][j]);ClearImage(&img[m][n]);//Sleep(20);}}}}}} }int main() {GameInit();GetWindowRect(qqHwnd, &rect);SetForegroundWindow(qqHwnd);Sleep(1000);while (IsExist())Match();return 0; }總結
以上是生活随笔為你收集整理的QQ游戏连连看的脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每日一题(29)—— 如何引用一个已经定
- 下一篇: curl 增加header_libcur