自动【打地鼠】游戏的JAVA应用程序制作的思路(给路大神请帮忙)

我不明白 发布于 2013/02/21 14:04
阅读 2K+
收藏 0

自动打地鼠的JAVA应用程序

最近接触了一个游戏叫打地鼠

这个游戏在windows的一个窗口中单独运行的。

这个小地鼠在不同的洞穴钻出来,我们要拿锤子不断的去砸他才可以得分,能否通过JAVA来实现一个窗口内自动找图然后模拟鼠标点击这样一个应用程序呢?希望大家给一些思路,看看应该用JAVA中的哪些API来完成这项工作。

而且要求是这个打地鼠游戏的windows窗口不管是当前状态还是最小化,都不影响自动打地鼠程序的运行,也就是支持后台运行吧。

当前遇到一些问题没有什么思路希望各位高手指点一二。

1、操作系统中可能开有不同的windows窗口,可能有计算器、记事本或者其他程序,那么我们如何来准确有效的抓取这个打地鼠的窗口句柄呢?然后只针对这个句柄所在的窗口进行相应的操作?

2、如何在打地鼠游戏窗口内进行目标图片的搜索和比对?是利用图片截取保存以后与目标图片进行对比还是进行窗口区域像素逐行搜索比较好?或者还有其他更好的方法吗?(这个搜索比对的过程中利用哪些API?)

3、图片比对成功后模拟鼠标左键双击相应位置,这个应该如何来实现呢?(利用哪些API程序)

现在头脑比较混乱希望高手给一些思路,是不是JAVA做这样的应用不在行呢?

加载中
0
0
抛出异常的爱
抛出异常的爱

双击应该使用robot类

如果全屏或左上角对齐应该只需要轮询 几个坐标的 颜色就可以了.


我不明白
我不明白
您说的这种 屏幕左上角对齐的话 是不是指只能前台操作这个窗口?一旦这个窗口最小化了 就不能进行图像的判断了?
0
小耶果
小耶果

就冲这图文并茂,就回答一下吧:-)

1.FindWindow等API,根据窗口标题获取窗口Handle(还有很多类似函数)

2.直接检测像素边界轮廓,但不限于这个方法,有很多.但我从图片上来看,硕鼠的颜色像素明显区别于背景,可以做直接的颜色判断.或者改变思路,如果榔头挥空锤不扣分的话,就8个洞都连续自动点击好了.(洞是固定相对坐标,很好定位).

3.PostMessage(WM_LBUTTONDOWN & WM_LBUTTONUP)或Mouse_Event API(模拟鼠标点击,窗口不能最小化且你也不能操作鼠标).推荐前者,不受游戏窗口状态影响.但是有一点,有些游戏是不处理Windows的鼠标消息(比如使用DirectX Input Api),这时就只能后者了.具体还是自己实践一下.

看画面这个游戏似乎是Flash制作的?

我不明白
我不明白
回复 @小耶果 : 谢谢您能耐心的回复我这些对我有用的信息 给与我很大的帮助 我这几天按照您说的这个思路弄弄看看 有什么疑问 再向您讨教
小耶果
小耶果
回复 @我不明白 : 我所有的假设都是用C/C++来实现,当然Java也可以,只是我对Java写桌面应用不熟.
我不明白
我不明白
回复 @小耶果 : 您有这方面的实例程序代码吗? 类似的就可以。还有要实现这个应用程序必须用JN1吗?
小耶果
小耶果
简单的方法是:先截取每个老鼠的图片,然后对于每个老鼠的图片做颜色取样,比如左上,左下,右上,右下,中间各取一个颜色点.保存.判断时比对颜色点,(可以缩小比对范围,比如从最左上老鼠洞开始到最右下老鼠洞结束)比对,一旦找到第一个符合要求的点,再根据坐标偏移比对余下四个. 接下来你也就知道了.
我不明白
我不明白
忘记说了 我这个截图 有一些不全面 这个打地鼠的游戏每次从不同鼠洞中钻出来的老鼠颜色和样式还有区别,这是我很郁闷的一点。难道要保存很多个地鼠的BMP图片进行判断?
0
liuleidefeng
liuleidefeng
用java做这一类的东西的确是有些麻烦了。模拟点击的话可以用robot类,也可以用windows API相关的函数,第一个问题:区分窗口的话,用窗口的 标题和类名一般就可以区分。后面的两个问题接触不多,不敢多说。做外挂之类的东西,用按键精灵之类的东西个人感觉方便的多
我不明白
我不明白
是啊 都说什么VB VC++ C# 做这类的东西比较容易一些 问题是 这不是就想学JAVA吗? 通过一个问题能学习掌握很多方面的知识
0
我不明白
我不明白

