怎么在程序里判断围棋软件进程已经走子(行棋)
如何在程序里判断围棋软件进程已经走子(行棋)?
我编了一个围棋连线程序,可以比较两款围棋软件的棋力,让它们自动下棋,我在一旁观看。我主要用Canvas.Pixels[x,y]来捕获软件的行棋点。捕获前,我用SetForegroundWindow(handle)把行棋窗口置顶,用SetCursorPos(x,y)走子,然后等待。
现在遇到一个问题,设置等待的时间。等待的时间太短,软件还没行棋,返回本程序的话,围棋软件就停止不动了,本程序也挂了。等待的时间太长,虽然不会有问题,但是太浪费时间。
当我用SetForegroundWindow(handle)函数把其中一个围棋软件窗口设为当前窗口,并且用模拟鼠标按键的方式走子后,在等待软件走子的过程中,如何能捕捉了它已经走子,然后返回连线程序,而不一定非要等待固定的时间呢?
围棋软件1 <-------> 连线程序<-------->围棋软件2
SetForegroundWindow(hd); //将某一围棋进程设为当前进程;
……
SetCursorPos(x,y);//先指定鼠标点击的坐标
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//左键按下
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//左键起来
sleep(20000); //等等20秒,等围棋软件思考并走子。
……?
Application.BringToFront;//这个句子必须要在当前围棋进程已经走子才有效,否则程序就挂了。
a[m,n] := Canvas.Pixels[px,py];
……
我要修改的就是sleep(20000)这一句。如果我能判断出当前围棋进程已经走子了,就不再继续等待而执行下一句了。
有兴趣的编程高手可以进来参与讨论一下么?
------解决方案--------------------
不懂你的机制,仅仅就sleep(20000)
可以写个函数:
我编了一个围棋连线程序,可以比较两款围棋软件的棋力,让它们自动下棋,我在一旁观看。我主要用Canvas.Pixels[x,y]来捕获软件的行棋点。捕获前,我用SetForegroundWindow(handle)把行棋窗口置顶,用SetCursorPos(x,y)走子,然后等待。
现在遇到一个问题,设置等待的时间。等待的时间太短,软件还没行棋,返回本程序的话,围棋软件就停止不动了,本程序也挂了。等待的时间太长,虽然不会有问题,但是太浪费时间。
当我用SetForegroundWindow(handle)函数把其中一个围棋软件窗口设为当前窗口,并且用模拟鼠标按键的方式走子后,在等待软件走子的过程中,如何能捕捉了它已经走子,然后返回连线程序,而不一定非要等待固定的时间呢?
围棋软件1 <-------> 连线程序<-------->围棋软件2
SetForegroundWindow(hd); //将某一围棋进程设为当前进程;
……
SetCursorPos(x,y);//先指定鼠标点击的坐标
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//左键按下
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//左键起来
sleep(20000); //等等20秒,等围棋软件思考并走子。
……?
Application.BringToFront;//这个句子必须要在当前围棋进程已经走子才有效,否则程序就挂了。
a[m,n] := Canvas.Pixels[px,py];
……
我要修改的就是sleep(20000)这一句。如果我能判断出当前围棋进程已经走子了,就不再继续等待而执行下一句了。
有兴趣的编程高手可以进来参与讨论一下么?
------解决方案--------------------
不懂你的机制,仅仅就sleep(20000)
可以写个函数:
- Delphi(Pascal) code
mysleep(ms) begin while ms>0 do begin sleep(100); application.processmessages; dec(ms,100); end; end;
------解决方案--------------------
截棋盘图,判断图片是否变化
------解决方案--------------------
如果是我作,我会选择以下方法之一
1.一般来讲,对方的程序会这么设计,
计算该走哪个位置(var 位置...)
显示棋子(位置...)
Hook显示位置即可,这需要调试目标程序找到Hook点
2.通过内存搜索软件,搜索棋面的位置表,这个肯定有的,而且通常会是固定地址(就是全局变量)
围棋软件,90%都是定义的19*19个byte来保存
搜索到之后,通过ReadProcessMemory比较一下即可知道当前棋面的情况