QQ连连看外挂--基于LAScript

花了我不少时间哦,基于LAScript脚本的模拟程序,虽然程序还不是很完美,有一些小的BUG,^_^,我2天时间快赚了有3W分了。当然模拟程序还是有缺陷的,不像截取封包程序那样运行极快,几乎一开始就结束了,或者一开始给你定住,然后就眼睁睁看着自己被消灭。

以下是脚本程序
------------------------
--Read config----------------------------------------------------------
config = string.load("llk.ini","rb");
configs =table.loadList(config,"\n");
--end----------------------------------------------------------------------
--以下为系统参数设置的读取-----------------------------------
imgwidth=configs["IMG_WIDTH"]-0;
imgheight=configs["IMG_HEIGHT"]-0; --图片高
imgcolsize=configs["IMG_COLSIZE"]-0;
imgrowsize=configs["IMG_ROWSIZE"]-0; --19*11幅图片
offsetWidth=configs["OFFSET_WIDTH"]-0+configs["CROP_OFFSET_WIDTH"]-0;
offsetHeight=configs["OFFSET_HEIGHT"]-0;
diff=configs["NORMAL_DIFF"]-0;
diff1=configs["BLANK_DIFF"]-0;
diff2=configs["SAME_DIFF"]-0;
delay1=configs["PIC1_CLICK_DELAY"]-0;
delay2=configs["PIC2_CLICK_DELAY"]-0;
blankurl=configs["BLANK_IMAGE"];
--end------------------------------------------------------------
--全局变量定义-------------------------------------------
winleft=0;
wintop=0;
winright=0;
winbottom=0;
blankimg=nil;
fullimg=nil;
tab={};
imgs={};
hwnd=nil; --游戏窗口
--end-----------------------------------------------------------
--加载空白图片--------------------------------------------
function loadBlank(url)
local blank=image.new();
blank:load(url);
return blank;
end;
--end--------------------------------------------------------------
--本方法用来寻找是否可以相连------------------------
function findsame()
local same={};
local row=table.maxn(tab);
local col=table.maxn(tab[1]);
local visit={};
for i=1,row,1 do
for j=1,col,1 do
if(tab[j]>0) then
local index=tab[j];
if(visit[index]==nil) then
visit[index]={};
end;
table.insert(visit[index], {i,j});
end;
end;
end;
return visit;
end;
--end-----------------------------------------------------------
--在判断图片相同后的处理动作----------------------
function dosame(same)
local size=table.maxn(same);
local count=countLeft();
while(nStop() and count>0) do
for i=1,size,1 do
local items=same;
local isize=table.maxn(items);
for j=1,isize,1 do
if(items[j]~=nil) then
for k=j+1,isize,1 do
if(items[j]~=nil and items[k]~=nil) then
local result=tryconnect(items[j],items[k]);
if(result~=nil) then
if(connect(items[j],items[k])) then
items[j]=nil;
items[k]=nil;
count=count-1;
end;
--showpoint(result[1],result[2],result[3],result[4]);
end;
end;
end;
end;
end;
end;
delay(10);
end;
end;
--尝试连接----------------------------------------------------
function connect(pos1,pos2)
local r1=pos1[1];
local r2=pos2[1];
local c1=pos1[2];
local c2=pos2[2];
local offsetwidth1=(c1-0.5)*imgwidth;
local offsetheight1=(r1-0.5)*imgheight;
local offsetwidth2=(c2-0.5)*imgwidth;
local offsetheight2=(r2-0.5)*imgheight;
mouse.click(winleft+offsetWidth+offsetwidth1,wintop+offsetHeight+offsetheight1,true);
delay(delay1);
mouse.click(winleft+offsetWidth+offsetwidth2,wintop+offsetHeight+offsetheight2,true);
delay(delay2);
local img1=getImage1(c1,r1);
local img2=getImage1(c2,r2);
if(img1:test(imgs[r1][c1])<diff2 and img2:test(imgs[r2][c2])<diff2) then
return false;
end;
return true;
end;
--end--------------------------------------------------------------------

function aroundcheck(r1,c1,r2,c2)
if(r1==r2 and (c1-c2==1 or c1-c2==-1)) then
return true;
end;
if(c1==c2 and (r1-r2==1 or r1-r2==-1)) then
return true;
end;
return false;
end;
function tryconnect(pos1,pos2)
local r1=pos1[1];
local r2=pos2[1];
local c1=pos1[2];
local c2=pos2[2];

--循同行往前移动寻找路线
for i=c1-1,1,-1 do
if(i<1) then
break;
end;
if(i==c2 and r1==r2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
if(tab[r1]>0) then
break;
end;
local suc1=coltravel(i,r1,r2);
local suc2=rowtravel(r2,c2,i);
if(suc1 and suc2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
end;
--循同行往后移动寻找路线
for i=c1+1,imgcolsize,1 do
if(i>imgcolsize) then
break;
end;
if(i==c2 and r1==r2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
if(tab[r1]>0) then
break;
end;
local suc1=coltravel(i,r1,r2);
local suc2=rowtravel(r2,c2,i);
if(suc1 and suc2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
end;
----循同列往上移动寻找路线
for j=r1-1,1,1 do
if(j<1) then
break;
end;
if(j==r2 and c1==c2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
if(tab[j][c1]>0) then
break;
end;
local suc1=coltravel(c2,r2,j);
local suc2=rowtravel(j,c1,c2);
if(suc1 and suc2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
end;
--循同列往下移动寻找路线
for j=r1+1,imgrowsize,1 do
if(j>imgrowsize) then
break;
end;
if(j==r2 and c1==c2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
if(tab[j][c1]>0) then
break;
end;
local suc1=coltravel(c2,r2,j);
local suc2=rowtravel(j,c1,c2);
if(suc1 and suc2) then
logicremove(r1,c1,r2,c2);
return {r1,c1,r2,c2};
end;
end;
end;
function logicremove(r1,c1,r2,c2)
tab[r1][c1]=0;
tab[r2][c2]=0;
end;
function coltravel(c,r1,r2)
local step=1;
if(r1==r2) then
return true;
elseif(r1>r2 ) then
step=-1;
else
step=1;
end;
for i=r1+step,r2,step do
if(tab[c]>0) then
return false;
end;
end;
return true;
end;
function rowtravel(r,c1,c2)
local step=1;
if(c1==c2) then
return true;
elseif(c1>c2 ) then
step=-1;
else
step=1;
end;
for i=c1+step,c2,step do
if(tab[r]>0) then
return false;
end;
end;
return true;
end;
function printresult(result)
local size=table.maxn(result);
for i=1,size,1 do
showpoint(result[1],result[2],result[3],result[4]);
end;
end;
function showpoint(x1,y1,x2,y2)
win.messageBox("["..x1..","..y1.."] ["..x2..","..y2.."]");
end;
function getImage(fullimg,x,y)
local ileft=offsetWidth+(x-1)*imgwidth+3;
local itop=offsetHeight+(y-1)*imgheight+4;
local iright=offsetWidth+x*imgwidth-4;
local ibottom=offsetHeight+y*imgheight-5;
local tmp=image.new(fullimg);
tmp:Crop(ileft,itop,iright,ibottom);
return tmp;
end;
function getImage1(x,y)
local ileft=offsetWidth+(x-1)*imgwidth+3;
local itop=offsetHeight+(y-1)*imgheight+4;
local iright=offsetWidth+x*imgwidth-4;
local ibottom=offsetHeight+y*imgheight-5;
local tmp=image.new();
image.capture(tmp,hwnd,ileft,itop,imgwidth-7,imgheight-9);
return tmp;
end;
function countLeft()
local count=0;
for i=1,imgrowsize,1 do
for j=1,imgcolsize,1 do
if(tab[j]>0) then
count=count+1;
end;
end;
end;
return count;
end;
------------------------------------
--辨识图片是否已经存在---------
sample={};
imgIdentify=function(tmpimg)
if(blankfound==false) then
if(tmpimg:test(blankimg)<diff1) then
blankimg=tmpimg;
blankfound=true;
return 0;
end;
end;
if(blankfound==true) then
if(tmpimg:test(blankimg)<diff) then
return 0;
end;
end;
local count=table.maxn(sample);
for i=1,count,1 do
if(sample:test(tmpimg)<diff) then --比指定的差异度小,判定为相同的图片
return i;
end;
end
sample[count+1]=tmpimg;
return count+1;
end;
------------------------------------
--显示图片对应的数字情况----
imageShow=function()
end;
------------------------------
--获取窗口的整幅画面------------------------------------------------------------
function getFullImage()
local winname="KYODAI~1.EXE";
hwnd=win.fromFile(winname,"","连连看");
winleft,wintop,winright,winbottom=win.getRect(hwnd);
local img =image.new();
image.capture(img,hwnd,0,0,0,0);
return img;
end;
--end----------------------------------------------------------------------------------
--图片转换为数字标识-----------------------------------------------------------
function image2num()
for i=1,imgrowsize,1 do
tab={};
imgs={};
for j=1,imgcolsize,1 do
--tmp:paint(ileft,itop,29,33);
--tmp:save("d:\\"..i..j..".png");
local tmp=getImage(fullimg,j,i);
tab[j]=imgIdentify(tmp);
imgs[j]=tmp;
end;
end;
end;
--end----------------------------------------------------------------------------------
function finish()
image.del(fullimg);
fullimg=image.new();
image.capture(fullimg,hwnd,0,0,0,0);
local count=0;
for i=1,imgrowsize,1 do
for j=1,imgcolsize,1 do
local img=getImage(fullimg,j,i);
if(img:test(blankimg)>diff1) then
count=count+1;
end;
end;
end;
if(count>0) then
image2num();
local visit=findsame();
end;
end;
function start()
blankimg=loadBlank(blankurl);
--blankimg:paint(100,100,40,40);
blankfound=false;
fullimg=getFullImage();
image2num();
local visit=findsame();
dosame(visit);
--finish();
collectgarbage();
end;
--启动程序-------------------------------
start();
--end--------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值