欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

潜艇大作战

发布时间:2024/3/13 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 潜艇大作战 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

游戏测试类

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

总结

以上是生活随笔为你收集整理的潜艇大作战的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。