在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java实现的打地鼠游戏

2016-12-20 13:16| 发布者: zhangjf| 查看: 449| 评论: 0

摘要: 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; ...
  1. import java.awt.Cursor;
  2. import java.awt.Image;
  3. import java.awt.Point;
  4. import java.awt.Toolkit;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.awt.event.MouseEvent;
  8. import java.awt.event.MouseListener;
  9. import java.util.Random;
  10. import javax.swing.ImageIcon;
  11. import javax.swing.JFrame;
  12. import javax.swing.JLabel;
  13. import javax.swing.JMenu;
  14. import javax.swing.JMenuBar;
  15. import javax.swing.JMenuItem;
  16. import javax.swing.JOptionPane;
  17. import javax.swing.JPanel;
  18. import javax.swing.Timer;
  19. public class HitMouse extends JFrame implements ActionListener,MouseListener{
  20. boolean isOver=false;//设置标记,游戏是否结束
  21. private String dir="./images/";//图片目录,当前工程下
  22. JLabel jlbMouse;//地鼠
  23. Timer timer;//时间定时器
  24. Random random;//随机数对象,即生成地鼠的位置
  25. int delay=1100;//延迟时间
  26. Toolkit tk;
  27. Image image;
  28. Cursor myCursor;
  29. JLabel showNum,currentGrade,hitNum;
  30. int showNumber=0,hitNumber=0,currentGrades=1;
  31. public HitMouse(){
  32. super("打地鼠");
  33. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  34. this.setSize(449, 395);
  35. this.setLocationRelativeTo(null);//设置窗口在屏幕中心
  36. setbackground();//设置背景
  37. this.getContentPane().setLayout(null);//设置框架布局模式为空,只有这样,才能知道图片的真正位置
  38. //设置鼠标为锤子图片
  39. tk = Toolkit.getDefaultToolkit();
  40. image = tk.createImage(dir+"chui1.png");
  41. myCursor = tk.createCustomCursor(image, new Point(10,10), "xxx");
  42. this.setCursor(myCursor);
  43. setMessage();//设置一些提示信息
  44. //在背景图片的基础上设置地鼠图片
  45. ImageIcon imageMouse = new ImageIcon(dir+"dishu.png");
  46. jlbMouse = new JLabel(imageMouse);
  47. jlbMouse.setSize(80,80);
  48. this.getContentPane().add(jlbMouse);
  49. jlbMouse.setVisible(false);
  50. jlbMouse.addMouseListener(this);//添加鼠标监听
  51. //定时器
  52. timer = new Timer(delay,this);
  53. random = new Random();
  54. timer.start();
  55. addMenu();//添加菜单
  56. this.setResizable(false);//设置窗口大小不能改变
  57. this.setVisible(true);
  58. }
  59. private void addMenu() {
  60. JMenuBar menubar = new JMenuBar();
  61. this.setJMenuBar(menubar);
  62. JMenu game = new JMenu("游戏");
  63. JMenuItem jitemNew = new JMenuItem("新游戏");
  64. jitemNew.setActionCommand("new");
  65. jitemNew.addActionListener(this);
  66. JMenuItem jitemPause = new JMenuItem("暂停");
  67. jitemPause.setActionCommand("pause");
  68. jitemPause.addActionListener(this);
  69. JMenuItem jitemExit = new JMenuItem("退出");
  70. jitemExit.setActionCommand("exit");
  71. jitemExit.addActionListener(this);
  72. game.add(jitemNew);
  73. game.add(jitemPause);
  74. game.addSeparator();//菜单里设置分隔线
  75. game.add(jitemExit);
  76. menubar.add(game);
  77. }
  78. private void setbackground() {
  79. ((JPanel)(this.getContentPane())).setOpaque(false);//如果为 true,则该组件绘制其边界内的所有像素。否则该组件可能不绘制部分或所有像素,从而允许其底层像素透视出来。
  80. ImageIcon bgImage = new ImageIcon("images/beijing.jpg");
  81. JLabel bgLabel = new JLabel(bgImage);
  82. bgLabel.setBounds(0, 25, bgImage.getIconWidth(), bgImage.getIconHeight());
  83. this.getLayeredPane().add(bgLabel, new Integer(Integer.MIN_VALUE));//设置背景图片的层次最低
  84. }
  85. private void setMessage() {
  86. ImageIcon showNumb = new ImageIcon(dir+"chuxiancishu.png");
  87. JLabel showLabel = new JLabel(showNumb);
  88. showLabel.setBounds(8, 8, 92, 80);
  89. this.getContentPane().add(showLabel);
  90. showNum = new JLabel("0");
  91. showNum.setBounds(110, 8, 92, 80);
  92. this.getContentPane().add(showNum);
  93. ImageIcon hitNumb = new ImageIcon(dir+"chuxiancishu.png");
  94. JLabel hitLabel = new JLabel(hitNumb);
  95. hitLabel.setBounds(148, 8, 92, 80);
  96. this.getContentPane().add(hitLabel);
  97. hitNum = new JLabel("0");
  98. hitNum.setBounds(251, 8, 92, 80);
  99. this.getContentPane().add(hitNum);
  100. ImageIcon grade = new ImageIcon(dir+"dangqiandengji.png");
  101. JLabel gradeLabel = new JLabel(grade);
  102. gradeLabel.setBounds(288, 8, 92, 80);
  103. this.getContentPane().add(gradeLabel);
  104. currentGrade = new JLabel("1");
  105. currentGrade.setBounds(391, 8, 92, 80);
  106. this.getContentPane().add(currentGrade);
  107. }
  108. public static void main(String[] args) {
  109. new HitMouse();
  110. }
  111. public void actionPerformed(ActionEvent e) {
  112. //对菜单项注册事件监听
  113. if(e.getSource() instanceof JMenuItem){
  114. menuItemFun(e);
  115. }
  116. int ran=random.nextInt(9);//随机生成一个0~9(不包括9)的随机数
  117. ImageIcon imageMouse = new ImageIcon(dir+"dishu.png");//保证每次随机生成的地鼠图片都是为没被打时的图片
  118. jlbMouse.setIcon(imageMouse);
  119. switch(ran){
  120. case 0:jlbMouse.setLocation(55, 63);break;
  121. case 1:jlbMouse.setLocation(321, 204);break;
  122. case 2:jlbMouse.setLocation(184, 204);break;
  123. case 3:jlbMouse.setLocation(47, 203);break;
  124. case 4:jlbMouse.setLocation(297, 133);break;
  125. case 5:jlbMouse.setLocation(161, 133);break;
  126. case 6:jlbMouse.setLocation(21, 133);break;
  127. case 7:jlbMouse.setLocation(310, 63);break;
  128. case 8:jlbMouse.setLocation(185, 63);break;
  129. }
  130. jlbMouse.setVisible(true);
  131. showNumber++;
  132. showNum.setText(""+showNumber);
  133. if( !gamePlan() ){//判断游戏是否结束,并显示游戏进程
  134. timer.stop();
  135. }
  136. }
  137. //监听菜单功能功能
  138. private void menuItemFun(ActionEvent e) {
  139. if (e.getActionCommand().equalsIgnoreCase("new")) {//新游戏
  140. timer.stop();
  141. showNumber=0;
  142. hitNumber=0;
  143. currentGrades=1;
  144. delay=1000;
  145. isOver=false;
  146. showNum.setText(""+showNumber);
  147. hitNum.setText(""+hitNumber);
  148. currentGrade.setText(""+currentGrades);
  149. timer = new Timer(delay,this);
  150. timer.start();
  151. }
  152. if (e.getActionCommand().equalsIgnoreCase("exit")) {//退出
  153. System.exit(EXIT_ON_CLOSE);
  154. }
  155. if (e.getActionCommand().equalsIgnoreCase("pause")) {//暂停
  156. timer.stop();
  157. JOptionPane.showMessageDialog(this, "继续请按“确定”");
  158. timer.start();
  159. }
  160. }
  161. private boolean gamePlan() {
  162. if(showNumber-hitNumber > 8){
  163. JOptionPane.showMessageDialog(this, "Game Over !");
  164. isOver=true;
  165. return false;
  166. }
  167. if(hitNumber > 5){
  168. hitNumber=0;
  169. showNumber=0;
  170. currentGrades++;
  171. if(delay>100){
  172. delay-=50;
  173. }else if(delay>=500){
  174. delay=500;
  175. }
  176. timer.setDelay(delay);
  177. hitNum.setText(""+hitNumber);
  178. showNum.setText(""+showNumber);
  179. currentGrade.setText(""+currentGrades);
  180. }
  181. return true;
  182. }
  183. public void mouseClicked(MouseEvent e) {
  184. }
  185. public void mousePressed(MouseEvent e) {
  186. if(isOver){
  187. return ;
  188. }
  189. image = tk.createImage(dir+"chui2.png");
  190. myCursor = tk.createCustomCursor(image, new Point(10,10), "xxx");
  191. this.setCursor(myCursor);//鼠标按下时,鼠标显示打下去的图片,模拟打的动作
  192. //如果打中地鼠,则地鼠换成被打中的图片,模拟地鼠被打
  193. if(e.getSource()==jlbMouse){
  194. ImageIcon imageIconHit = new ImageIcon(dir+"datou.png");
  195. jlbMouse.setIcon(imageIconHit);
  196. jlbMouse.setVisible(true);
  197. }
  198. hitNumber++;
  199. hitNum.setText(""+hitNumber);
  200. }
  201. public void mouseReleased(MouseEvent e) {
  202. if(isOver){
  203. return ;
  204. }
  205. //当鼠标放松以后,鼠标变回原来没按下时的图片
  206. image = tk.createImage(dir+"chui1.png");
  207. myCursor = tk.createCustomCursor(image, new Point(10,10), "xxx");
  208. this.setCursor(myCursor);
  209. }
  210. public void mouseEntered(MouseEvent e) {
  211. }
  212. public void mouseExited(MouseEvent e) {
  213. }
  214. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-8 12:11

Copyright 2015-2025 djqfx

返回顶部