潜艇大作战
游戲測試類
package Submarine03;import javax.crypto.SealedObject; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.Arrays; import java.util.Random; import java.util.Timer; import java.util.TimerTask;public class StartGame extends JPanel {public static final int READAY = 0;public static final int GAMEOVER = 1;private int state = READAY;public static final int WIDTH = 641;public static final int HEIGHT = 479;BattleShip bts = new BattleShip();SaeSubmarine[] ssb = {};Mine[] mines = {};Bomb[] bombs = {};//=======================================================================================================================//水雷碰戰艦 --結束private void mmBbts() {for (int i = 0; i < mines.length; i++) {if (mines[i].isLive() && bts.isLive() && bts.collideAction(mines[i])) {mines[i].colliDend();bts.minusLife();if (bts.getLife() == 0) {//-------------------判斷生命值,改變狀態,結束state = GAMEOVER;}}}}//碰撞--@1消失+@2死亡+@3得分int score = 0;private void bobBssb() {for (int j = 0; j < bombs.length; j++) {for (int i = 0; i < ssb.length; i++) {if (bombs[j].isLive() && ssb[i].isLive() && ssb[i].collideAction(bombs[j])) {bombs[j].colliDend();ssb[i].colliDend();if (ssb[i] instanceof InputLive) {//----------------------------獲得生命值InputLive msb = (InputLive) ssb[i];bts.addLife(msb.inputLive());} else if (ssb[i] instanceof InputScore) {//-----------------獲得分數InputScore msb2 = (InputScore) ssb[i];score += msb2.inputScore();}}}}}//數據清除private void outBound() {for (int i = 0; i < ssb.length; i++) {if (ssb[i].outOfBounds() || ssb[i].isLDend()) {ssb[i] = ssb[ssb.length - 1];ssb = Arrays.copyOf(ssb, ssb.length - 1);}}for (int i = 0; i < mines.length; i++) {if (mines[i].outOfBounds() || mines[i].isLDend()) {mines[i] = mines[mines.length - 1];mines = Arrays.copyOf(mines, mines.length - 1);}}for (int i = 0; i < bombs.length; i++) {if (bombs[i].outOfBounds() || bombs[i].isLDend()) {bombs[i] = bombs[bombs.length - 1];bombs = Arrays.copyOf(bombs, bombs.length - 1);}}}//移動private void omtMove() {for (int i = 0; i < ssb.length; i++) {ssb[i].move();}for (int i = 0; i < mines.length; i++) {mines[i].move();}for (int i = 0; i < bombs.length; i++) {bombs[i].move();}}//生成數據-定時生成 1-潛艇+水雷//潛艇--->@1控制種類生成概率 +@2生成頻率-------------------------------------int temp = 0;private void nextSSb() {temp++;if (temp % 40 == 0) {SaeSubmarine ssb1 = otm();ssb = Arrays.copyOf(ssb, ssb.length + 1);ssb[ssb.length - 1] = ssb1;}}//@1控制種類生成概率public SaeSubmarine otm() {Random random = new Random();int rd = random.nextInt(20);if (rd < 10) {return new ObserverSubmarine();} else if (rd < 15) {return new TorpedoSubmarine();} else {return new MineSubmarine();}}//生成水雷,@1生成水雷方法+@2控制生成頻率----------------------------------------------int temp2 = 0;private void nextMines() {temp2++;if (temp2 % 100 == 0) {for (int i = 0; i < ssb.length; i++) {//水雷是根據水雷潛艇出生if (ssb[i] instanceof MineSubmarine) {Mine msm = ((MineSubmarine) ssb[i]).NextMine();//調用生成方法mines = Arrays.copyOf(mines, mines.length + 1);mines[mines.length - 1] = msm;}}}}//啟動游戲,@1定時器+@2事件監聽器private void subAction() {//@2事件監聽器KeyAdapter k = new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_SPACE) {//按下鍵盤生成炸彈,生成數據-事件生成 2-炸彈Bomb bb = bts.nextBome();bombs = Arrays.copyOf(bombs, bombs.length + 1);//數組擴容bombs[bombs.length - 1] = bb;} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {bts.liftMove();} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {bts.rightMove();}}};this.addKeyListener(k);//@1定時器Timer timer = new Timer();int timi = 10;//定個10毫秒一次timer.schedule(new TimerTask() {@Overridepublic void run() {nextSSb();//生成潛艇----->潛艇是多種,控制每種潛艇的出生率,+生成潛艇nextMines();//生成水雷//移動+事件戰艦炸彈移動omtMove();outBound();//溢出數據清除bobBssb();//碰撞消失得分得命mmBbts();//戰艦碰水雷}}, timi, timi);}//重寫畫畫,顯示游戲public void paint(Graphics g) {switch (state) {case READAY:images.sea.paintIcon(null, g, 0, 0);bts.PantImage(g);//畫潛艇for (int i = 0; i < ssb.length; i++) {ssb[i].PantImage(g);}//畫水雷for (int i = 0; i < mines.length; i++) {mines[i].PantImage(g);}//畫炸彈for (int i = 0; i < bombs.length; i++) {bombs[i].PantImage(g);}g.drawString("SCORE" + score, 200, 50);g.drawString("LIVE" + bts.getLife(), 400, 50);repaint();break;case GAMEOVER:images.Gameover.paintIcon(null, g, 0, 0);break;}}public static void main(String[] args) {JFrame jFrame = new JFrame();StartGame start = new StartGame();start.setFocusable(true);jFrame.add(start);jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jFrame.setSize(WIDTH + 16, HEIGHT + 39);jFrame.setLocationRelativeTo(null);jFrame.setVisible(true);//,顯示視圖,2調用paint畫畫start.subAction();//-------------啟動} }超類
package Submarine03;import Submarine04.SubmarineObject;import javax.swing.*; import java.awt.*; import java.util.Random;public abstract class SaeSubmarine {public static final int LIVE = 0;public static final int DEND = 1;public int state = LIVE;int width;int height;int x;int y;int speed;SaeSubmarine(int width, int height, int x, int y, int speed) {this.width = width;this.height = height;this.x = x;this.y = y;this.speed = speed;}SaeSubmarine(int width, int height) {Random random = new Random();this.width = width;this.height = height;x = -width;y = random.nextInt(479 - height - 150 + 1) + 150;speed = random.nextInt(3) + 1;}public abstract void move();//判斷狀態方法public boolean isLive() {return state == LIVE;}public boolean isLDend() {return state == DEND;}//取圖的方法 第一步public abstract ImageIcon getImage();//第二步、將取到的圖片畫到窗口 這個對象 的 getImage(取圖片)圖片 的 畫到 painImagepublic void PantImage(Graphics g) {if (isLive()) {this.getImage().paintIcon(null, g, this.x, this.y);}}//數據越界的public boolean outOfBounds() {return this.x >= SubmarineObject.Test.WIDTH;}//碰撞+ this 潛艇,ssb炸彈public boolean collideAction(SaeSubmarine ssb){int x1=this.x-ssb.width;int x2=this.x+this.width;int y1=this.y-ssb.height;int y2=this.y+this.height;int x=ssb.x;int y=ssb.y;return x>=x1 &&x<=x2 && y>=y1 &&y<=y2;}//+消失的public int colliDend(){return state=DEND;} }倆接口+圖片類
public interface InputLive {public int inputLive(); } ---------------------------------------接口1 public interface InputScore {public int inputScore(); } --------------------------------------接口2 public class images {public static ImageIcon battleship;public static ImageIcon minesubm;public static ImageIcon obsersubm;public static ImageIcon torpesubm;public static ImageIcon Gameover;public static ImageIcon sea;public static ImageIcon mine;public static ImageIcon bomb;static {battleship = new ImageIcon("src/img/battleship.png");minesubm = new ImageIcon("src/img/minesubm.png");obsersubm = new ImageIcon("src/img/obsersubm.png");torpesubm = new ImageIcon("src/img/torpesubm.png");Gameover = new ImageIcon("src/img/Gameover.png");sea = new ImageIcon("src/img/sea.png");mine = new ImageIcon("src/img/mine.png");bomb = new ImageIcon("src/img/bomb.png");} }6個子類
//戰艇類 public class BattleShip extends SaeSubmarine {int life;//構造方法初始化數據public BattleShip() {super(66, 26, 270, 124, 20);this.life=5;}@Overridepublic void move() {System.out.println(width+"\t"+height+"\t"+x+"\t"+y+"\t"+speed+"\t"+"發射炸彈!");}@Overridepublic ImageIcon getImage() {return images.battleship;}public Bomb nextBome(){return new Bomb(this.x,this.y);}public void liftMove(){x-=speed;}public void rightMove(){x+=speed;}//獲取life,顯示用public int getLife(){return life;}//添加生命public int addLife(int num){return life+=num;}public int minusLife(){return life--;} } --------------------------------------------------------------- public class Bomb extends SaeSubmarine {Bomb(int x, int y) {super(9, 12, x, y, 3);}@Overridepublic void move() {y+=speed;System.out.println(width+"\t"+height+"\t"+x+"\t"+y+"\t"+speed+"\t"+"發射炸彈!");}@Overridepublic ImageIcon getImage() {return images.bomb;}//數據越界的public boolean outOfBounds() {return this.y >= SubmarineObject.Test.HEIGNT;} } ----------------------------------------------------------------- public class Mine extends SaeSubmarine {Mine(int x, int y) {super(9, 12, x, y, 3);}@Overridepublic void move() {y-=speed;System.out.println(width+"\t"+height+"\t"+x+"\t"+y+"\t"+speed+"\t"+"發射炸彈!");}@Overridepublic ImageIcon getImage() {return images.mine;}//數據越界的public boolean outOfBounds() {return this.y <= 150-this.height;} } ----------------------------------------------------------------- public class ObserverSubmarine extends SaeSubmarine implements InputScore {public ObserverSubmarine() {super(63, 19);}@Overridepublic void move() {x+=speed;System.out.println(width+"\t"+height+"\t"+x+"\t"+y+"\t"+speed+"\t"+"發射炸彈!");}/*偵察潛艇: 寬63高19,x設置初始 為-x, y位置是隨機的,速度*/@Overridepublic ImageIcon getImage() {return images.obsersubm;}@Overridepublic int inputScore() {return 10;} } ----------------------------------------------------------------- public class TorpedoSubmarine extends SaeSubmarine implements InputScore {public TorpedoSubmarine() {super(64, 20);}@Overridepublic void move() {x+=speed;System.out.println(width+"\t"+height+"\t"+x+"\t"+y+"\t"+speed+"\t"+"發射炸彈!");}/*魚雷潛艇: 寬63高19,x設置初始 為-x, y位置是隨機的,速度*/@Overridepublic ImageIcon getImage() {return images.torpesubm;}@Overridepublic int inputScore() {return 40;} } ---------------------------------------------------------------- public class MineSubmarine extends SaeSubmarine implements InputLive {/*水雷潛艇: 寬63高19,x設置初始 為-x, y位置是隨機的,速度*/public MineSubmarine() {super(63, 19);}@Overridepublic void move() {x+=speed;System.out.println(width+"\t"+height+"\t"+x+"\t"+y+"\t"+speed+"\t"+"發射炸彈!");}@Overridepublic ImageIcon getImage() {return images.minesubm;}public Mine NextMine(){int x = this.x+this.width; //x:水雷潛艇的x+水雷潛艇的寬int y = this.y-5; //y:水雷潛艇的y-固定的5return new Mine(x,y); //返回水雷對象}@Overridepublic int inputLive() {return 1;} }學自王克晶老師:
https://blog.csdn.net/jason13579?type=blog
總結
- 上一篇: NO 00004 iOS实现打砖块游戏
- 下一篇: 【TS】泛型 Generics