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