From 796b2c68634de2f7b14b9cffd45592f1b793c674 Mon Sep 17 00:00:00 2001 From: Jian Hu Date: Tue, 28 Jun 2022 09:26:07 +0800 Subject: [PATCH] abstract factory for tank --- docs/坦克大战笔记.docx | Bin 77979 -> 78631 bytes src/com/demo/tank/course7/Bullet.java | 4 +- .../tank/course7/DefaultFireStrategy.java | 5 +- src/com/demo/tank/course7/Explode.java | 3 +- .../course7/FourDirectionFireStrategy.java | 7 +- src/com/demo/tank/course7/MainV7.java | 2 +- src/com/demo/tank/course7/Tank.java | 14 +- src/com/demo/tank/course7/TankFrameV7.java | 13 +- .../course7/abstractFactory/BaseBullet.java | 8 + .../course7/abstractFactory/BaseExplode.java | 7 + .../course7/abstractFactory/BaseTank.java | 18 ++ .../course7/abstractFactory/CircleBullet.java | 128 ++++++++++++ .../abstractFactory/CircleExplode.java | 51 +++++ .../abstractFactory/CircleFactory.java | 22 ++ .../course7/abstractFactory/CircleTank.java | 193 ++++++++++++++++++ .../abstractFactory/DefaultFactory.java | 25 +++ .../course7/abstractFactory/GameFactory.java | 11 + 17 files changed, 491 insertions(+), 20 deletions(-) create mode 100644 src/com/demo/tank/course7/abstractFactory/BaseBullet.java create mode 100644 src/com/demo/tank/course7/abstractFactory/BaseExplode.java create mode 100644 src/com/demo/tank/course7/abstractFactory/BaseTank.java create mode 100644 src/com/demo/tank/course7/abstractFactory/CircleBullet.java create mode 100644 src/com/demo/tank/course7/abstractFactory/CircleExplode.java create mode 100644 src/com/demo/tank/course7/abstractFactory/CircleFactory.java create mode 100644 src/com/demo/tank/course7/abstractFactory/CircleTank.java create mode 100644 src/com/demo/tank/course7/abstractFactory/DefaultFactory.java create mode 100644 src/com/demo/tank/course7/abstractFactory/GameFactory.java diff --git a/docs/坦克大战笔记.docx b/docs/坦克大战笔记.docx index 967025fc64de5033a327a91b72ac068fa4b1e8e8..e73a90215bc365d9b8794ff315becdf49f48c3a1 100644 GIT binary patch delta 12765 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೰Pd!@1%&R=6G_w@QIF&#fGZXc!a zoqm`?1br`;3v+{}IhHYyYT6{+eWTH+ftz>_RF!yg`{1nbrNL9Rk) z!aqkU+sPhQ5mexWCb~@*RA5vf?vpBxiST05n`#-`xaX(-tJlgEoDyVRt zP+=D5dwFEQ878^Fl0^jjh!|lJth)wSzAD+Ld!|$D zQl3+~5&RD<+7t=Mo0$B+U*R#ABP4$fl(M0ui{b7HQyGoPS#+aft!J!`)r~hU=>V?gqqH91nmXMk-p3i&E4Pr{gX8X~U|9d$XaM|9!Ig=Dh0G{plZ?eBo8l)-N<3^UUw zHrTJSi>gDtPSgdaNWKo7@(De&Ey#)ACA9r;ITkiE2mJL`-4D{zE#FU|U8VueKgc~} zPeq%8$SppSXVT;V!_sXtV+?c1woMj_-NgEOW98!$-!Cp3_o#{HTYh&(Hqd5!Dg8Ef zB>y-1S^=Gu&7t74>$Y~vRVdiL(#l0E&P>@vG07|?uwbEI%#UJ~d5o_bN!jBNq(Y9jkL-Afg=CPN|{YdfF? z1V8G3j55=_vXr}W{@M$UG;Bx*LmqLRzqR7qrmvDN&FhcncM*N2ZC?=$Nk%EGJW1B! za?09W5~CP-3qBn4*O6d^vbK>VhO#!1sD!e1k<9n6ocdy{l~>wL$C40-UY`}0XLQuQ zo&1NQ%-Mjy?xQdDdaCOtxe!{Mkzf=4w-AGND*X^~X;!ul{b|%5TzAfJb(7`kzs2T} z-FUX&B+vCJhW^ySdoY1(}_K)G^*jPUXs=qTZy9onB}XUnqYnI~ls{ z6^PA)G|N80^+uoLRY#vt|3TmXHbq$|XiNxLh{SDJSQzzLd?wBA>5HL(@14l19 z;J+hw%~a^7(HT~`gmad=GRyT(kiqJmbMxc|(b=O7Un7&?j zCPZSbk10z~YYHH=>)lgw@Q8QFzFF&yEaSkX=_OZC<~;Z@jCkZM6Lx?YHxZ(j=k26U zFq$Qp!802LH1Ncw&4J=~0L@WC3Z`!}{AibPRG0Cd7Ud|4j*wVVic<-+Q6s`9W<{^2HF`R;h?&LknT3g-pJ>l%d_Areup&)b4!z>)H%SD)t2u))>JKMO z{*^8rYOtPB3!J9=-Po$|G26`~{zlO4Thmdi6an2l`-0q-@t%2Sq}h-v#a>;-G3Vvy zaq4w3*BSD}e1n}kuDWk?HU#B{Tf-~};het?j3&*ohpWg4>a@_@!sTvgJ)t_RpxXgx zkAC@1-Y?M+BoK+Su$V1~I3Q*Wc-?<_40|95h@BP@dJr=RnCCo$6d#N;JT}mQ8nBtp zkfZr)EFHI!ySg0POrWspnxPOIdpD0E9lpLig$)-r>fU0wSZNHyeL=AA%J85GbhjFa ziyYvabOmDZiWs)syz|zD3kZopm65`ys$0k6rex7{g~}J<6%muURNkR)Fxp_@-#2iRPoD#9eq7~=-eg36v#9Su$0{n zGztn7x(D|RYJc591{_fZRM)}0qazcW(76*wunffmfu{vK6y$bF7x@UUlr>&~DwNII zTAC_w#ue6(eE`NDv8v!^G+S366f>@a!yANFk?hVBYzpKbN?+fd?W8s_nU(rO=^ zqykulTX>~Fpm136wZoTp%hO%n)Cu5h-G(i)puR( z7?Kw@wVoM7L;3$QPl*2!PW-2x_&;kC5%hn_D4bG1SwIAY|C5jZ#Y-aO|NrI{b}Bmy zh#xWpFV%?!Bmmh)nA*Ss5`-co0j1Uwg0NB%zJcf=y-8C!zk$dI|DU+~FX_Mj-_HK$ TY-CJz`UWD0onZOT4aENf%tX-J delta 12110 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 W?^6GI4D{)r>;Q6DQKo;JLHr+c%|gcj diff --git a/src/com/demo/tank/course7/Bullet.java b/src/com/demo/tank/course7/Bullet.java index 81f27ef..6065c88 100644 --- a/src/com/demo/tank/course7/Bullet.java +++ b/src/com/demo/tank/course7/Bullet.java @@ -1,6 +1,7 @@ package com.demo.tank.course7; import com.demo.tank.course7.abstractFactory.BaseBullet; +import com.demo.tank.course7.abstractFactory.BaseTank; import com.demo.tank.enums.Direction; import com.demo.tank.enums.Group; import com.demo.tank.util.ResourceManager; @@ -74,8 +75,9 @@ public class Bullet extends BaseBullet { rect.y = this.y; } + @Override //检测是否跟坦克碰撞 - public void collideWith(Tank tank){ + public void collideWith(BaseTank tank){ //关闭队友伤害 if(this.group == tank.getGroup()) return; if(rect.intersects(tank.rect)){ diff --git a/src/com/demo/tank/course7/DefaultFireStrategy.java b/src/com/demo/tank/course7/DefaultFireStrategy.java index ac664d4..a0eccdc 100644 --- a/src/com/demo/tank/course7/DefaultFireStrategy.java +++ b/src/com/demo/tank/course7/DefaultFireStrategy.java @@ -1,14 +1,11 @@ package com.demo.tank.course7; -import com.demo.tank.enums.Group; -import com.demo.tank.util.Audio; - public class DefaultFireStrategy implements FireStrategy { @Override public void fire(Tank tank) { int bx = tank.getX() + Tank.WIDTH/2 - Bullet.WIDTH/2; int by = tank.getY() + Tank.HEIGHT/2 - Bullet.HEIGHT/2; new Bullet(bx, by, tank.getDir(), tank.getGroup(),tank.getTankFrame()); - if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); +// if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); } } diff --git a/src/com/demo/tank/course7/Explode.java b/src/com/demo/tank/course7/Explode.java index fd54348..3e46c54 100644 --- a/src/com/demo/tank/course7/Explode.java +++ b/src/com/demo/tank/course7/Explode.java @@ -1,7 +1,6 @@ package com.demo.tank.course7; import com.demo.tank.course7.abstractFactory.BaseExplode; -import com.demo.tank.util.Audio; import com.demo.tank.util.ResourceManager; import java.awt.*; @@ -18,7 +17,7 @@ public class Explode extends BaseExplode { this.x = x; this.y = y; this.tf = tf; - new Thread(() -> new Audio("audio/explode.wav").play()).start(); +// new Thread(() -> new Audio("audio/explode.wav").play()).start(); } @Override diff --git a/src/com/demo/tank/course7/FourDirectionFireStrategy.java b/src/com/demo/tank/course7/FourDirectionFireStrategy.java index 82f3433..bb63d3b 100644 --- a/src/com/demo/tank/course7/FourDirectionFireStrategy.java +++ b/src/com/demo/tank/course7/FourDirectionFireStrategy.java @@ -1,8 +1,6 @@ package com.demo.tank.course7; import com.demo.tank.enums.Direction; -import com.demo.tank.enums.Group; -import com.demo.tank.util.Audio; public class FourDirectionFireStrategy implements FireStrategy { @Override @@ -10,8 +8,9 @@ public class FourDirectionFireStrategy implements FireStrategy { int bx = tank.getX() + Tank.WIDTH/2 - Bullet.WIDTH/2; int by = tank.getY() + Tank.HEIGHT/2 - Bullet.HEIGHT/2; for(Direction direction : Direction.values()){ - new Bullet(bx, by, direction, tank.getGroup(),tank.getTankFrame()); + tank.tankFrame.gameFactory.createBullet(bx, by, direction, tank.getGroup(),tank.getTankFrame()); +// new Bullet(bx, by, direction, tank.getGroup(),tank.getTankFrame()); } - if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); +// if (tank.getGroup() == Group.GOOD) new Thread(() -> new Audio("audio/tank_fire.wav").play()).start(); } } diff --git a/src/com/demo/tank/course7/MainV7.java b/src/com/demo/tank/course7/MainV7.java index fe18beb..055bea8 100644 --- a/src/com/demo/tank/course7/MainV7.java +++ b/src/com/demo/tank/course7/MainV7.java @@ -11,7 +11,7 @@ public class MainV7 { TankFrameV7 tf = new TankFrameV7(); int enemyTankNum = PropertyManager.getInt("enemy.tank.number"); for(int i = 0; i < enemyTankNum; i++){ - tf.enemyTanks.add(new Tank(50 + i*80, 200, Direction.DOWN, Group.BAD, tf)); + tf.enemyTanks.add(tf.gameFactory.createTank(50 + i*80, 200, Direction.DOWN, Group.BAD, tf)); } // new Thread(() -> new Audio("audio/war1.wav").loop()).start(); diff --git a/src/com/demo/tank/course7/Tank.java b/src/com/demo/tank/course7/Tank.java index 8430ee2..3d70f1a 100644 --- a/src/com/demo/tank/course7/Tank.java +++ b/src/com/demo/tank/course7/Tank.java @@ -19,7 +19,7 @@ public class Tank extends BaseTank { public static final int WIDTH = ResourceManager.tankD.getWidth(); public static final int HEIGHT = ResourceManager.tankD.getHeight(); private Random random = new Random(); - Rectangle rect = new Rectangle(); + public Rectangle rect = new Rectangle(); FireStrategy fireStrategy; @@ -39,7 +39,6 @@ public class Tank extends BaseTank { // String className = PropertyManager.getString("good.tank.fire.strategy"); try { fireStrategy = (FireStrategy) Class.forName("com.demo.tank.course7.FourDirectionFireStrategy").newInstance(); - System.out.println(fireStrategy); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InstantiationException e) { @@ -114,7 +113,16 @@ public class Tank extends BaseTank { } public void fire() { - fireStrategy.fire(this); +// fireStrategy.fire(this); + int bx = x + Tank.WIDTH/2 - Bullet.WIDTH/2; + int by = y + Tank.HEIGHT/2 - Bullet.HEIGHT/2; + if(this.group == Group.BAD){ + this.tankFrame.gameFactory.createBullet(bx, by, this.dir, this.group,this.tankFrame); + }else{ + for(Direction direction : Direction.values()){ + this.tankFrame.gameFactory.createBullet(bx, by, direction, this.group,this.tankFrame); + } + } } public void die(){ diff --git a/src/com/demo/tank/course7/TankFrameV7.java b/src/com/demo/tank/course7/TankFrameV7.java index ddcebe3..3a8d92f 100644 --- a/src/com/demo/tank/course7/TankFrameV7.java +++ b/src/com/demo/tank/course7/TankFrameV7.java @@ -1,7 +1,9 @@ package com.demo.tank.course7; +import com.demo.tank.course7.abstractFactory.BaseBullet; import com.demo.tank.course7.abstractFactory.BaseExplode; -import com.demo.tank.course7.abstractFactory.DefaultFactory; +import com.demo.tank.course7.abstractFactory.BaseTank; +import com.demo.tank.course7.abstractFactory.CircleFactory; import com.demo.tank.course7.abstractFactory.GameFactory; import com.demo.tank.enums.Direction; import com.demo.tank.enums.Group; @@ -21,12 +23,13 @@ public class TankFrameV7 extends Frame { Tank tank = new Tank(380, 660, Direction.UP, Group.GOOD,this); // Bullet bullet = new Bullet(520, 440, Direction.UP); - List bullets = new ArrayList(); - List enemyTanks = new ArrayList<>(); + public List bullets = new ArrayList(); + public List enemyTanks = new ArrayList<>(); - List explodes = new ArrayList<>(); + public List explodes = new ArrayList<>(); - GameFactory gameFactory = new DefaultFactory(); +// GameFactory gameFactory = new DefaultFactory(); + public GameFactory gameFactory = new CircleFactory(); public TankFrameV7(){ setVisible(true); diff --git a/src/com/demo/tank/course7/abstractFactory/BaseBullet.java b/src/com/demo/tank/course7/abstractFactory/BaseBullet.java new file mode 100644 index 0000000..3eba1e8 --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/BaseBullet.java @@ -0,0 +1,8 @@ +package com.demo.tank.course7.abstractFactory; + +import java.awt.*; + +public abstract class BaseBullet { + public abstract void paint(Graphics g); + public abstract void collideWith(BaseTank tank); +} diff --git a/src/com/demo/tank/course7/abstractFactory/BaseExplode.java b/src/com/demo/tank/course7/abstractFactory/BaseExplode.java new file mode 100644 index 0000000..bace5cf --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/BaseExplode.java @@ -0,0 +1,7 @@ +package com.demo.tank.course7.abstractFactory; + +import java.awt.*; + +public abstract class BaseExplode { + public abstract void paint(Graphics g); +} diff --git a/src/com/demo/tank/course7/abstractFactory/BaseTank.java b/src/com/demo/tank/course7/abstractFactory/BaseTank.java new file mode 100644 index 0000000..d9ea276 --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/BaseTank.java @@ -0,0 +1,18 @@ +package com.demo.tank.course7.abstractFactory; + +import com.demo.tank.enums.Group; + +import java.awt.*; + +public abstract class BaseTank { + public Rectangle rect = new Rectangle(); + + public abstract void paint(Graphics g); + public abstract void die(); + + public abstract Group getGroup(); + + public abstract int getX(); + + public abstract int getY(); +} diff --git a/src/com/demo/tank/course7/abstractFactory/CircleBullet.java b/src/com/demo/tank/course7/abstractFactory/CircleBullet.java new file mode 100644 index 0000000..af4015d --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/CircleBullet.java @@ -0,0 +1,128 @@ +package com.demo.tank.course7.abstractFactory; + +import com.demo.tank.course7.Bullet; +import com.demo.tank.course7.Explode; +import com.demo.tank.course7.Tank; +import com.demo.tank.course7.TankFrameV7; +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; +import com.demo.tank.util.ResourceManager; + +import java.awt.*; + +public class CircleBullet extends BaseBullet{ + private int x, y; + private Direction direction; + private static final int SPEED = 10; + public static final int WIDTH = ResourceManager.bulletD.getWidth(); + public static final int HEIGHT = ResourceManager.bulletD.getHeight(); + private boolean live = true; + private Group group = Group.BAD; + private TankFrameV7 tf; + Rectangle rect = new Rectangle(); + + public CircleBullet(int x, int y, Direction direction, Group group, TankFrameV7 tf) { + this.x = x; + this.y = y; + this.direction = direction; + this.group = group; + this.tf = tf; + + rect.x = this.x; + rect.y = this.y; + rect.width = Bullet.WIDTH; + rect.height = Bullet.HEIGHT; + tf.bullets.add(this); + } + + @Override + public void paint(Graphics g){ + if(!live){ + tf.bullets.remove(this); + } + Color c = g.getColor(); + g.setColor(Color.YELLOW); + g.fillOval(x, y, 10, 10); + g.setColor(c); + move(); + } + + private void move() { + switch (direction){ + case UP: y -= SPEED; + break; + case DOWN: y += SPEED; + break; + case LEFT: x -= SPEED; + break; + case RIGHT: x += SPEED; + break; + default: + break; + } + if(x < 0 || y < 0 || x > TankFrameV7.GAME_WIDTH || y > TankFrameV7.GAME_HEIGHT){ + live = false; + } + rect.x = this.x; + rect.y = this.y; + } + + @Override + //检测是否跟坦克碰撞 + public void collideWith(BaseTank tank){ + //关闭队友伤害 + if(this.group == tank.getGroup()) return; + if(rect.intersects(tank.rect)){ + tank.die(); + this.die(); + //爆炸 + int ex = tank.getX() + Tank.WIDTH/2 - Explode.WIDTH/2; + int ey = tank.getY() + Tank.HEIGHT/2 - Explode.HEIGHT/2; + tf.explodes.add(tf.gameFactory.createExplode(ex, ey , tf)); + } + } + + private void die() { + this.live = false; + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public Direction getDirection() { + return direction; + } + + public void setDirection(Direction direction) { + this.direction = direction; + } + + public boolean isLive() { + return live; + } + + public void setLive(boolean live) { + this.live = live; + } + + public Group getGroup() { + return group; + } + + public void setGroup(Group group) { + this.group = group; + } +} diff --git a/src/com/demo/tank/course7/abstractFactory/CircleExplode.java b/src/com/demo/tank/course7/abstractFactory/CircleExplode.java new file mode 100644 index 0000000..794e957 --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/CircleExplode.java @@ -0,0 +1,51 @@ +package com.demo.tank.course7.abstractFactory; + +import com.demo.tank.course7.TankFrameV7; +import com.demo.tank.util.ResourceManager; + +import java.awt.*; + +public class CircleExplode extends BaseExplode{ + private int x, y; + public static final int WIDTH = ResourceManager.explodes[0].getWidth(); + public static final int HEIGHT = ResourceManager.explodes[0].getHeight(); + private TankFrameV7 tf; + + private int step = 0; + + public CircleExplode(int x, int y, TankFrameV7 tf) { + this.x = x; + this.y = y; + this.tf = tf; +// new Thread(() -> new Audio("audio/explode.wav").play()).start(); + } + + @Override + public void paint(Graphics g){ + Color c = g.getColor(); + g.setColor(Color.RED); + g.fillOval(x, y, 5*step, 5*step); + step++; + if(step >= 10){ + //播放完爆炸效果图片, remove + tf.explodes.remove(this); + } + g.setColor(c); + } + + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } +} diff --git a/src/com/demo/tank/course7/abstractFactory/CircleFactory.java b/src/com/demo/tank/course7/abstractFactory/CircleFactory.java new file mode 100644 index 0000000..733db9b --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/CircleFactory.java @@ -0,0 +1,22 @@ +package com.demo.tank.course7.abstractFactory; + +import com.demo.tank.course7.TankFrameV7; +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; + +public class CircleFactory extends GameFactory{ + @Override + public BaseTank createTank(int x, int y, Direction dir, Group group, TankFrameV7 tf) { + return new CircleTank(x,y,dir,group,tf); + } + + @Override + public BaseBullet createBullet(int x, int y, Direction dir, Group group, TankFrameV7 tf) { + return new CircleBullet(x, y, dir, group, tf); + } + + @Override + public BaseExplode createExplode(int x, int y, TankFrameV7 tf) { + return new CircleExplode(x, y, tf); + } +} diff --git a/src/com/demo/tank/course7/abstractFactory/CircleTank.java b/src/com/demo/tank/course7/abstractFactory/CircleTank.java new file mode 100644 index 0000000..2bf992c --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/CircleTank.java @@ -0,0 +1,193 @@ +package com.demo.tank.course7.abstractFactory; + +import com.demo.tank.course7.Bullet; +import com.demo.tank.course7.DefaultFireStrategy; +import com.demo.tank.course7.FireStrategy; +import com.demo.tank.course7.Tank; +import com.demo.tank.course7.TankFrameV7; +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; +import com.demo.tank.util.ResourceManager; + +import java.awt.*; +import java.util.Random; + +public class CircleTank extends BaseTank{ + private int x,y; + private Direction dir; + private static final int SPEED = 8; + private boolean moving = true; + private boolean living = true; + private Group group = Group.BAD; + TankFrameV7 tankFrame = null; + public static final int WIDTH = ResourceManager.tankD.getWidth(); + public static final int HEIGHT = ResourceManager.tankD.getHeight(); + private Random random = new Random(); + public Rectangle rect = new Rectangle(); + FireStrategy fireStrategy; + + + public CircleTank(int x, int y, Direction dir, Group group, TankFrameV7 tankFrame) { + this.x = x; + this.y = y; + this.dir = dir; + this.group = group; + this.tankFrame = tankFrame; + + rect.x = this.x; + rect.y = this.y; + rect.width = Tank.WIDTH; + rect.height = Tank.HEIGHT; + + if(this.group == Group.GOOD) { +// String className = PropertyManager.getString("good.tank.fire.strategy"); + try { + fireStrategy = (FireStrategy) Class.forName("com.demo.tank.course7.FourDirectionFireStrategy").newInstance(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + }else if(this.group == Group.BAD) fireStrategy = new DefaultFireStrategy(); + } + + @Override + public void paint(Graphics g) { + if(!living) tankFrame.enemyTanks.remove(this); + //根据方向绘制坦克 + Color c = g.getColor(); + g.setColor(this.group == Group.BAD ? Color.RED : Color.YELLOW); + g.fillOval(x,y, 40, 40); + g.setColor(c); + move(); + } + + public void move(){ + //如果没有移动 return + if(!moving) return; + switch (dir){ + case UP: y -= SPEED; + break; + case DOWN: y += SPEED; + break; + case LEFT: x -= SPEED; + break; + case RIGHT: x += SPEED; + break; + default: + break; + } + if(this.group == Group.BAD) { + if(random.nextInt(10) == 5){ + this.fire(); + } + if(random.nextInt(100) > 95){ + this.randomDirection(); + } + } + + //边界检测 + boundsCheck(); + + rect.x = this.x; + rect.y = this.y; + } + + private void boundsCheck() { + if(x < 0) x = 0; + if(x > TankFrameV7.GAME_WIDTH - Tank.WIDTH) x = TankFrameV7.GAME_WIDTH - Tank.WIDTH; + if(y < 30) y = 30; //算上菜单条 + if(y > TankFrameV7.GAME_HEIGHT - Tank.HEIGHT) y = TankFrameV7.GAME_HEIGHT - Tank.HEIGHT; + } + + private void randomDirection() { + this.dir = Direction.values()[random.nextInt(4)]; + } + + public void fire() { +// fireStrategy.fire(this); + int bx = x + Tank.WIDTH/2 - Bullet.WIDTH/2; + int by = y + Tank.HEIGHT/2 - Bullet.HEIGHT/2; + if(this.group == Group.BAD){ + this.tankFrame.gameFactory.createBullet(bx, by, this.dir, this.group,this.tankFrame); + }else{ + for(Direction direction : Direction.values()){ + this.tankFrame.gameFactory.createBullet(bx, by, direction, this.group,this.tankFrame); + } + } + } + + @Override + public void die(){ + this.living = false; + } + + @Override + public int getX() { + return x; + } + + public void setX(int x) { + this.x = x; + } + + @Override + public int getY() { + return y; + } + + public void setY(int y) { + this.y = y; + } + + public Direction getDir() { + return dir; + } + + public void setDir(Direction dir) { + this.dir = dir; + } + + public boolean isMoving() { + return moving; + } + + public void setMoving(boolean moving) { + this.moving = moving; + } + + public boolean isLiving() { + return living; + } + + public void setLiving(boolean living) { + this.living = living; + } + + @Override + public Group getGroup() { + return group; + } + + public void setGroup(Group group) { + this.group = group; + } + + public TankFrameV7 getTankFrame() { + return tankFrame; + } + + public void setTankFrame(TankFrameV7 tankFrame) { + this.tankFrame = tankFrame; + } + + public Rectangle getRect() { + return rect; + } + + public void setRect(Rectangle rect) { + this.rect = rect; + } +} diff --git a/src/com/demo/tank/course7/abstractFactory/DefaultFactory.java b/src/com/demo/tank/course7/abstractFactory/DefaultFactory.java new file mode 100644 index 0000000..b51db46 --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/DefaultFactory.java @@ -0,0 +1,25 @@ +package com.demo.tank.course7.abstractFactory; + +import com.demo.tank.course7.Bullet; +import com.demo.tank.course7.Explode; +import com.demo.tank.course7.Tank; +import com.demo.tank.course7.TankFrameV7; +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; + +public class DefaultFactory extends GameFactory{ + @Override + public BaseTank createTank(int x, int y, Direction dir, Group group, TankFrameV7 tf) { + return new Tank(x,y,dir,group,tf); + } + + @Override + public BaseBullet createBullet(int x, int y, Direction dir, Group group, TankFrameV7 tf) { + return new Bullet(x, y, dir, group, tf); + } + + @Override + public BaseExplode createExplode(int x, int y, TankFrameV7 tf) { + return new Explode(x, y, tf); + } +} diff --git a/src/com/demo/tank/course7/abstractFactory/GameFactory.java b/src/com/demo/tank/course7/abstractFactory/GameFactory.java new file mode 100644 index 0000000..b7de0f8 --- /dev/null +++ b/src/com/demo/tank/course7/abstractFactory/GameFactory.java @@ -0,0 +1,11 @@ +package com.demo.tank.course7.abstractFactory; + +import com.demo.tank.course7.TankFrameV7; +import com.demo.tank.enums.Direction; +import com.demo.tank.enums.Group; + +public abstract class GameFactory { + public abstract BaseTank createTank(int x, int y, Direction dir, Group group, TankFrameV7 tf); + public abstract BaseBullet createBullet(int x, int y, Direction dir, Group group, TankFrameV7 tf); + public abstract BaseExplode createExplode(int x, int y, TankFrameV7 tf); +}