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

游戏

开发平台:

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 int oldX, oldY;
  14. private static Random r = new Random();
  15. private boolean bL=false, bU=false, bR=false, bD = false;
  16. enum Direction {L, LU, U, RU, R, RD, D, LD, STOP};
  17. private Direction dir = Direction.STOP;
  18. private Direction ptDir = Direction.D;
  19. private int step = r.nextInt(12) + 3;
  20. public Tank(int x, int y, boolean good) {
  21. this.x = x;
  22. this.y = y;
  23. this.oldX = x;
  24. this.oldY = y;
  25. this.good = good;
  26. }
  27. public Tank(int x, int y, boolean good, Direction dir,  TankClient tc) {
  28. this(x, y, good);
  29. this.dir = dir;
  30. this.tc = tc;
  31. }
  32. public void draw(Graphics g) {
  33. if(!live) {
  34. if(!good) {
  35. tc.tanks.remove(this);
  36. }
  37. return;
  38. }
  39. Color c = g.getColor();
  40. if(good) g.setColor(Color.RED);
  41. else g.setColor(Color.BLUE);
  42. g.fillOval(x, y, WIDTH, HEIGHT);
  43. g.setColor(c);
  44. switch(ptDir) {
  45. case L:
  46. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT/2);
  47. break;
  48. case LU:
  49. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y);
  50. break;
  51. case U:
  52. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y);
  53. break;
  54. case RU:
  55. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y);
  56. break;
  57. case R:
  58. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT/2);
  59. break;
  60. case RD:
  61. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH, y + Tank.HEIGHT);
  62. break;
  63. case D:
  64. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x + Tank.WIDTH/2, y + Tank.HEIGHT);
  65. break;
  66. case LD:
  67. g.drawLine(x + Tank.WIDTH/2, y + Tank.HEIGHT/2, x, y + Tank.HEIGHT);
  68. break;
  69. }
  70. move();
  71. }
  72. void move() {
  73. this.oldX = x;
  74. this.oldY = y;
  75. switch(dir) {
  76. case L:
  77. x -= XSPEED;
  78. break;
  79. case LU:
  80. x -= XSPEED;
  81. y -= YSPEED;
  82. break;
  83. case U:
  84. y -= YSPEED;
  85. break;
  86. case RU:
  87. x += XSPEED;
  88. y -= YSPEED;
  89. break;
  90. case R:
  91. x += XSPEED;
  92. break;
  93. case RD:
  94. x += XSPEED;
  95. y += YSPEED;
  96. break;
  97. case D:
  98. y += YSPEED;
  99. break;
  100. case LD:
  101. x -= XSPEED;
  102. y += YSPEED;
  103. break;
  104. case STOP:
  105. break;
  106. }
  107. if(this.dir != Direction.STOP) {
  108. this.ptDir = this.dir;
  109. }
  110. if(x < 0) x = 0;
  111. if(y < 30) y = 30;
  112. if(x + Tank.WIDTH > TankClient.GAME_WIDTH) x = TankClient.GAME_WIDTH - Tank.WIDTH;
  113. if(y + Tank.HEIGHT > TankClient.GAME_HEIGHT) y = TankClient.GAME_HEIGHT - Tank.HEIGHT;
  114. if(!good) {
  115. Direction[] dirs = Direction.values();
  116. if(step == 0) {
  117. step = r.nextInt(12) + 3;
  118. int rn = r.nextInt(dirs.length);
  119. dir = dirs[rn];
  120. }
  121. step --;
  122. if(r.nextInt(40) > 38) this.fire();
  123. }
  124. }
  125. private void stay() {
  126. x = oldX;
  127. y = oldY;
  128. }
  129. public void keyPressed(KeyEvent e) {
  130. int key = e.getKeyCode();
  131. switch(key) {
  132. case KeyEvent.VK_LEFT :
  133. bL = true;
  134. break;
  135. case KeyEvent.VK_UP :
  136. bU = true;
  137. break;
  138. case KeyEvent.VK_RIGHT :
  139. bR = true;
  140. break;
  141. case KeyEvent.VK_DOWN :
  142. bD = true;
  143. break;
  144. }
  145. locateDirection();
  146. }
  147. void locateDirection() {
  148. if(bL && !bU && !bR && !bD) dir = Direction.L;
  149. else if(bL && bU && !bR && !bD) dir = Direction.LU;
  150. else if(!bL && bU && !bR && !bD) dir = Direction.U;
  151. else if(!bL && bU && bR && !bD) dir = Direction.RU;
  152. else if(!bL && !bU && bR && !bD) dir = Direction.R;
  153. else if(!bL && !bU && bR && bD) dir = Direction.RD;
  154. else if(!bL && !bU && !bR && bD) dir = Direction.D;
  155. else if(bL && !bU && !bR && bD) dir = Direction.LD;
  156. else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
  157. }
  158. public void keyReleased(KeyEvent e) {
  159. int key = e.getKeyCode();
  160. switch(key) {
  161. case KeyEvent.VK_CONTROL:
  162. fire();
  163. break;
  164. case KeyEvent.VK_LEFT :
  165. bL = false;
  166. break;
  167. case KeyEvent.VK_UP :
  168. bU = false;
  169. break;
  170. case KeyEvent.VK_RIGHT :
  171. bR = false;
  172. break;
  173. case KeyEvent.VK_DOWN :
  174. bD = false;
  175. break;
  176. case KeyEvent.VK_A :
  177. superFire();
  178. break;
  179. }
  180. locateDirection();
  181. }
  182. public Missile fire() {
  183. if(!live) return null;
  184. int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
  185. int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;
  186. Missile m = new Missile(x, y, good, ptDir, this.tc);
  187. tc.missiles.add(m);
  188. return m;
  189. }
  190. public Missile fire(Direction dir) {
  191. if(!live) return null;
  192. int x = this.x + Tank.WIDTH/2 - Missile.WIDTH/2;
  193. int y = this.y + Tank.HEIGHT/2 - Missile.HEIGHT/2;
  194. Missile m = new Missile(x, y, good, dir, this.tc);
  195. tc.missiles.add(m);
  196. return m;
  197. }
  198. public Rectangle getRect() {
  199. return new Rectangle(x, y, WIDTH, HEIGHT);
  200. }
  201. public boolean isLive() {
  202. return live;
  203. }
  204. public void setLive(boolean live) {
  205. this.live = live;
  206. }
  207. public boolean isGood() {
  208. return good;
  209. }
  210. public boolean collidesWithWall(Wall w) {
  211. if(this.live && this.getRect().intersects(w.getRect())) {
  212. this.stay();
  213. return true;
  214. }
  215. return false;
  216. }
  217. public boolean collidesWithTanks(java.util.List<Tank> tanks) {
  218. for(int i=0; i<tanks.size(); i++) {
  219. Tank t = tanks.get(i);
  220. if(this != t) {
  221. if(this.live && t.isLive() && this.getRect().intersects(t.getRect())) {
  222. this.stay();
  223. t.stay();
  224. return true;
  225. }
  226. }
  227. }
  228. return false;
  229. }
  230. private void superFire() {
  231. Direction[] dirs = Direction.values();
  232. for(int i=0; i<8; i++) {
  233. fire(dirs[i]);
  234. }
  235. }
  236. }