A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 姚伟涛 中级黑马   /  2012-4-17 10:25  /  942 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 姚伟涛 于 2012-4-20 16:41 编辑
  1. import java.util.Random;
  2. import java.awt.*;
  3. import javax.swing.*;
  4. import java.awt.event.*;
  5.    
  6. public class Lianxi
  7. {
  8. int i=0;
  9. // 桌面的宽度  
  10. private final int TABLE_WIDTH = 300;
  11. // 桌面的高度
  12. private final int TABLE_HEIGHT = 400;
  13. // 球拍的垂直位置
  14. private final int RACKET_Y = 340;
  15. // 下面定义球拍的高度和宽度
  16. private final int RACKET_HEIGHT = 20;
  17. private final int RACKET_WIDTH = 60;
  18. // 小球的大小
  19. private final int BALL_SIZE = 16;
  20. private Frame f = new Frame("弹球游戏");
  21. Random rand = new Random();
  22. // 小球纵向的运行速度
  23. private int ySpeed = 10;
  24. // 返回一个-0.5~0.5的比率,用于控制小球的运行方向。
  25. private double xyRate = rand.nextDouble() - 0.5;
  26. // 小球横向的运行速度
  27. private int xSpeed = (int)(ySpeed * xyRate * 2);
  28. // ballX和ballY代表小球的坐标
  29. private int ballX = rand.nextInt(200) + 20;
  30. private int ballY = rand.nextInt(10) + 20;
  31. // racketX代表球拍的水平位置
  32. private int racketX = rand.nextInt(200);
  33. private MyCanvas tableArea = new MyCanvas();
  34. Timer timer;
  35. // 游戏是否结束的旗标
  36. private boolean isLose = false;
  37. public void init()
  38. {
  39. // 设置桌面区域的最佳大小
  40. tableArea.setPreferredSize(
  41. new Dimension(TABLE_WIDTH , TABLE_HEIGHT));
  42. f.add(tableArea);
  43. // 定义键盘监听器
  44. KeyAdapter keyProcessor = new KeyAdapter()
  45. {
  46. public void keyPressed(KeyEvent ke)
  47. {
  48. // 按下向左、向右键时,球拍水平坐标分别减少、增加
  49. if (ke.getKeyCode() == KeyEvent.VK_LEFT)
  50. {
  51. if (racketX > 0)
  52. racketX -= 10;
  53. }
  54. if (ke.getKeyCode() == KeyEvent.VK_RIGHT)
  55. {
  56. if (racketX < TABLE_WIDTH - RACKET_WIDTH)
  57. racketX += 10;
  58. }
  59. }
  60. };
  61. // 为窗口和tableArea对象分别添加键盘监听器
  62. f.addKeyListener(keyProcessor);
  63. tableArea.addKeyListener(keyProcessor);
  64. // 定义每0.1秒执行一次的事件监听器。
  65. ActionListener taskPerformer = new ActionListener()  
  66. {
  67. public void actionPerformed(ActionEvent evt)
  68. {
  69. // 如果小球碰到左边边框
  70. if (ballX <= 0 || ballX >= TABLE_WIDTH - BALL_SIZE)
  71. {
  72. xSpeed = -xSpeed;
  73. }
  74. // 如果小球高度超出了球拍位置,且横向不在球拍范围之内,游戏结束。
  75. if (ballY >= RACKET_Y - BALL_SIZE &&  
  76. (ballX < racketX || ballX > racketX + RACKET_WIDTH))
  77. {
  78. timer.stop();
  79. // 设置游戏是否结束的旗标为true。
  80. isLose = true;
  81. tableArea.repaint();
  82. }
  83. // 如果小球位于球拍之内,且到达球拍位置,小球反弹
  84. else if (ballY <= 0 ||  
  85. (ballY >= RACKET_Y - BALL_SIZE
  86. && ballX > racketX && ballX <= racketX + RACKET_WIDTH)||i==15)
  87. {
  88. ySpeed = -ySpeed;
  89. i++;
  90. }
  91. // 小球坐标增加
  92. ballY += ySpeed;
  93. ballX += xSpeed;
  94. tableArea.repaint();
  95. }
  96. };
  97. timer = new Timer(100, taskPerformer);
  98. timer.start();
  99. f.addWindowListener(new WindowAdapter()
  100. {
  101. public void windowClosing(WindowEvent e)
  102. {
  103. System.exit(0);
  104. }
  105. });
  106. f.pack();
  107. f.setVisible(true);
  108. }
  109. public static void main(String[] args)  
  110. {
  111. new Lianxi().init();
  112. }
  113. class MyCanvas extends Canvas
  114. {
  115. // 重写Canvas的paint方法,实现绘画
  116. public void paint(Graphics g)
  117. {
  118. // 如果游戏已经结束
  119. if (isLose)
  120. {
  121. g.setColor(new Color(255, 0, 0));
  122. g.setFont(new Font("Times" , Font.BOLD, 30));
  123. g.drawString("游戏已结束!" , 50 ,200);
  124. Button kk=new Button("再来一次");
  125. Panel jk=new Panel();
  126. jk.add(kk);
  127. f.add(jk,BorderLayout.SOUTH);
  128. f.setVisible(true);
  129. kk.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){
  130. i=0;
  131. ballX = rand.nextInt(200) + 20;
  132. ballY = rand.nextInt(10) + 20;
  133. racketX = rand.nextInt(200);
  134.    
  135.   

  136.   
  137. isLose = false;
  138. timer.start();
  139.    
  140. }
  141. });

  142. }
  143. // 如果游戏还未结束
  144. else
  145. {
  146. // 设置颜色,并绘制小球
  147. g.setColor(new Color(240, 240, 80));
  148. g.fillOval(ballX , ballY , BALL_SIZE, BALL_SIZE);
  149. // 设置颜色,并绘制球拍
  150. g.setColor(new Color(80, 80, 200));
  151. g.fillRect(racketX , RACKET_Y  
  152. , RACKET_WIDTH , RACKET_HEIGHT);
  153. }
  154. }
  155. }
  156. }
  157. 运行完后点击再来一次,结果键盘控制没有反映,请帮忙指点一下
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马