C++连连看外挂
?
自己寫的一個(gè)鼠鍵模擬點(diǎn)擊屏幕上的具體坐標(biāo)的小玩意兒..
?
/***********************************************************************************************
?算法設(shè)計(jì)
?1.讀取更新的棋盤數(shù)據(jù)
?2.遍歷棋盤數(shù)據(jù) 找到相同的棋子
?3.判斷兩點(diǎn)是否能消除
?4.如果能消除
?5.那么就模擬鼠標(biāo)點(diǎn)擊這兩個(gè)點(diǎn)
? 
************************************************************************************************/
這是整體程序架構(gòu);其中的Check2p, Click2p是兩個(gè)重要的函數(shù);前者是檢查兩點(diǎn)棋子是否可以消除;如果可以消除就調(diào)用Clik2P它的作用就是模擬一次點(diǎn)擊可以消除的這兩顆棋子,具體代碼如下:
/************************************************************************************************檢查兩點(diǎn)是否可以消除 樁模塊 a、在這一對(duì)棋子間找相通路徑的原理b、(Check2p函數(shù))框架代碼c、(CheckLine函數(shù))檢測(cè)2點(diǎn)是否有連通LineNull(p1,p2); //是否在棋盤上 的2個(gè)點(diǎn)之前是否有一條全為0的直線,如有true,否則false1、剪貼游戲圖;Y坐標(biāo)相同的情況下 p1,p2 lineNull(p1.right,p2.left) //可消除X坐標(biāo)相同的情況下 p1,p2LineNull(p1.down,p2.up) //可消除************************************************************************************************/bool Check2p(POINT a,POINT b){CChessPoint p1(a),p2(b);POINT pa,pb;//轉(zhuǎn)角點(diǎn)int x,y;// 如果2點(diǎn)為同一點(diǎn) 則返回假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坐標(biāo) 相同if (a.y==b.y) { // 2點(diǎn)在左右相鄰 //問題所在if ((p1.right.x==p2.pold.x) || (p1.left.x==p2.pold.x)) { return true; }//檢測(cè) 這條線是否有一條路徑相通if (CheckLine(p1.right,p2.left )) {return true; }//檢測(cè) 上下//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; } }//檢測(cè) 左右 因?yàn)?y軸相等,所以不存在左右路徑 } else//縱向一條線 x 坐標(biāo) 相同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)) //我在這里錯(cuò)過{ return true; }//檢測(cè) 這條線是否有一條路徑相通if (CheckLine(p1.down,p2.up) ) { return true; }//檢測(cè) 上下 國為x 軸相等 所以不存在路徑//檢測(cè) 左右//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 坐標(biāo) 都不相同 {{{{{{ {pa=a;pb=b;if (a.x>b.x) { // p2點(diǎn) 在 左 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; //初始化坐標(biāo) 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點(diǎn) 在 右 right a.x>b.x {pa.y=a.y; pb.y=b.y; //初始化坐標(biāo)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 ; //初始化坐標(biāo)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 ; //初始化坐標(biāo)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 ; //初始化坐標(biāo)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 坐標(biāo) 都不相同 }}}}}}}}}return false;}//Cick2p() end在這里還自定義了一個(gè)類棋子類,它描述了它周圍的棋子的坐標(biāo)屬性具體代碼:
/********************************************************************************* 1.取出原點(diǎn)棋子四周的棋子坐標(biāo)類 POINT pold; //當(dāng)前的棋子坐標(biāo) POINT up; //當(dāng)前的棋子坐標(biāo)上面的棋子坐標(biāo) POINT down; //當(dāng)前的棋子坐標(biāo)下面面的棋子坐標(biāo) POINT left; //當(dāng)前的棋子坐標(biāo)左邊的棋子坐標(biāo) POINT right;//當(dāng)前的棋子坐標(biāo)右邊的棋子坐標(biāo) *********************************************************************************/ class CChessPoint { public:POINT pold; //當(dāng)前的棋子坐標(biāo)POINT up; //當(dāng)前的棋子坐標(biāo)上面的棋子坐標(biāo)POINT down; //當(dāng)前的棋子坐標(biāo)下面面的棋子坐標(biāo)POINT left; //當(dāng)前的棋子坐標(biāo)左邊的棋子坐標(biāo)POINT right;//當(dāng)前的棋子坐標(biāo)右邊的棋子坐標(biāo) 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 //四周棋子的某一個(gè)方向的坐標(biāo)改變了 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 }?
?在此你還看見一個(gè)函數(shù)CheckLien()它是用來解決兩點(diǎn)之間是否聯(lián)通具體代碼:
View Code 1 /************************************************************************ 2 //是否在棋盤上 的2個(gè)點(diǎn)之前是否有一條全為0的直線,如有true,否則false 3 這是兩種特殊的情況 同一行 或 同一列 4 ************************************************************************/ 5 6 bool CheckLine(POINT p1,POINT p2) { 7 //定義循環(huán)變量 8 int x, y, t; 9 //1.當(dāng)兩個(gè)相同的點(diǎn)在一起的時(shí)候就返回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 //判斷是否是棋盤棋子的有效數(shù)據(jù) 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) //當(dāng)y相等的時(shí)候就遍歷以x做為循環(huán)變量 同行 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)//當(dāng)x相同的時(shí)候就遍歷以y做為循環(huán)變量 同列 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()函數(shù):
?
轉(zhuǎn)載于:https://www.cnblogs.com/-Jontaer/archive/2012/12/06/2806350.html
總結(jié)
 
                            
                        - 上一篇: Java随机函数
- 下一篇: svn取消文件夹图标_TortoiseS
