日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QQ游戏连连看的脚本

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QQ游戏连连看的脚本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用vs 2019和easyx圖形庫完成QQ游戲連連看的腳本

需要的工具:

  • win 10
  • vs 2019
  • easyx
  • 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游戏连连看的脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。