引用来自“小耶果”的答案

就冲这图文并茂,就回答一下吧:-)

1.FindWindow等API,根据窗口标题获取窗口Handle(还有很多类似函数)

2.直接检测像素边界轮廓,但不限于这个方法,有很多.但我从图片上来看,硕鼠的颜色像素明显区别于背景,可以做直接的颜色判断.或者改变思路,如果榔头挥空锤不扣分的话,就8个洞都连续自动点击好了.(洞是固定相对坐标,很好定位).

3.PostMessage(WM_LBUTTONDOWN & WM_LBUTTONUP)或Mouse_Event API(模拟鼠标点击,窗口不能最小化且你也不能操作鼠标).推荐前者,不受游戏窗口状态影响.但是有一点,有些游戏是不处理Windows的鼠标消息(比如使用DirectX Input Api),这时就只能后者了.具体还是自己实践一下.

看画面这个游戏似乎是Flash制作的?

十分感谢您的回答,如果这个游戏我开了很多个窗口 那么窗口标题的名字是一样的话 应该如何进行区分呢?有没有可以修改窗口标题的函数?然后我通过查询相同窗口标题的进程ID号  以后 把 这不同的ID+原始窗口标题  这样就很容易能区分出来 对哪个句柄的窗口进行操作了。
打地鼠游戏 5642
打地鼠游戏 6486
打地鼠游戏 5363
我只是打一个比方  每个窗口名称不同了 而且有唯一标识 这样是不是就能很好的对单独某一个窗口进行操作了?
我只是一个设想 具体行不行还希望您多多指点
小耶果
小耶果
另外你想通过"外挂"来学Java,你选错练手的题材了.
小耶果
小耶果
回复 @我不明白 : 我的意思是你的"外挂"用CreateProcess来启动游戏就能方便的知道ProcessID.而用户双击鼠标来启动游戏这种方式则要通过枚举窗口了.
我不明白
我不明白
回复 @小耶果 : 问题是如何来判断这个游戏启动是通过Createprocess来启动的呢?
小耶果
小耶果
如果是做外挂,游戏是通过用户双击,你可以EnumWindow来取出所有Process Instance,然后后续处理...
小耶果
小耶果
如果前提是通过CreateProcess来启动游戏程序,那么就可以获取ProcessID,至于如何通过ProcessID获取主窗口的Handle,网上搜搜,有很多这样的文章.
下一页
0
小熊猫大暴走
小熊猫大暴走

错误,这里根本不需要取像素值。取像素值是为了获得地鼠的位置,其实这方法太正统了。

最简单的方法就是取得窗口后,直接发送鼠标点击消息,鼠标的位置不能是一个点,而是很多点 ,这些点每隔一段距离,但是要覆盖整个窗口。

我不明白
我不明白
回复 @抛出异常的爱 : 如果这样做的话 那就失去这个软件的意义了,还是想通过智能判断来完成这个程序的制作
抛出异常的爱
抛出异常的爱
他说就 是一秒 点击 N个点 不间段的点....不需要找到老鼠坐标
我不明白
我不明白
不太明白您的思路,获取像素点是为了判断屏幕什么位置存在这个地鼠,如果存在类似的像素点 那么 我们就用鼠标加上一定的偏移量来点击 屏幕中的某个位置。我的理解是这样的
返回顶部
顶部