C++连连看外挂
?
自己寫的一個鼠鍵模擬點擊屏幕上的具體坐標的小玩意兒..
?
/***********************************************************************************************
?算法設計
?1.讀取更新的棋盤數據
?2.遍歷棋盤數據 找到相同的棋子
?3.判斷兩點是否能消除
?4.如果能消除
?5.那么就模擬鼠標點擊這兩個點
?
************************************************************************************************/
這是整體程序架構;其中的Check2p, Click2p是兩個重要的函數;前者是檢查兩點棋子是否可以消除;如果可以消除就調用Clik2P它的作用就是模擬一次點擊可以消除的這兩顆棋子,具體代碼如下:
/************************************************************************************************檢查兩點是否可以消除 樁模塊 a、在這一對棋子間找相通路徑的原理b、(Check2p函數)框架代碼c、(CheckLine函數)檢測2點是否有連通LineNull(p1,p2); //是否在棋盤上 的2個點之前是否有一條全為0的直線,如有true,否則false1、剪貼游戲圖;Y坐標相同的情況下 p1,p2 lineNull(p1.right,p2.left) //可消除X坐標相同的情況下 p1,p2LineNull(p1.down,p2.up) //可消除************************************************************************************************/bool Check2p(POINT a,POINT b){CChessPoint p1(a),p2(b);POINT pa,pb;//轉角點int x,y;// 如果2點為同一點 則返回假if ((a.x==b.x) && (a.y==b.y )) { return false;} elseif ((chess[a.y][a.x]==0) || (chess[b.y][b.x]==0)) { return false;} elseif (chess[a.y][a.x]!=chess[b.y][b.x]) { return false;}pa=a;pb=b;// 在橫向一條線上 y坐標 相同if (a.y==b.y) { // 2點在左右相鄰 //問題所在if ((p1.right.x==p2.pold.x) || (p1.left.x==p2.pold.x)) { return true; }//檢測 這條線是否有一條路徑相通if (CheckLine(p1.right,p2.left )) {return true; }//檢測 上下//y 上pa=a;pb=b;if ((p1.up.y >=0) && (p1.up.y<=10)) for ( y=0 ;y<=p1.up.y;y++){pa.y=y;pb.y=y;if (CheckLine(pa,p1.up) && CheckLine(pb,p2.up ) && CheckLine(pa,pb)) { return true; }}// y下pa=a;pb=b;if ((p1.down.y >=0)&& (p1.down.y <=10)) for ( y=p1.down.y;y<=10;y++){pa.y=y;pb.y=y;if (CheckLine(pa,p1.down ) && CheckLine(pb,p2.down ) && CheckLine(pa,pb)) { return true; } }//檢測 左右 因為 y軸相等,所以不存在左右路徑 } else//縱向一條線 x 坐標 相同if (a.x==b.x){//x下上 相鄰不 //???????????a//if ((p1.down.y==p2.up.y ) || (p1.up.y==p2.up.y))if((p1.down.y==p2.pold.y ) || (p1.up.y==p2.pold.y)) //我在這里錯過{ return true; }//檢測 這條線是否有一條路徑相通if (CheckLine(p1.down,p2.up) ) { return true; }//檢測 上下 國為x 軸相等 所以不存在路徑//檢測 左右//x左pa=a;pb=b;for (x=0 ;x<=p1.left.x ;x++){pa.x=x;pb.x=x;if (CheckLine(pa,p1.left) && CheckLine(pb,p2.left ) && CheckLine(pa,pb)) { return true; }}//x右 pa=a;pb=b;for (x=p1.right.x;x<=18;x++){pa.x=x;pb.x=x;if (CheckLine(pa,p1.right ) && CheckLine(pb,p2.right ) && CheckLine(pa,pb)) { return true; }}} else//xy 坐標 都不相同 {{{{{{ {pa=a;pb=b;if (a.x>b.x) { // p2點 在 左 left// 找x軸路徑for (x=0;x<=p2.left.x;x++){pa.x=x;pb.x=x;if (CheckLine(pa,p1.left) && CheckLine(pa,pb) && CheckLine(pb,p2.left)) {return true; }} // end forfor (x=p2.right.x ;x<= p1.left.x;x++){pa.x=x;pb.x=x;if (CheckLine(p2.right,pb) && CheckLine(pa,pb)&& CheckLine(pa,p1.left)) {return true; }}for (x=p2.right.x;x<=18;x++){pa.x=x;pb.x=x;if (CheckLine(p1.right ,pa)&& CheckLine(p2.right ,pb) && CheckLine(pa,pb)) { return true; }}/////yyyyyyyyyyyyyyyyyyyy 找y軸路徑 由于是從上向下 搜索 所以p1.y>p2.ypa.x=a.x; pb.x=b.x; //初始化坐標 y漸變for ( y=0 ;y<=p1.up.y;y++) //1段 {pa.y=y;pb.y=y;if (CheckLine(pb,pa) && CheckLine(pa,p1.up) && CheckLine(pb,p2.up)) { return true;}} for (y=p1.down.y ;y<=p2.up.y;y++)//2段 {pa.y=y;pb.y=y;if (CheckLine(pb,pa)&& CheckLine(p1.down,pa) && CheckLine(pb,p2.up)) {return true;}}///for (y=p2.down.y ;y<=10 ;y++) //3段 {///pa.y=y;pb.y=y;if (CheckLine(pb,pa) && CheckLine(p1.down,pa) && CheckLine(p2.down,pb)) { return true; }}} elsep2點 在 右 right a.x>b.x {pa.y=a.y; pb.y=b.y; //初始化坐標for (x=0 ;x<= p1.left.x ;x++);{pa.x=x;pb.x=x;if (CheckLine(pa,pb)&& CheckLine(pa,p1.left)&& CheckLine(pb,p2.left)) {return true;}}/ for (x=p1.right.x ;x<=p2.left.x;x++){pa.x=x;pb.x=x;if (CheckLine(pa,pb)&& CheckLine(p1.right,pa)&& CheckLine(pb,p2.left)) {return true;}}///for (x=p2.right.x ;x<=18;x++){pa.x=0;pb.x=x;if (CheckLine(pa,pb) && CheckLine(p1.right,pa)&& CheckLine(p2.right,pb)) {return true; }}///yyyyyyyyyyyyyyyyyy y軸漸變pa.x =a.x; pb.x =b.x ; //初始化坐標if ((p1.up.y>=0) && (p1.up.y<=10)){for (y=0 ;y<=p1.up.y ;y++) //1段 {pa.y=y;pb.y=y;if (CheckLine(pa,pb)&& CheckLine(pa,p1.up) && CheckLine(pb,p2.up)) { return true; }}}// pa.x =a.x; pb.x =b.x ; //初始化坐標if ((p1.down.y<=10) && (p2.up.y>=0)) {for (y=p1.down.y ;y<=p2.up.y;y++) //2段 {pa.y=y;pb.y=y;if (CheckLine(pa,pb)&& CheckLine(p1.down,pa) && CheckLine(pb,p2.up)) { return true;} }}////pa.x =a.x; pb.x =b.x ; //初始化坐標if (p2.down.y <=10) {for ( y=p2.down.y;y<=10;y++) //3段 {pa.y=y;pb.y=y;if (CheckLine(pa,pb) && CheckLine(p1.down,pa)&& CheckLine(p2.down ,pb)) { return true; }} }}} //xy 坐標 都不相同 }}}}}}}}}return false;}//Cick2p() end在這里還自定義了一個類棋子類,它描述了它周圍的棋子的坐標屬性具體代碼:
/********************************************************************************* 1.取出原點棋子四周的棋子坐標類 POINT pold; //當前的棋子坐標 POINT up; //當前的棋子坐標上面的棋子坐標 POINT down; //當前的棋子坐標下面面的棋子坐標 POINT left; //當前的棋子坐標左邊的棋子坐標 POINT right;//當前的棋子坐標右邊的棋子坐標 *********************************************************************************/ class CChessPoint { public:POINT pold; //當前的棋子坐標POINT up; //當前的棋子坐標上面的棋子坐標POINT down; //當前的棋子坐標下面面的棋子坐標POINT left; //當前的棋子坐標左邊的棋子坐標POINT right;//當前的棋子坐標右邊的棋子坐標 CChessPoint(POINT pxy);virtual ~CChessPoint();}; //head file View Code 1 CChessPoint::CChessPoint(POINT pxy) 2 { 3 //初始化 4 up=pxy; 5 down=pxy; 6 left=pxy; 7 right=pxy; 8 pold=pxy; 9 //四周棋子的某一個方向的坐標改變了 10 up.y=pxy.y-1; 11 down.y=pxy.y+1; 12 left.x=pxy.x-1; 13 right.x=pxy.x+1; 14 15 }?
?在此你還看見一個函數CheckLien()它是用來解決兩點之間是否聯通具體代碼:
View Code 1 /************************************************************************ 2 //是否在棋盤上 的2個點之前是否有一條全為0的直線,如有true,否則false 3 這是兩種特殊的情況 同一行 或 同一列 4 ************************************************************************/ 5 6 bool CheckLine(POINT p1,POINT p2) { 7 //定義循環變量 8 int x, y, t; 9 //1.當兩個相同的點在一起的時候就返回true 10 if ((p1.x==p2.x)&&(p1.y==p2.y) && (chess[p1.y][p1.x]==0) && (chess[p2.y][p2.x]==0)) {return true; } 11 else 12 //判斷是否是棋盤棋子的有效數據 13 if ((p1.x<0) || (p1.x>18) || (p1.y<0) || (p1.y>10) || 14 (p2.x<0) || (p2.x>18) || (p2.y<0) || (p2.y>10) ) {return false; } 15 16 if (p1.y == p2.y) //當y相等的時候就遍歷以x做為循環變量 同行 17 { 18 if (p1.x>p2.x) 19 { 20 t=p1.x; 21 p1.x=p2.x; 22 p2.x=t; 23 } 24 for (x = p1.x; x <= p2.x; x++) 25 { 26 if((chess[p1.y][x])!=0) { return false; } 27 } 28 29 } 30 31 if (p1.x == p2.x)//當x相同的時候就遍歷以y做為循環變量 同列 32 { 33 if (p1.y>p2.y) 34 { 35 t=p1.y; 36 p1.y=p2.y; 37 p2.y=t; 38 } 39 for (y = p1.y; y <= p2.y; y++) 40 { 41 if((chess[y][p1.x])!=0) { return false; } 42 } 43 44 } 45 46 return true; 47 }
接下來就是Click2p()函數:
?
轉載于:https://www.cnblogs.com/-Jontaer/archive/2012/12/06/2806350.html
總結