Tank.java
上传用户:kikomiki
上传日期:2021-10-31
资源大小:373k
文件大小:5k
源码类别:

游戏

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.util.*;
  4. public class Tank {
  5. public static final int XSPEED = 5;
  6. public static final int YSPEED = 5;
  7. public static final int WIDTH = 30;
  8. public static final int HEIGHT = 30;
  9. private boolean live = true;
  10. TankClient tc;
  11. private boolean good;
  12. private int x, y;
  13. private static Random r = new Random();
  14. private boolean bL=false, bU=false, bR=false, bD = false;
  15. enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};
  16. private Direction dir = Direction.STOP;
  17. private Direction ptDir = Direction.D;
  18. private int step = r.nextInt(12) + 3;
  19. public Tank(int x, int y, boolean good) {
  20. this.x = x;
  21. this.y = y;
  22. this.good = good;
  23. }
  24. public Tank(int x, int y, boolean good, Direction dir,  TankClient tc) {
  25. this(x, y, good);
  26. this.dir = dir;
  27. this.tc = tc;
  28. }
  29. public void draw(Graphics g) {
  30. if(!live) {
  31. if(!good) {
  32. tc.tanks.remove(this);
  33. }
  34. return;
  35. }
  36. Color c = g.getColor();
  37. if(good) g.setColor(Color.RED);
  38. else g.setColor(Color.BLUE);
  39. g.fillOval(x, y, WIDTH, HEIGHT);
  40. g.setColor(c);
  41. switch(ptDir) {
  42. case L:
  43. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT/2);
  44. break;
  45. case LU:
  46. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y);
  47. break;
  48. case U:
  49. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y);
  50. break;
  51. case RU:
  52. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y);
  53. break;
  54. case R:
  55. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT/2);
  56. break;
  57. case RD:
  58. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT);
  59. break;
  60. case D:
  61. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y + Tank.HEIGHT);
  62. break;
  63. case LD:
  64. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT);
  65. break;
  66. }
  67. move();
  68. }
  69. void move() {
  70. switch(dir) {
  71. case L:
  72. x -= XSPEED;
  73. break;
  74. case LU:
  75. x -= XSPEED;
  76. y -= YSPEED;
  77. break;
  78. case U:
  79. y -= YSPEED;
  80. break;
  81. case RU:
  82. x += XSPEED;
  83. y -= YSPEED;
  84. break;
  85. case R:
  86. x += XSPEED;
  87. break;
  88. case RD:
  89. x += XSPEED;
  90. y += YSPEED;
  91. break;
  92. case D:
  93. y += YSPEED;
  94. break;
  95. case LD:
  96. x -= XSPEED;
  97. y += YSPEED;
  98. break;
  99. case STOP:
  100. break;
  101. }
  102. if(this.dir != Direction.STOP) {
  103. this.ptDir = this.dir;
  104. }
  105. if(x < 0) x = 0;
  106. if(y < 30) y = 30;
  107. if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;
  108. if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;
  109. if(!good) {
  110. Direction[] dirs = Direction.values();
  111. if(step == 0) {
  112. step = r.nextInt(12) + 3;
  113. int rn = r.nextInt(dirs.length);
  114. dir = dirs[rn];
  115. }
  116. step --;
  117. if(r.nextInt(40) > 38) this.fire();
  118. }
  119. }
  120. public void keyPressed(KeyEvent e) {
  121. int key = e.getKeyCode();
  122. switch(key) {
  123. case KeyEvent.VK_LEFT :
  124. bL = true;
  125. break;
  126. case KeyEvent.VK_UP :
  127. bU = true;
  128. break;
  129. case KeyEvent.VK_RIGHT :
  130. bR = true;
  131. break;
  132. case KeyEvent.VK_DOWN :
  133. bD = true;
  134. break;
  135. }
  136. locateDirection();
  137. }
  138. void locateDirection() {
  139. if(bL && !bU && !bR && !bD) dir = Direction.L;
  140. else if(bL && bU && !bR && !bD) dir = Direction.LU;
  141. else if(!bL && bU && !bR && !bD) dir = Direction.U;
  142. else if(!bL && bU && bR && !bD) dir = Direction.RU;
  143. else if(!bL && !bU && bR && !bD) dir = Direction.R;
  144. else if(!bL && !bU && bR && bD) dir = Direction.RD;
  145. else if(!bL && !bU && !bR && bD) dir = Direction.D;
  146. else if(bL && !bU && !bR && bD) dir = Direction.LD;
  147. else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
  148. }
  149. public void keyReleased(KeyEvent e) {
  150. int key = e.getKeyCode();
  151. switch(key) {
  152. case KeyEvent.VK_CONTROL:
  153. fire();
  154. break;
  155. case KeyEvent.VK_LEFT :
  156. bL = false;
  157. break;
  158. case KeyEvent.VK_UP :
  159. bU = false;
  160. break;
  161. case KeyEvent.VK_RIGHT :
  162. bR = false;
  163. break;
  164. case KeyEvent.VK_DOWN :
  165. bD = false;
  166. break;
  167. }
  168. locateDirection();
  169. }
  170. public Missile fire() {
  171. if(!live) return null;
  172. int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
  173. int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;
  174. Missile m = new Missile(x, y, good, ptDir, this.tc);
  175. tc.missiles.add(m);
  176. return m;
  177. }
  178. public Rectangle getRect() {
  179. return new Rectangle(x, y, WIDTH, HEIGHT);
  180. }
  181. public boolean isLive() {
  182. return live;
  183. }
  184. public void setLive(boolean live) {
  185. this.live = live;
  186. }
  187. public boolean isGood() {
  188. return good;
  189. }
  190. }