科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件做QQ桌球游戏外挂——求游戏中的彩球圆心坐标

做QQ桌球游戏外挂——求游戏中的彩球圆心坐标

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

题描述: 游戏进球的基本条件: 鼠标的中点必须在彩球和球袋的中心连线上,鼠标必须和彩球相切,在加上力度的控制,才能把球打进球袋。 由于球袋的位置是固定的,所以我们只要求出彩球的中心(圆心),就可以确定鼠标的位置了。

作者:冬瓜 来源:CSDN 2008年3月25日

关键字: 外挂 桌球 QQ 游戏 Linux

  • 评论
  • 分享微博
  • 分享邮件

问题描述:
    游戏进球的基本条件:
  鼠标的中点必须在彩球和球袋的中心连线上,鼠标必须和彩球相切,在加上力度的控制,才能把球打进球袋。
   由于球袋的位置是固定的,所以我们只要求出彩球的中心(圆心),就可以确定鼠标的位置了。

求彩球的中心(圆心):
思路:
   还记得高中的时候,我们常常做已经某圆圆周上几个点坐标,求该圆的圆心坐标的数学题目吗?
这里我们就要用到这个数学知识了。 我们可以先求出球的边界点,然后根据几个边界点的坐标来求球的中心。

  现在问题由 求球的圆心 转换到 求球的任意边界点

求球的任意边界点:
思路:
    可以观察游戏的截图,球的颜色和游戏桌面的底色是不同的,也就是说 从球内的某点出发,如果遇到颜色与游戏桌面的底色相同的点,那么该点就是这个球的边界点了。

现在问题由 求球的任意边界点  转换到 求球内任意某点坐标

实现:
     而球内的坐标点可以在外挂使用者选择击打哪个球的时候。那时候鼠标的坐标就是球内的任意某点坐标。 

 现在问题由 求球内任意某点坐标  转回到 求球的任意边界点

实现:
这里我们需要收集游戏桌面的底色的颜色值范围。具体操作如下:

一般在计算机中表示演示可以使用RGB来表示的。如果颜色不同的话,那RGB的值也不同。
可以看图片中桌球游戏的桌面是绿色的,但绿的程度有些变化。
我们可以用画图工具来取游戏桌面的最亮绿点的RGB值和最暗绿点的RGB值。
我们取出最亮绿点的RGB值为:RGB(72,158,65),最暗绿点的RGB值为:RGB(36,86,92)

如果某坐标点的颜色的RGB值在RGB(72,158,65)——RGB(36,86,92)之间,
则说明该点 属于 游戏的桌面,

如果某坐标点的颜色的RGB值在RGB(72,158,65)——RGB(36,86,92)之外,
则说明该点 属于 彩球。


所以我们可以写个函数来判断该坐标点属于游戏的桌面还是彩球。

//********************************
/*
参数int R, int G, int B为 某坐标点的RGB值。
如果Colour函数返回0,表示该点 属于 彩球
如果Colour函数返回1,表示该点 属于 游戏的桌面
*/
//********************************
int Colour(int R, int G, int B)
{
 int r=54,g=122,b=47;     //r,g,b 为游戏的桌面的平均色
 int temp;

       temp=abs(r-R);  //abs函数是取绝对值函数

 if(temp>18)
  return 0;

 temp=abs(g-G);
 //if(temp>36)
 if(temp>71)      //颜色的绿值  本来应该为36,但为了更正确 所以放宽到71,
  return 0;

 temp=abs(b-B);
 if(temp>18)
  return 0;
 
 return 1;
}
       

 

有了上面的函数后,我们可以对已经求到的球内坐标的X/Y值进行上下左右移动,边移动边用函数Colour

来判断是否到了边界,这样可以求到4个边界点  具体代码如下:
/*******************************
函数 GetBall
中参数 x, y的值为 已经求到的球内坐标

4个边界点的坐标保存在
int x1=0,x2=0,x3=0,y1=0,y2=0,y3=0,x4=0,y4=0;

(注:这个函数只给出部分,还有代码后面给出)
*******************************/


