zoukankan      html  css  js  c++  java
  • [外挂8] 自动挂机 SetTimer函数

    >_< : 这里用SetTimer函数自动运行![注意添加在里面的回掉函数函数]

     1 UINT SetTimer(
     2   HWND hWnd,              // 指向窗口句柄 
     3   UINT nIDEvent,          // 时钟标识
     4   UINT uElapse,           // 时间间隔 (毫秒)
     5   TIMERPROC lpTimerFunc   // 指向回调函数的地址
     6 );
     7 
     8 KillTimer(UINT nIDEvent);          // 时钟标识
     9 
    10 VOID CALLBACK playproc(
    11   HWND hwnd,     // handle of window for timer messages
    12   UINT uMsg,     // WM_TIMER message
    13   UINT idEvent,  // timer identifier
    14   DWORD dwTime   // current system time
    15 )
    16 {
    17      A();//SetTimer里的回掉函数  
    18 } 19 VOID CALLBACK strartproc( 20 HWND hwnd, // handle of window for timer messages 21 UINT uMsg, // WM_TIMER message 22 UINT idEvent, // timer identifier 23 DWORD dwTime // current system time 24 ) 25 { 26 B();
    27 }

    >_< : 在窗口上添加一个复选框CheckBox,设置为自动开局,再关联两个变量m_autoplay / m_autostart

      1 //-----------------------------------------------------------------------------
      2 void OnStartGame(int x,int y)
      3 {    
      4     HWND gameh;//游戏窗口句柄
      5     RECT r1;//RECT结构表示一个矩形区域
      6     POINT p;//x,y
      7 
      8     gameh=::FindWindow(NULL,"井字棋");
      9     ::GetWindowRect(gameh,&r1);
     10 
     11     GetCursorPos(&p);//保存当前鼠标指针 //取得当前鼠标位置
     12     SetCursorPos(x+r1.left,y+r1.top);//当前窗口坐标+开局按钮坐标
     13 
     14     mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//鼠标在当前位置按下
     15     mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//鼠标在当前位置抬起
     16     mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
     17 
     18     Sleep(200);//过一段时间 再执行后边的代码
     19     SetCursorPos(p.x,p.y); //还原鼠标位置
     20 }
     21 //---------------------------------------------------------------------------
     22 int chessdata[3][3];//a[y][x]棋盘状态0-1-2
     23 int win[2][8];//PC和外挂在8种情况下的棋子数
     24 bool ptab[9][8];            //电脑的获胜的状态表
     25 bool ctab[9][8];            //外挂的获胜的状态表
     26 
     27 void init()
     28 {    
     29     int count=0,i,k;
     30     //设定外挂与计算机在各个获胜组合中的棋子数
     31     for(i=0;i<8;i++)
     32     {
     33         win[0][i]=0;
     34         win[1][i]=0;
     35     }
     36 
     37 
     38     //设定水平方向的获胜组合
     39     for(i=0;i<=6;i+=3)
     40     {
     41         for(k=0;k<3;k++)//3个棋子1个获胜组合
     42         {
     43             ptab[i+k][count]=true;
     44             ctab[i+k][count]=true;
     45         }
     46         count++;
     47     }
     48     //设定垂直方向的获胜组合
     49     for(k=0;k<3;k++)
     50     {
     51         for(i=0;i<=6;i+=3)//3个棋子1个获胜组合
     52         {
     53             ptab[i+k][count]=true;
     54             ctab[i+k][count]=true;
     55         }
     56         count++;
     57     }
     58     //设定对角线方向上的获胜组合
     59     for(i=2;i<=6;i+=2){
     60         ptab[i][count]=true;
     61         ctab[i][count]=true;
     62     }count++;
     63     for(i=0;i<=8;i+=4){
     64         ptab[i][count]=true;
     65         ctab[i][count]=true;
     66     }
     67 }
     68 void reup()//根据棋盘状态更新胜利表、外挂、电脑表
     69 {
     70     for(int i=0;i<3;i++){
     71         for(int j=0;j<3;j++){
     72             if(chessdata[i][j]==2){
     73                 //改变胜利表和各外挂、PC各胜利组合的棋子数
     74                 for(int k=0;k<8;k++){
     75                     if(ptab[i*3+j][k]){
     76                         win[0][k]++;
     77                         ctab[i*3+j][k]=false;
     78                         win[1][k]=5;
     79                     }
     80                 }
     81             }else if(chessdata[i][j]==1){
     82                 //改变胜利表和各外挂、PC各胜利组合的棋子数
     83                 for(int k=0;k<8;k++){
     84                     if(ptab[i*3+j][k]){
     85                         win[1][k]++;
     86                         ptab[i*3+j][k]=false;
     87                         win[0][k]=5;
     88                     }
     89                 }
     90             }            
     91         }
     92     }
     93 }
     94 int getPos()//获取该下棋位置
     95 {
     96     int grades[2][9];
     97     int m,i,max=0;
     98     int u;
     99 
    100     for(m=0;m<9;m++){
    101         grades[0][m]=0;
    102         grades[1][m]=0;
    103 
    104         if( chessdata[m/3][m%3]==0){
    105             for(i=0;i<8;i++){
    106                 //计算PC在空棋格上的获胜分数
    107                 if(ptab[m][i] && win[0][i]!=5){
    108                         switch(win[0][i]){
    109                         case 0:
    110                             grades[0][m]+=1;
    111                             break;
    112                         case 1:
    113                             grades[0][m]+=2000;
    114                             break;
    115                         case 2:
    116                             grades[0][m]+=10000;
    117                             break;
    118                         }
    119                 }
    120 
    121                 //计算外挂在空格上的获胜分数
    122                 if(ctab[m][i] && win[1][i]!=5){
    123                     switch(win[1][i]){
    124                         case 0:
    125                             grades[1][m]+=1;
    126                             break;
    127                         case 1:
    128                             grades[1][m]+=2001;
    129                             break;
    130                         case 2:
    131                             grades[1][m]+=10001;
    132                             break;
    133                     }
    134                 }
    135             }
    136 
    137             if(max==0)u=m;
    138             
    139             if(grades[0][m]>max){
    140                 max=grades[0][m];
    141                 u=m;    
    142             }
    143             else if(grades[0][m]==max){
    144                 if(grades[1][m]>grades[1][u])u=m;
    145             }
    146 
    147             if(grades[1][m]>max){
    148                 max=grades[1][m];
    149                 u=m;    
    150             }
    151             else if(grades[1][m]==max){
    152                 if(grades[0][m]>grades[0][u])u=m;
    153             }
    154         }
    155     }
    156     return u;
    157 }
    158 void play_zidong()
    159 {
    160     HWND gameh=::FindWindow(NULL,"井字棋");//获取窗口句柄
    161     //获取窗口进程ID
    162     DWORD processid;
    163     ::GetWindowThreadProcessId(gameh,&processid);
    164     HANDLE processH=::OpenProcess(PROCESS_ALL_ACCESS,false,processid);//打开指定进程
    165 
    166     //读指定进程 内存数据
    167     DWORD byread;
    168     LPCVOID pbase=(LPCVOID)0x014D507C; //棋盘数据基址
    169     LPVOID  nbuffer=(LPVOID)&chessdata; //存放棋盘数据
    170     ::ReadProcessMemory(processH,pbase,nbuffer,3*3*4,&byread);//进程句柄|基址|存放数据缓冲区|要读取数据的字节数|实际读取的字节数
    171 
    172     //算法部分:自动走下一步
    173     init();
    174     reup();
    175     int pos=getPos();
    176 
    177     //鼠标点击
    178     int   x=50+pos%3*100,y=50+pos/3*100;   //定义座标点
    179     int lparam;                            //定义座标点变量
    180     lparam=(y<<16)+x;                      //表示指定格,Y<<16是左移16位,发消息用的Y座标点
    181     ::SendMessage(gameh,WM_LBUTTONDOWN,0,lparam);//鼠标按下消息
    182     ::SendMessage(gameh,WM_LBUTTONUP,0,lparam);  //鼠标抬起消息
    183 }
    184 void CFewDlg::OnButton5() 
    185 {
    186     play_zidong();
    187 }
    188 //-------------------------------------------------------------------------------------
    189 VOID CALLBACK CFewDlg::playproc(
    190   HWND hwnd,     // handle of window for timer messages
    191   UINT uMsg,     // WM_TIMER message
    192   UINT idEvent,  // timer identifier
    193   DWORD dwTime   // current system time
    194 )
    195 {
    196      play_zidong();
    197 }
    198 VOID CALLBACK CFewDlg::strartproc(
    199   HWND hwnd,     // handle of window for timer messages
    200   UINT uMsg,     // WM_TIMER message
    201   UINT idEvent,  // timer identifier
    202   DWORD dwTime   // current system time
    203 )
    204 {
    205     OnStartGame(200,200);//自动开局
    206 }
    207 
    208 const PLAYID=111;//定义一个数值方便调用,不要重复
    209 const STARTID=112;//可以随便取数,不要重复
    210 void CFewDlg::OnCheck1() 
    211 {
    212     UpdateData(true);//更新窗口内容至变量
    213     if (m_autoplay){//如果变量被设置则运行
    214         SetTimer(PLAYID,1500,&playproc);//自动挂机
    215     }else{
    216         KillTimer(PLAYID);//关掉定时器,不执行回调函数
    217     }
    218 }
    219 void CFewDlg::OnCheck2() 
    220 {
    221     UpdateData(true);//更新窗口内容至变量
    222     if (m_autoplay){//如果变量被设置则运行
    223         SetTimer(STARTID,3*1000,&strartproc);//自动开局
    224     }else{//如果没有被选中的话
    225         KillTimer(STARTID);
    226     }
    227 }

     

  • 相关阅读:
    C++函数声明与定义
    《寻找发帖“水王”》代码的理解
    将正整数转换为二进制数
    使用Cookie记住登录用户
    Java组合算法
    已知链表头结点指针head,写一个函数把这个链表逆序
    String.IsNullOrEmpty官方示例
    log4net的使用
    asp.net MVC4总结
    点击获取页面上的经纬度
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3632927.html
Copyright © 2011-2022 走看看