java打地鼠游戏代码怎样在背景图显示打中的次数

自动【打地鼠】游戏的JAVA应用程序制作的思路(给路大神请帮忙)
<a data-traceid="question_detail_above_text_l&&
自动打地鼠的JAVA应用程序
最近接触了一个游戏叫打地鼠
这个游戏在windows的一个窗口中单独运行的。
这个小地鼠在不同的洞穴钻出来,我们要拿锤子不断的去砸他才可以得分,能否通过JAVA来实现一个窗口内自动找图然后模拟鼠标点击这样一个应用程序呢?希望大家给一些思路,看看应该用JAVA中的哪些API来完成这项工作。
而且要求是这个打地鼠游戏的windows窗口不管是当前状态还是最小化,都不影响自动打地鼠程序的运行,也就是支持后台运行吧。
当前遇到一些问题没有什么思路希望各位高手指点一二。
1、操作系统中可能开有不同的windows窗口,可能有计算器、记事本或者其他程序,那么我们如何来准确有效的抓取这个打地鼠的窗口句柄呢?然后只针对这个句柄所在的窗口进行相应的操作?
2、如何在打地鼠游戏窗口内进行目标图片的搜索和比对?是利用图片截取保存以后与目标图片进行对比还是进行窗口区域像素逐行搜索比较好?或者还有其他更好的方法吗?(这个搜索比对的过程中利用哪些API?)
3、图片比对成功后模拟鼠标左键双击相应位置,这个应该如何来实现呢?(利用哪些API程序)
现在头脑比较混乱希望高手给一些思路,是不是JAVA做这样的应用不在行呢?
双击应该使用robot类
如果全屏或左上角对齐应该只需要轮询 几个坐标的 颜色就可以了.
--- 共有 1 条评论 ---
您说的这种 屏幕左上角对齐的话
是不是指只能前台操作这个窗口?一旦这个窗口最小化了 就不能进行图像的判断了?
就冲这图文并茂,就回答一下吧:-)
1.FindWindow等API,根据窗口标题获取窗口Handle(还有很多类似函数)
2.直接检测像素边界轮廓,但不限于这个方法,有很多.但我从图片上来看,硕鼠的颜色像素明显区别于背景,可以做直接的颜色判断.或者改变思路,如果榔头挥空锤不扣分的话,就8个洞都连续自动点击好了.(洞是固定相对坐标,很好定位).
3.PostMessage(WM_LBUTTONDOWN & WM_LBUTTONUP)或Mouse_Event API(模拟鼠标点击,窗口不能最小化且你也不能操作鼠标).推荐前者,不受游戏窗口状态影响.但是有一点,有些游戏是不处理Windows的鼠标消息(比如使用DirectX Input Api),这时就只能后者了.具体还是自己实践一下.
看画面这个游戏似乎是Flash制作的?
--- 共有 5 条评论 ---
: 谢谢您能耐心的回复我这些对我有用的信息 给与我很大的帮助
我这几天按照您说的这个思路弄弄看看 有什么疑问 再向您讨教
: 我所有的假设都是用C/C++来实现,当然Java也可以,只是我对Java写桌面应用不熟.
: 您有这方面的实例程序代码吗? 类似的就可以。还有要实现这个应用程序必须用JN1吗?
简单的方法是:先截取每个老鼠的图片,然后对于每个老鼠的图片做颜色取样,比如左上,左下,右上,右下,中间各取一个颜色点.保存.判断时比对颜色点,(可以缩小比对范围,比如从最左上老鼠洞开始到最右下老鼠洞结束)比对,一旦找到第一个符合要求的点,再根据坐标偏移比对余下四个.
接下来你也就知道了.
忘记说了 我这个截图 有一些不全面 这个打地鼠的游戏每次从不同鼠洞中钻出来的老鼠颜色和样式还有区别,这是我很郁闷的一点。难道要保存很多个地鼠的BMP图片进行判断?
用java做这一类的东西的确是有些麻烦了。模拟点击的话可以用robot类,也可以用windows API相关的函数,第一个问题:区分窗口的话,用窗口的 标题和类名一般就可以区分。后面的两个问题接触不多,不敢多说。做外挂之类的东西,用按键精灵之类的东西个人感觉方便的多
--- 共有 1 条评论 ---
是啊 都说什么VB VC++
做这类的东西比较容易一些
问题是 这不是就想学JAVA吗? 通过一个问题能学习掌握很多方面的知识
引用来自“小耶果”的答案 就冲这图文并茂,就回答一下吧:-)
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
我只是打一个比方 &每个窗口名称不同了 而且有唯一标识 这样是不是就能很好的对单独某一个窗口进行操作了?
我只是一个设想 具体行不行还希望您多多指点
--- 共有 6 条评论 ---
另外你想通过"外挂"来学Java,你选错练手的题材了.
: 我的意思是你的"外挂"用CreateProcess来启动游戏就能方便的知道ProcessID.而用户双击鼠标来启动游戏这种方式则要通过枚举窗口了.
: 问题是如何来判断这个游戏启动是通过Createprocess来启动的呢?
如果是做外挂,游戏是通过用户双击,你可以EnumWindow来取出所有Process Instance,然后后续处理...
如果前提是通过CreateProcess来启动游戏程序,那么就可以获取ProcessID,至于如何通过ProcessID获取主窗口的Handle,网上搜搜,有很多这样的文章.
错误,这里根本不需要取像素值。取像素值是为了获得地鼠的位置,其实这方法太正统了。
最简单的方法就是取得窗口后,直接发送鼠标点击消息,鼠标的位置不能是一个点,而是很多点 ,这些点每隔一段距离,但是要覆盖整个窗口。
--- 共有 3 条评论 ---
: 如果这样做的话 那就失去这个软件的意义了,还是想通过智能判断来完成这个程序的制作
他说就 是一秒 点击 N个点 不间段的点....不需要找到老鼠坐标
不太明白您的思路,获取像素点是为了判断屏幕什么位置存在这个地鼠,如果存在类似的像素点
那么 我们就用鼠标加上一定的偏移量来点击 屏幕中的某个位置。我的理解是这样的>> 用JAVA写的打地鼠游戏,自己看看吧需要加点图片就可以玩了
用JAVA写的打地鼠游戏,自己看看吧需要加点图片就可以玩了
所属分类:
下载地址:
hh.rar文件大小:15.15 kB
分享有礼! 》
请点击右侧的分享按钮,把本代码分享到各社交媒体。
通过您的分享链接访问Codeforge,每来2个新的IP,您将获得0.1 积分的奖励。
通过您的分享链接,每成功注册一个用户,该用户在Codeforge上所获得的每1个积分,您都将获得0.2 积分的分成奖励。
用JAVA写的打地鼠游戏,自己看看吧需要加点图片就可以玩了-Written using JAVA hamster playing games, let&#39 s see their own need to add a little picture can be played
Sponsored links
源码文件列表
温馨提示: 点击源码文件名可预览文件内容哦 ^_^
.project378.00 B16-11-09 13:25
.classpath226.00 B16-11-09 13:25
12.73 kB16-11-09 14:07
data.dat131.00 B23-11-09 14:25
mouse1.gif1.51 kB16-11-09 14:23
cursor1.gif1.66 kB16-11-09 14:25
MyCursor.class892.00 B17-11-09 18:10
Game$1.class692.00 B17-11-09 18:10
mouse.class383.00 B17-11-09 18:10
Game.class11.10 kB17-11-09 18:10
Game$2.class1.02 kB17-11-09 18:10
&hh&0.00 B16-11-09 13:25
(提交有效评论获得积分)
评论内容不能少于15个字,不要超出160个字。
评价成功,多谢!
下载hh.rar
CodeForge积分(原CF币)全新升级,功能更强大,使用更便捷,不仅可以用来下载海量源代码马上还可兑换精美小礼品了
您的积分不足,优惠套餐快速获取 30 积分
10积分 / ¥100
30积分 / ¥200原价 ¥300 元
100积分 / ¥500原价 ¥1000 元
订单支付完成后,积分将自动加入到您的账号。以下是优惠期的人民币价格,优惠期过后将恢复美元价格。
支付宝支付宝付款
微信钱包微信付款
更多付款方式:、
您本次下载所消耗的积分将转交上传作者。
同一源码,30天内重复下载,只扣除一次积分。
鲁ICP备号-3 runtime:Elapsed:ms - init:0.1;find:27.6;t:37.4;tags:39.2;related:379.6;comment:93.2; 27.69
登录 CodeForge
还没有CodeForge账号?
Switch to the English version?
^_^"呃 ...
Sorry!这位大神很神秘,未开通博客呢,请浏览一下其他的吧【图文】打地鼠游戏_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
打地鼠游戏
阅读已结束,下载本文到电脑
想免费下载本文?
登录百度文库,专享文档复制特权,积分每天免费拿!
你可能喜欢谁会用java编写一个打地鼠游戏的代码???求解....
[问题点数:40分]
本版专家分:0
CSDN今日推荐
本版专家分:40
本版专家分:0
本版专家分:293
本版专家分:0
结帖率 100%
匿名用户不能发表回复!|
CSDN今日推荐Java游戏练习---打地鼠
先看一下样子吧
然后是代码
package cn.hncu.
import java.awt.C
import java.awt.D
import java.awt.F
import java.awt.G
import java.awt.I
import java.awt.P
import java.awt.T
import java.awt.event.ActionE
import java.awt.event.ActionL
import java.awt.event.MouseE
import java.awt.event.MouseL
import java.util.D
import java.util.R
import javax.swing.BorderF
import javax.swing.ImageI
import javax.swing.JF
import javax.swing.JL
import javax.swing.JOptionP
import javax.swing.JP
import javax.swing.SwingC
import javax.swing.T
import javax.swing.border.BevelB
public class HitMouse extends JFrame implements ActionListener, MouseListener{
private final String DIR = "images/";
private JLabel jlbM
private int delay=1000;
private Random r = new Random( new Date().getTime() );
private JLabel timesShowLabel,timesHitLabel,gradeL
private int timesShow=0,timesHit=0,grade=1;
private boolean isHit=false;
public HitMouse() {
setTitle("打地鼠");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocation(200, 200);
setSize(438, 375);
setResizable(false);
mySetCursor(1);
this.addMouseListener(this);
jlbMouse = new JLabel( new ImageIcon(DIR+"dishu.png"));
jlbMouse.setLocation(100, 100);
jlbMouse.setSize(80, 80);
getContentPane().add(jlbMouse);
jlbMouse.setVisible(false);
jlbMouse.addMouseListener(this);
timer = new Timer(delay,this);
timer.start();
JPanel panel = new JPanel();
panel.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel.setPreferredSize(new Dimension(438,375));
getContentPane().add(panel);
panel.setOpaque(false);
timesShowLabel = new JLabel("0", new ImageIcon(DIR+"chuxiancishu.png"), SwingConstants.CENTER);
timesShowLabel.setFont(new Font("幼圆", Font.BOLD, 20));
timesShowLabel.setSize(146, 40);
panel.add(timesShowLabel);
timesHitLabel = new JLabel("0", new ImageIcon(DIR+"dazhongcishu.png"), SwingConstants.CENTER);
timesHitLabel.setFont(new Font("幼圆", Font.BOLD, 20));
timesHitLabel.setSize(146, 40);
panel.add(timesHitLabel);
gradeLabel = new JLabel("1", new ImageIcon(DIR+"dangqiandengji.png"), SwingConstants.CENTER);
gradeLabel.setFont(new Font("幼圆", Font.BOLD, 20));
gradeLabel.setSize(146, 40);
panel.add(gradeLabel);
setVisible(true);
private void mySetCursor(int i) {
Toolkit tk = Toolkit.getDefaultToolkit();
Image img = null;
img = tk.createImage(DIR+"chui1.png");
img = tk.createImage(DIR+"chui2.png");
Cursor cursor = tk.createCustomCursor(img, new Point(10,10), "xyz");
setCursor(cursor);
private void setBak() {
ImageIcon bgImg = new ImageIcon(DIR+"beijing.jpg");
JLabel bgLabel = new JLabel(bgImg);
bgLabel.setBounds(0, 0, bgImg.getIconWidth(), bgImg.getIconHeight());
this.getLayeredPane().add(bgLabel, new Integer(Integer.MIN_VALUE) );
((JPanel)(this.getContentPane())).setOpaque(false);
public void actionPerformed(ActionEvent e) {
int pos = r.nextInt(9);
switch(pos){
jlbMouse.setLocation(56,63);break;
jlbMouse.setLocation(322,204);break;
jlbMouse.setLocation(185,204);break;
jlbMouse.setLocation(48,203);break;
jlbMouse.setLocation(298,133);break;
jlbMouse.setLocation(162,133);break;
jlbMouse.setLocation(22,133);break;
jlbMouse.setLocation(311,63);break;
jlbMouse.setLocation(186,63);
jlbMouse.setIcon(new ImageIcon(DIR+"dishu.png"));
jlbMouse.setVisible(true);
timesShow++;
timesShowLabel.setText(timesShow+"");
isHit=false;
if(timesShow&15){
int op = JOptionPane.showConfirmDialog(this, "太菜,挂了,还要再来一盘吗?!!!","Game Over",JOptionPane.YES_NO_OPTION);
if(op==JOptionPane.YES_OPTION){
mySetCursor(1);
delay=1000;
timesShow=0;
timesHit=0;
timesShowLabel.setText(""+timesShow);
timesHitLabel.setText(""+timesHit);
gradeLabel.setText(""+grade);
timer.start();
timer.stop();
public static void main(String[] args) {
new HitMouse();
public void mouseClicked(MouseEvent e) {
public void mousePressed(MouseEvent e) {
mySetCursor(2);
if(e.getSource()==jlbMouse && !isHit ){
isHit=true;
jlbMouse.setIcon( new ImageIcon(DIR+"datou.png"));
jlbMouse.setVisible(true);
timesHit++;
timesHitLabel.setText(""+timesHit);
Toolkit.getDefaultToolkit().beep();
if(timesHit&8){
delay -=190;
if(delay&100){
jlbMouse.setVisible(false);
timer.stop();
int op = JOptionPane.showConfirmDialog(this, "神啊,您已经打通关了,要重新来吗?","宇宙猛男",JOptionPane.YES_NO_OPTION);
if(op==JOptionPane.YES_OPTION){
delay=1000;
System.exit(0);
if(timer.isRunning()){
timer.stop();
jlbMouse.setVisible(false);
mySetCursor(1);
JOptionPane.showConfirmDialog(this, "游戏进入第"+grade+"关, 加油!!!","游戏升级",JOptionPane.CLOSED_OPTION);
timesShow=0;
timesHit=0;
timesShowLabel.setText(""+timesShow);
timesHitLabel.setText(""+timesHit);
gradeLabel.setText(""+grade);
timer.start();
public void mouseReleased(MouseEvent e) {
mySetCursor(1);
public void mouseEntered(MouseEvent e) {
public void mouseExited(MouseEvent e) {
private void demo() {
JLabel lb = new JLabel( new ImageIcon("images/a.gif"));
getContentPane().add(lb);
Toolkit t = Toolkit.getDefaultToolkit();
Image img = t.createImage("images/chui1.png");
Cursor cursor = t.createCustomCursor(img, new Point(5,5), "a");
setCursor(cursor);
JPanel p = new JPanel();
p.setOpaque(false);
JPanel p2 = new JPanel(){
public void print(Graphics g) {
这里是需要的图片
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 java打地鼠游戏 的文章

 

随机推荐