int GetBall(int x, int y)
{    
 COLORREF pointRGB; 
  int x1=0,x2=0,x3=0,y1=0,y2=0,y3=0,x4=0,y4=0;
 
 pointRGB=GetPixel(pDC,x,y);  //取得X,Y点的颜色
 BYTE valueR=GetRValue(pointRGB);
 BYTE valueG=GetGValue(pointRGB);
 BYTE valueB=GetBValue(pointRGB);  // 转换


 if(Colour(valueR,valueG,valueB)==1)  //==1 表示鼠标没有点击在球上
 {
  MessageBox(GetFocus(),"请选择球",0,MB_OK);
  return 0;
 } 
 
 
 int Temp;
 for(Temp=1;Temp<=22;Temp++)
 {
  pointRGB=GetPixel(pDC,x+Temp,y); //移动X坐标
  BYTE valueR=GetRValue(pointRGB);
  BYTE valueG=GetGValue(pointRGB);
  BYTE valueB=GetBValue(pointRGB);
  if(Colour(valueR,valueG,valueB)==1)  //==1表示找到了边界点
  { 
   x1=x+Temp;y1=y;
   break;
  }
  if(Temp==22)
   return 0;
 }
 
 for(Temp=1;Temp<=22;Temp++)
 {
  pointRGB=GetPixel(pDC,x,y+Temp); //移动Y坐标
  BYTE valueR=GetRValue(pointRGB);
  BYTE valueG=GetGValue(pointRGB);
  BYTE valueB=GetBValue(pointRGB);
  if(Colour(valueR,valueG,valueB)==1)  //==1表示找到了边界点
  { 
   x2=x;y2=y+Temp;
   break;
  }
  if(Temp==22)
   return 0;
 }
 for(Temp=1;Temp<=22;Temp++)
 {
  pointRGB=GetPixel(pDC,x,y-Temp);  //移动Y坐标
  BYTE valueR=GetRValue(pointRGB);
  BYTE valueG=GetGValue(pointRGB);
  BYTE valueB=GetBValue(pointRGB);
  if(Colour(valueR,valueG,valueB)==1)  //==1表示找到了边界点
  { 
   x3=x;y3=y-Temp;
   break;
  }
  if(Temp==22)
   return 0;
 }
 for(Temp=1;Temp<=22;Temp++)
 {
  pointRGB=GetPixel(pDC,x-Temp,y);    //移动X坐标
  BYTE valueR=GetRValue(pointRGB);
  BYTE valueG=GetGValue(pointRGB);
  BYTE valueB=GetBValue(pointRGB);
  if(Colour(valueR,valueG,valueB)==1)  //==1表示找到了边界点
  { 
   x4=x-Temp;y4=y;
   break;
  }
  if(Temp==22)
   return 0;
 }
}


现在问题由 求球的任意边界点  转回到 求球的圆心

由于这纯属于数学知识,就不给出求公式的证明了,这里只给出代码
如果不明白可以和我交流下哦。


这是函数GetBall的后面部分,GetBall函数全部可以从源代码中取得

球心坐标保存在  ball_x,ball_y

//*****下面代码为根据4个点坐标求圆心*******************
 double temp1,temp2;
 temp1=2*x1+x2+x4;
 temp2=(y2-y1)*(y3-y1)/(x1-x2);

 d_ball_x=((temp1+temp2)/4);  //求球心X坐标公式,呵呵 是不是很简洁 2次方方程简化来的哦


 if(d_ball_x-int(d_ball_x)>0)
  ball_x=int(d_ball_x)+1;
 else
  ball_x=int(d_ball_x);


 temp1=2*y2+y1+y3;
 temp2=(x2-x1)*(x4-x1)/(y1-y2);

 d_ball_y=((temp1+temp2)/4); //求球心Y坐标公式,呵呵 是不是很简洁 2次方方程简化来的哦
 
 if(d_ball_y-int(d_ball_y)>0)
  ball_y=int(d_ball_y)+1;
 else
  ball_y=int(d_ball_y);
//*****上面代码为根据4个点坐标求圆心*******************


这样就求出了 彩球的圆心了。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章