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

游戏

开发平台:

Java

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