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