Java实现的打地鼠游戏
import java.awt.Cursor; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.Random; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.Timer; public class HitMouse extends JFrame implements ActionListener,MouseListener{ boolean isOver=false;//设置标记,游戏是否结束 private String dir="./images/";//图片目录,当前工程下 JLabel jlbMouse;//地鼠 Timer timer;//时间定时器 Random random;//随机数对象,即生成地鼠的位置 int delay=1100;//延迟时间 Toolkit tk; Image image; Cursor myCursor; JLabel showNum,currentGrade,hitNum; int showNumber=0,hitNumber=0,currentGrades=1; public HitMouse(){ super("打地鼠"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setSize(449, 395); this.setLocationRelativeTo(null);//设置窗口在屏幕中心 setbackground();//设置背景 this.getContentPane().setLayout(null);//设置框架布局模式为空,只有这样,才能知道图片的真正位置 //设置鼠标为锤子图片 tk = Toolkit.getDefaultToolkit(); image = tk.createImage(dir+"chui1.png"); myCursor = tk.createCustomCursor(image, new Point(10,10), "xxx"); this.setCursor(myCursor); setMessage();//设置一些提示信息 //在背景图片的基础上设置地鼠图片 ImageIcon imageMouse = new ImageIcon(dir+"dishu.png"); jlbMouse = new JLabel(imageMouse); jlbMouse.setSize(80,80); this.getContentPane().add(jlbMouse); jlbMouse.setVisible(false); jlbMouse.addMouseListener(this);//添加鼠标监听 //定时器 timer = new Timer(delay,this); random = new Random(); timer.start(); addMenu();//添加菜单 this.setResizable(false);//设置窗口大小不能改变 this.setVisible(true); } private void addMenu() { JMenuBar menubar = new JMenuBar(); this.setJMenuBar(menubar); JMenu game = new JMenu("游戏"); JMenuItem jitemNew = new JMenuItem("新游戏"); jitemNew.setActionCommand("new"); jitemNew.addActionListener(this); JMenuItem jitemPause = new JMenuItem("暂停"); jitemPause.setActionCommand("pause"); jitemPause.addActionListener(this); JMenuItem jitemExit = new JMenuItem("退出"); jitemExit.setActionCommand("exit"); jitemExit.addActionListener(this); game.add(jitemNew); game.add(jitemPause); game.addSeparator();//菜单里设置分隔线 game.add(jitemExit); menubar.add(game); } private void setbackground() { ((JPanel)(this.getContentPane())).setOpaque(false);//如果为 true,则该组件绘制其边界内的所有像素。否则该组件可能不绘制部分或所有像素,从而允许其底层像素透视出来。 ImageIcon bgImage = new ImageIcon("images/beijing.jpg"); JLabel bgLabel = new JLabel(bgImage); bgLabel.setBounds(0, 25, bgImage.getIconWidth(), bgImage.getIconHeight()); this.getLayeredPane().add(bgLabel, new Integer(Integer.MIN_VALUE));//设置背景图片的层次最低 } private void setMessage() { ImageIcon showNumb = new ImageIcon(dir+"chuxiancishu.png"); JLabel showLabel = new JLabel(showNumb); showLabel.setBounds(8, 8, 92, 80); this.getContentPane().add(showLabel); showNum = new JLabel("0"); showNum.setBounds(110, 8, 92, 80); this.getContentPane().add(showNum); ImageIcon hitNumb = new ImageIcon(dir+"chuxiancishu.png"); JLabel hitLabel = new JLabel(hitNumb); hitLabel.setBounds(148, 8, 92, 80); this.getContentPane().add(hitLabel); hitNum = new JLabel("0"); hitNum.setBounds(251, 8, 92, 80); this.getContentPane().add(hitNum); ImageIcon grade = new ImageIcon(dir+"dangqiandengji.png"); JLabel gradeLabel = new JLabel(grade); gradeLabel.setBounds(288, 8, 92, 80); this.getContentPane().add(gradeLabel); currentGrade = new JLabel("1"); currentGrade.setBounds(391, 8, 92, 80); this.getContentPane().add(currentGrade); } public static void main(String[] args) { new HitMouse(); } public void actionPerformed(ActionEvent e) { //对菜单项注册事件监听 if(e.getSource() instanceof JMenuItem){ menuItemFun(e); } int ran=random.nextInt(9);//随机生成一个0~9(不包括9)的随机数 ImageIcon imageMouse = new ImageIcon(dir+"dishu.png");//保证每次随机生成的地鼠图片都是为没被打时的图片 jlbMouse.setIcon(imageMouse); switch(ran){ case 0:jlbMouse.setLocation(55, 63);break; case 1:jlbMouse.setLocation(321, 204);break; case 2:jlbMouse.setLocation(184, 204);break; case 3:jlbMouse.setLocation(47, 203);break; case 4:jlbMouse.setLocation(297, 133);break; case 5:jlbMouse.setLocation(161, 133);break; case 6:jlbMouse.setLocation(21, 133);break; case 7:jlbMouse.setLocation(310, 63);break; case 8:jlbMouse.setLocation(185, 63);break; } jlbMouse.setVisible(true); showNumber++; showNum.setText(""+showNumber); if( !gamePlan() ){//判断游戏是否结束,并显示游戏进程 timer.stop(); } } //监听菜单功能功能 private void menuItemFun(ActionEvent e) { if (e.getActionCommand().equalsIgnoreCase("new")) {//新游戏 timer.stop(); showNumber=0; hitNumber=0; currentGrades=1; delay=1000; isOver=false; showNum.setText(""+showNumber); hitNum.setText(""+hitNumber); currentGrade.setText(""+currentGrades); timer = new Timer(delay,this); timer.start(); } if (e.getActionCommand().equalsIgnoreCase("exit")) {//退出 System.exit(EXIT_ON_CLOSE); } if (e.getActionCommand().equalsIgnoreCase("pause")) {//暂停 timer.stop(); JOptionPane.showMessageDialog(this, "继续请按“确定”"); timer.start(); } } private boolean gamePlan() { if(showNumber-hitNumber > 8){ JOptionPane.showMessageDialog(this, "Game Over !"); isOver=true; return false; } if(hitNumber > 5){ hitNumber=0; showNumber=0; currentGrades++; if(delay>100){ delay-=50; }else if(delay>=500){ delay=500; } timer.setDelay(delay); hitNum.setText(""+hitNumber); showNum.setText(""+showNumber); currentGrade.setText(""+currentGrades); } return true; } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { if(isOver){ return ; } image = tk.createImage(dir+"chui2.png"); myCursor = tk.createCustomCursor(image, new Point(10,10), "xxx"); this.setCursor(myCursor);//鼠标按下时,鼠标显示打下去的图片,模拟打的动作 //如果打中地鼠,则地鼠换成被打中的图片,模拟地鼠被打 if(e.getSource()==jlbMouse){ ImageIcon imageIconHit = new ImageIcon(dir+"datou.png"); jlbMouse.setIcon(imageIconHit); jlbMouse.setVisible(true); } hitNumber++; hitNum.setText(""+hitNumber); } public void mouseReleased(MouseEvent e) { if(isOver){ return ; } //当鼠标放松以后,鼠标变回原来没按下时的图片 image = tk.createImage(dir+"chui1.png"); myCursor = tk.createCustomCursor(image, new Point(10,10), "xxx"); this.setCursor(myCursor); } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } }