JAVA小项目潜艇大战_java潜艇大战-程序员宅基地

技术标签: java  后端  开发语言  

一、第一天

1、创建战舰、侦察潜艇、鱼雷潜艇、水雷潜艇、水雷、深水炸弹类

完整代码:

package day01;
//战舰
public class Battleship {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    int life;

    void move(){
    
        System.out.println("战舰移动");
    }
}
package day01;
//侦察潜艇
public class ObserveSubmarine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    void move(){
    
        System.out.println("侦察潜艇x向右移动");
    }
}
package day01;
//鱼雷潜艇
public class TorpedoSubmarine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    void move(){
    
        System.out.println("鱼雷潜艇x向右移动");
    }
}
package day01;
//水雷潜艇
public class MineSubmarine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    void move(){
    
        System.out.println("水雷潜艇x向右移动");
    }
}
package day01;
//水雷
public class Mine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    void move(){
    
        System.out.println("水雷y向上移动");
    }
}
package day01;
//深水炸弹
public class Bomb {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    void move(){
    
        System.out.println("深水炸弹y向下移动");
    }
}

2、创建World类并测试

完整代码:

package day01;
/** 整个游戏世界 */
public class World {
    
    public static void main(String[] args) {
    
        Battleship s = new Battleship();
        s.width = 50;
        s.height = 30;
        s.x = 100;
        s.y = 200;
        s.speed = 20;
        s.life = 5;
        System.out.println(s.width+","+s.height+","+s.x+","+s.y+","+s.speed+","+s.life);
        s.move();

        ObserveSubmarine os1 = new ObserveSubmarine();
        os1.width = 30;
        os1.height = 40;
        os1.x = 200;
        os1.y = 400;
        os1.speed = 3;
        System.out.println(os1.width+","+os1.height+","+os1.x+","+os1.y+","+os1.speed);
        os1.move();

        ObserveSubmarine os2 = new ObserveSubmarine();
        os2.width = 30;
        os2.height = 40;
        os2.x = 100;
        os2.y = 450;
        os2.speed = 3;
        System.out.println(os2.width+","+os2.height+","+os2.x+","+os2.y+","+os2.speed);
        os2.move();

        TorpedoSubmarine ts1 = new TorpedoSubmarine();
        TorpedoSubmarine ts2 = new TorpedoSubmarine();
        MineSubmarine ms1 = new MineSubmarine();
        MineSubmarine ms2 = new MineSubmarine();
        Torpedo t1 = new Torpedo();
        Torpedo t2 = new Torpedo();
        Mine m1 = new Mine();
        Mine m2 = new Mine();
        Bomb b1 = new Bomb();
        Bomb b2 = new Bomb();
    }
}

二、第二天

给6个类添加构造方法,并测试

完整代码:

package day02;
//战舰
public class Battleship {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    int life;
    Battleship(){
    
        width = 66;
        height = 26;
        x = 270;
        y = 124;
        speed = 2;
        life = 5;
    }

    void move(){
    
        System.out.println("战舰移动");
    }
}

package day02;
import java.util.Random;
//侦察潜艇
public class ObserveSubmarine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    ObserveSubmarine(){
    
        width = 63;
        height = 19;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    void move(){
    
        System.out.println("侦察潜艇x向右移动");
    }
}

package day02;
import java.util.Random;
//鱼雷潜艇
public class TorpedoSubmarine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    TorpedoSubmarine(){
    
        width = 64;
        height = 20;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    void move(){
    
        System.out.println("鱼雷潜艇x向右移动");
    }
}

package day02;
import java.util.Random;
//水雷潜艇
public class MineSubmarine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    MineSubmarine(){
    
        width = 63;
        height = 19;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    void move(){
    
        System.out.println("水雷潜艇x向右移动");
    }
}

package day02;
//水雷
public class Mine {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    Mine(int x,int y){
    
        width = 11;
        height = 11;
        this.x = x;
        this.y = y;
        speed = 1;
    }
    void move(){
    
        System.out.println("水雷y向上移动");
    }
}

package day02;
//深水炸弹
public class Bomb {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    Bomb(int x,int y){
    
        width = 9;
        height = 12;
        this.x = x;
        this.y = y;
        speed = 3;
    }

    void move(){
    
        System.out.println("深水炸弹y向下移动");
    }
}

package day02;
/** 整个游戏世界 */
public class World {
    
    public static void main(String[] args) {
    
        Battleship s = new Battleship();
        ObserveSubmarine os1 = new ObserveSubmarine();
        ObserveSubmarine os2 = new ObserveSubmarine();
        TorpedoSubmarine ts1 = new TorpedoSubmarine();
        TorpedoSubmarine ts2 = new TorpedoSubmarine();
        MineSubmarine ms1 = new MineSubmarine();
        MineSubmarine ms2 = new MineSubmarine();
        Mine m1 = new Mine(123,345);
        Mine m2 = new Mine(345,234);
        Bomb b1 = new Bomb(200,300);
        Bomb b2 = new Bomb(300,400);
        //最少输出4个对象的数据(一定要包括2个侦察潜艇的数据)
        System.out.println(s.width+","+s.height+","+s.x+","+s.y+","+s.speed+","+s.life);
        System.out.println(os1.width+","+os1.height+","+os1.x+","+os1.y+","+os1.speed);
        System.out.println(os2.width+","+os2.height+","+os2.x+","+os2.y+","+os2.speed);

        Bomb[] bs = new Bomb[3]; //创建Bomb数组对象
        bs[0] = new Bomb(100,200); //创建Bomb对象
        bs[1] = new Bomb(123,345);
        bs[2] = new Bomb(200,300);
        bs[0].x = 111; //给第1个炸弹的x修改为111
        System.out.println(bs[1].width); //输出第2个炸弹的宽
        bs[2].move(); //第3个炸弹移动
    }
}

三、第三天

1、创建侦察艇数组、鱼雷艇数组、水雷艇数组、水雷数组、深水炸弹数组,并测试

完整代码:

package day03;
/** 整个游戏世界 */
public class World {
    
    public static void main(String[] args) {
    
        ObserveSubmarine[] oses = new ObserveSubmarine[3];
        TorpedoSubmarine[] tses = new TorpedoSubmarine[2];
        MineSubmarine[] mses = new MineSubmarine[3]; //水雷潜艇数组
        mses[0] = new MineSubmarine();
        mses[1] = new MineSubmarine();
        mses[2] = new MineSubmarine();
        for(int i=0;i<mses.length;i++){
     //遍历所有水雷潜艇
            System.out.println(mses[i].x+","+mses[i].y); //输出每个水雷潜艇的x和y坐标
            mses[i].move(); //每个水雷潜艇移动
        }

        Torpedo[] ts = new Torpedo[2]; //鱼雷数组
        ts[0] = new Torpedo(100,200);
        ts[1] = new Torpedo(200,400);
        for(int i=0;i<ts.length;i++){
    
            System.out.println(ts[i].x+","+ts[i].y);
            ts[i].move();
        }
        Mine[] ms = new Mine[3];
        Bomb[] bs = new Bomb[2];

    }
}

2、创建SeaObject超类,6个类继承超类

完整代码:

package day03;
import java.util.Random;
//海洋对象
public class SeaObject {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    void move(){
    
        System.out.println("海洋对象移动");
    }
}

package day03;
//战舰
public class Battleship extends SeaObject {
    
    int life;
    Battleship(){
    
        width = 66;
        height = 26;
        x = 270;
        y = 124;
        speed = 20;
        life = 5;
    }
}

package day03;
import java.util.Random;
//侦察潜艇
public class ObserveSubmarine extends SeaObject {
    
    ObserveSubmarine(){
    
        width = 63;
        height = 19;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
}

package day03;
import java.util.Random;
//鱼雷潜艇
public class TorpedoSubmarine extends SeaObject {
    
    TorpedoSubmarine(){
    
        width = 64;
        height = 20;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
}

package day03;
import java.util.Random;
//水雷潜艇
public class MineSubmarine extends SeaObject {
    
    MineSubmarine(){
    
        width = 63;
        height = 19;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
}

package day03;
//水雷
public class Mine extends SeaObject {
    
    Mine(int x,int y){
    
        width = 11;
        height = 11;
        this.x = x;
        this.y = y;
        speed = 1;
    }
}


package day03;
//深水炸弹
public class Bomb extends SeaObject {
    
    Bomb(int x,int y){
    
        width = 9;
        height = 12;
        this.x = x;
        this.y = y;
        speed = 3;
    }
}

//注:其余类没有变化,此处省略

3、给SeaObject添加两个构造方法,6个类继承超类

完整代码:

package day03;
import java.util.Random;
//海洋对象
public class SeaObject {
    
    int width;
    int height;
    int x;
    int y;
    int speed;
    SeaObject(int width,int height){
    
        this.width = width;
        this.height = height;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    SeaObject(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;
    }

    void move(){
    
        System.out.println("海洋对象移动");
    }
}

package day03;
//侦察潜艇
public class ObserveSubmarine extends SeaObject {
    
    ObserveSubmarine(){
    
        super(63,19);
    }
}

package day03;
//鱼雷潜艇
public class TorpedoSubmarine extends SeaObject {
    
    TorpedoSubmarine(){
    
        super(64,20);
    }
}

package day03;
//水雷潜艇
public class MineSubmarine extends SeaObject {
    
    MineSubmarine(){
    
        super(63,19);
    }
}

package day03;
//战舰
public class Battleship extends SeaObject {
    
    int life;
    Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }
}

package day03;
//水雷
public class Mine extends SeaObject {
    
    Mine(int x,int y){
    
        super(11,11,x,y,1);
    }
}

package day03;
//深水炸弹
public class Bomb extends SeaObject {
    
    Bomb(int x,int y){
    
        super(9,12,x,y,3);
    }
}

//注:其余类没有变化,此处省略

4、将侦察艇数组、鱼雷艇数组、水雷艇数组组合为SeaObject数组,并测试

package day03;
//整个游戏世界
public class World {
    
    public static void main(String[] args) {
    
        SeaObject[] submarines = new SeaObject[5]; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
        submarines[0] = new ObserveSubmarine();
        submarines[1] = new ObserveSubmarine();
        submarines[2] = new TorpedoSubmarine();
        submarines[3] = new TorpedoSubmarine();
        submarines[4] = new MineSubmarine();
        for(int i=0;i<submarines.length;i++){
    
            System.out.println(submarines[i].x+","+submarines[i].y);
            submarines[i].move();
        }

        Battleship s = new Battleship();

        Mine[] ms = new Mine[2];
        ms[0] = new Mine(100,200);
        ms[1] = new Mine(200,400);
        for(int i=0;i<ms.length;i++){
    
            System.out.println(ms[i].x+","+ms[i].y);
            ms[i].move();
        }

        Bomb[] bs = new Bomb[2];
        bs[0] = new Bomb(100,200);
        bs[1] = new Bomb(200,400);
        for(int i=0;i<bs.length;i++){
    
            System.out.println(bs[i].x+","+bs[i].y);
            bs[i].move();
        }
    }
}

//注:其余类没有变化,此处省略

四、第四天

1、重写超类的move()移动

完整代码:

package day04;
//战舰
public class Battleship extends SeaObject {
    
    int life;
    Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }
    void move(){
    
        //暂时搁置
    }
}

package day04;
//侦察潜艇
public class ObserveSubmarine extends SeaObject {
    
    ObserveSubmarine(){
    
        super(63,19);
    }
    void move(){
    
        x+=speed;
    }
}

package day04;
//鱼雷潜艇
public class TorpedoSubmarine extends SeaObject {
    
    TorpedoSubmarine(){
    
        super(64,20);
    }
    void move(){
    
        x+=speed;
    }
}

package day04;
//水雷潜艇
public class MineSubmarine extends SeaObject {
    
    MineSubmarine(){
    
        super(63,19);
    }
    void move(){
    
        x+=speed;
    }
}

package day04;
//水雷
public class Mine extends SeaObject {
    
    Mine(int x,int y){
    
        super(11,11,x,y,1);
    }
    void move(){
    
        y-=speed;
    }
}

package day04;
//深水炸弹
public class Bomb extends SeaObject {
    
    Bomb(int x,int y){
    
        super(9,12,x,y,3);
    }
    void move(){
    
        y+=speed;
    }
}

//注:其余类没有变化,此处省略

2、给类中成员添加访问控制修饰符

完整代码:

package day04;
import java.util.Random;
//海洋对象
public class SeaObject {
    
    protected int width;
    protected int height;
    protected int x;
    protected int y;
    protected int speed;
    public SeaObject(int width,int height){
    
        this.width = width;
        this.height = height;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(479-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    public SeaObject(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;
    }

    public void move(){
    
        System.out.println("海洋对象移动");
    }
}

package day04;
//战舰
public class Battleship extends SeaObject {
    
    private int life;
    public Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }
    public void move(){
    
        //暂时搁置
    }
}

package day04;
//侦察潜艇
public class ObserveSubmarine extends SeaObject {
    
    public ObserveSubmarine(){
    
        super(63,19);
    }
    public void move(){
    
        x+=speed;
    }
}

package day04;
//鱼雷潜艇
public class TorpedoSubmarine extends SeaObject {
    
    public TorpedoSubmarine(){
    
        super(64,20);
    }
    public void move(){
    
        x+=speed;
    }
}

package day04;
//水雷潜艇
public class MineSubmarine extends SeaObject {
    
    public MineSubmarine(){
    
        super(63,19);
    }
    public void move(){
    
        x+=speed;
    }
}

package day04;
//水雷
public class Mine extends SeaObject {
    
    public Mine(int x,int y){
    
        super(11,11,x,y,1);
    }
    public void move(){
    
        y-=speed;
    }
}

package day04;
//深水炸弹
public class Bomb extends SeaObject {
    
    public Bomb(int x,int y){
    
        super(9,12,x,y,3);
    }
    public void move(){
    
        y+=speed;
    }
}

//注:其余类没有变化,此处省略

3、设计Images图片类

完整代码:

package cn.tedu.submarine;
import javax.swing.ImageIcon;
/** 图片类 */
public class Images {
    
//  公开的  静态的  图片数据类型   变量名
    public static ImageIcon  battleship; //战舰图片
    public static ImageIcon  obsersubm;  //侦察潜艇图片
    public static ImageIcon  torpesubm;  //鱼雷潜艇图片
    public static ImageIcon  minesubm;   //水雷潜艇图片
    public static ImageIcon  mine;       //水雷图片
    public static ImageIcon  bomb;       //深水炸弹图片
    public static ImageIcon  sea;        //海洋图
    public static ImageIcon  gameover;   //游戏结束图

    static{
     //给静态图片赋值
        battleship = new ImageIcon("img/battleship.png");
        obsersubm = new ImageIcon("img/obsersubm.png");
        torpesubm = new ImageIcon("img/torpesubm.png");
        minesubm = new ImageIcon("img/minesubm.png");
        mine = new ImageIcon("img/mine.png");
        bomb = new ImageIcon("img/bomb.png");
        sea = new ImageIcon("img/sea.png");
        gameover = new ImageIcon("img/gameover.png");
    }

    public static void main(String[] args) {
    
        System.out.println(battleship.getImageLoadStatus()); //返回8表示读取成功
        System.out.println(obsersubm.getImageLoadStatus());
        System.out.println(torpesubm.getImageLoadStatus());
        System.out.println(minesubm.getImageLoadStatus());
        System.out.println(mine.getImageLoadStatus());
        System.out.println(bomb.getImageLoadStatus());
        System.out.println(sea.getImageLoadStatus());
        System.out.println(gameover.getImageLoadStatus());
    }
}
//注:其余类没有变化,此处省略

五、第五天

1、在World类中设计窗口的宽和高为常量,在SeaObject的两个参构造中将数据修改为常量

参考代码:

package day05;
//整个游戏世界
public class World {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;
    
    public static void main(String[] args) {
    
        SeaObject[] submarines = new SeaObject[5]; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
        submarines[0] = new ObserveSubmarine();
        submarines[1] = new ObserveSubmarine();
        submarines[2] = new TorpedoSubmarine();
        submarines[3] = new TorpedoSubmarine();
        submarines[4] = new MineSubmarine();
        for(int i=0;i<submarines.length;i++){
    
            System.out.println(submarines[i].x+","+submarines[i].y);
            submarines[i].move();
        }
        
        Battleship s = new Battleship();

        Mine[] ms = new Mine[2];
        ms[0] = new Mine(100,200);
        ms[1] = new Mine(200,400);
        for(int i=0;i<ms.length;i++){
    
            System.out.println(ms[i].x+","+ms[i].y);
            ms[i].move();
        }

        Bomb[] bs = new Bomb[2];
        bs[0] = new Bomb(100,200);
        bs[1] = new Bomb(200,400);
        for(int i=0;i<bs.length;i++){
    
            System.out.println(bs[i].x+","+bs[i].y);
            bs[i].move();
        }
    }
}

package day05;
import java.util.Random;
//海洋对象
public class SeaObject {
    
    protected int width;
    protected int height;
    protected int x;
    protected int y;
    protected int speed;
    public SeaObject(int width,int height){
    
        this.width = width;
        this.height = height;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(World.HEIGHT-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    public SeaObject(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;
    }

    public void move(){
    
        System.out.println("海洋对象移动");
    }
}

//注:其余类没有变化,此处省略

2、画窗口

参考代码:

package day05;
import javax.swing.JFrame;
import javax.swing.JPanel;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;
    
    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

//注:其余类没有变化,此处省略

3、画海洋图、画对象

  • 在超类中设计抽象方法getImage(),派生类中重写
  • 在超类中设计状态常量及当前状态变量,设计isLive()、isDead()判断状态
  • 在超类中设计paintImage()画图片
  • 在main中:准备对象、重写paint()调用paintImage()方法

参考代码:

package day05;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.util.Random;
//海洋对象
public abstract class SeaObject {
    
    public static final int LIVE = 0;
    public static final int DEAD = 1;
    protected int state = LIVE; //当前状态

    protected int width;
    protected int height;
    protected int x;
    protected int y;
    protected int speed;
    public SeaObject(int width,int height){
    
        this.width = width;
        this.height = height;
        x = width;
        Random rand = new Random();
        y = rand.nextInt(World.HEIGHT-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    public SeaObject(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;
    }

    public abstract void move();

    public abstract ImageIcon getImage();

    public boolean isLive(){
    
        return state==LIVE;
    }
    public boolean isDead(){
    
        return state==DEAD;
    }

    public void paintImage(Graphics g){
    
        if(isLive()){
    
            this.getImage().paintIcon(null,g,this.x,this.y);
        }
    }
}

package day05;
import javax.swing.ImageIcon;
//战舰
public class Battleship extends SeaObject {
    
    private int life;
    public Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }

    public void move(){
    
        System.out.println("战舰移动");
    }

    public ImageIcon getImage(){
    
        return Images.battleship;
    }
}

package day05;
import javax.swing.ImageIcon;
//侦察潜艇
public class ObserveSubmarine extends SeaObject {
    
    public ObserveSubmarine(){
    
        super(63,19);
    }

    public void move(){
    
        System.out.println("侦察潜艇x向右移动");
    }

    public ImageIcon getImage(){
    
        return Images.obsersubm;
    }
}

package day05;
import javax.swing.ImageIcon;
//鱼雷潜艇
public class TorpedoSubmarine extends SeaObject {
    
    public TorpedoSubmarine(){
    
        super(64,20);
    }

    public void move(){
    
        System.out.println("鱼雷潜艇x向右移动");
    }

    public ImageIcon getImage(){
    
        return Images.torpesubm;
    }
}

package day05;
import javax.swing.ImageIcon;
//水雷潜艇
public class MineSubmarine extends SeaObject {
    
    public MineSubmarine(){
    
        super(63,19);
    }

    public void move(){
    
        System.out.println("水雷潜艇x向右移动");
    }

    public ImageIcon getImage(){
    
        return Images.minesubm;
    }
}

package day05;
import javax.swing.ImageIcon;
//水雷
public class Mine extends SeaObject {
    
    public Mine(int x,int y){
    
        super(11,11,x,y,1);
    }

    public void move(){
    
        System.out.println("水雷y向上移动");
    }

    public ImageIcon getImage(){
    
        return Images.mine;
    }
}

package day05;
import javax.swing.ImageIcon;
//深水炸弹
public class Bomb extends SeaObject {
    
    public Bomb(int x,int y){
    
        super(9,12,x,y,3);
    }

    public void move(){
    
        System.out.println("深水炸弹y向下移动");
    }

    public ImageIcon getImage(){
    
        return Images.bomb;
    }
}

package day05;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    
            new ObserveSubmarine(),
            new TorpedoSubmarine(),
            new MineSubmarine()
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    
            new Mine(260,200)
    }; //水雷
    private Bomb[] bombs = {
    
            new Bomb(200,190)
    }; //深水炸弹

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
}

//注:其余类没有变化,此处省略

六、第六天

1、潜艇入场

完整代码:

package day06;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

2、水雷入场:

package day06;
import javax.swing.ImageIcon;
//水雷潜艇
public class MineSubmarine extends SeaObject {
    
    public MineSubmarine(){
    
        super(63,19);
    }

    public void move(){
    
        x+=speed;
    }

    public ImageIcon getImage(){
    
        return Images.minesubm;
    }

    /** 生成水雷对象 */
    public Mine shootMine(){
    
        int x = this.x+this.width; //x:潜艇的x+潜艇的宽
        int y = this.y-11;          //y:潜艇的y-11
        return new Mine(x,y);
    }
}

package day06;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            //如下代码暂时搁置-----第8天才讲到
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

3、海洋对象移动

完整代码:

package day06;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            //如下代码暂时搁置-----第8天才讲到
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

七、第七天

1、深水炸弹入场

完整代码:

package day07;
import javax.swing.ImageIcon;
//战舰
public class Battleship extends SeaObject {
    
    private int life;
    public Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }

    public void move(){
    
        System.out.println("战舰移动");
    }

    public ImageIcon getImage(){
    
        return Images.battleship;
    }

    public Bomb shoot(){
    
        return new Bomb(this.x,this.y);
    }
}

package day06;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            //如下代码暂时搁置-----第8天才讲到
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                    Bomb obj = ship.shoot(); //深水炸弹入场
                    bombs = Arrays.copyOf(bombs,bombs.length+1);
                    bombs[bombs.length-1] = obj;
                }
            }
        };
        this.addKeyListener(k);
        
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

2、战舰移动

完整代码:

package day07;
import javax.swing.ImageIcon;
//战舰
public class Battleship extends SeaObject {
    
    private int life;
    public Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }

    public void move(){
    
        System.out.println("战舰移动");
    }

    public ImageIcon getImage(){
    
        return Images.battleship;
    }

    public Bomb shoot(){
    
        return new Bomb(this.x,this.y);
    }

    public void moveLeft(){
    
        x-=speed;
    }
    public void moveRight(){
    
        x+=speed;
    }
}

package day07;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            //如下代码暂时搁置-----第8天才讲到
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                    Bomb obj = ship.shoot(); //深水炸弹入场
                    bombs = Arrays.copyOf(bombs,bombs.length+1);
                    bombs[bombs.length-1] = obj;
                }
                if(e.getKeyCode() == KeyEvent.VK_LEFT){
    
                    ship.moveLeft();
                }
                if(e.getKeyCode() == KeyEvent.VK_RIGHT){
    
                    ship.moveRight();;
                }
            }
        };
        this.addKeyListener(k);
        
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}
//注:其余类没有变化,此处省略

3、删除越界的海洋对象

完整代码:

package day07;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.util.Random;
//海洋对象
public abstract class SeaObject {
    
    public static final int LIVE = 0;
    public static final int DEAD = 1;
    protected int state = LIVE; //当前状态

    protected int width;
    protected int height;
    protected int x;
    protected int y;
    protected int speed;
    public SeaObject(int width,int height){
    
        this.width = width;
        this.height = height;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(World.HEIGHT-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    public SeaObject(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;
    }

    public abstract void move();

    public abstract ImageIcon getImage();

    public boolean isLive(){
    
        return state==LIVE;
    }
    public boolean isDead(){
    
        return state==DEAD;
    }

    public void paintImage(Graphics g){
    
        if(isLive()){
    
            this.getImage().paintIcon(null,g,x,y);
        }
    }

    /** 检测潜艇越界 */
    public boolean isOutOfBounds(){
    
        return x>= World.WIDTH; //x>=窗口宽,即为越界了
    }
}

package day07;
import javax.swing.ImageIcon;
//水雷
public class Mine extends SeaObject {
    
    public Mine(int x,int y){
    
        super(11,11,x,y,1);
    }

    public void move(){
    
        y-=speed;
    }

    public ImageIcon getImage(){
    
        return Images.mine;
    }

    /** 重写isOutOfBounds()检测水雷越界 */
    public boolean isOutOfBounds(){
    
        return y<=150-height; //y<=150减去水雷的高,即为越界了(到水面)
    }
}

package day07;
import javax.swing.ImageIcon;
//深水炸弹
public class Bomb extends SeaObject {
    
    public Bomb(int x,int y){
    
        super(9,12,x,y,3);
    }

    public void move(){
    
        y+=speed;
    }

    public ImageIcon getImage(){
    
        return Images.bomb;
    }

    /** 重写isOutOfBounds()检测深水炸弹越界 */
    public boolean isOutOfBounds(){
    
        return y>= World.HEIGHT; //y>=窗口的高,即为越界了
    }
}

package day07;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            //如下代码暂时搁置-----第8天才讲到
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }
    
    /** 删除越界的对象 */
    public void outOfBoundsAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            if(submarines[i].isOutOfBounds()){
    
                submarines[i] = submarines[submarines.length-1];
                submarines = Arrays.copyOf(submarines,submarines.length-1);
            }
        }

        for(int i=0;i<mines.length;i++){
    
            if(mines[i].isOutOfBounds()){
    
                mines[i] = mines[mines.length-1];
                mines = Arrays.copyOf(mines,mines.length-1);
            }
        }

        for(int i=0;i<bombs.length;i++){
    
            if(bombs[i].isOutOfBounds()){
    
                bombs[i] = bombs[bombs.length-1];
                bombs = Arrays.copyOf(bombs,bombs.length-1);
            }
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                    Bomb obj = ship.shoot(); //深水炸弹入场
                    bombs = Arrays.copyOf(bombs,bombs.length+1);
                    bombs[bombs.length-1] = obj;
                }
                if(e.getKeyCode() == KeyEvent.VK_LEFT){
    
                    ship.moveLeft();
                }
                if(e.getKeyCode() == KeyEvent.VK_RIGHT){
    
                    ship.moveRight();
                }
            }
        };
        this.addKeyListener(k);
        
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                outOfBoundsAction();    //删除越界的对象
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

4、设计EnemyScore接口、EnemyLife接口

完整代码:

package day07;
//得分接口
public interface EnemyScore {
    
    public int getScore();
}

package day07;
//奖励接口
public interface EnemyLife {
    
    public int getLife();
}

package day07;
import javax.swing.ImageIcon;
//侦察潜艇
public class ObserveSubmarine extends SeaObject implements EnemyScore {
    
    public ObserveSubmarine(){
    
        super(63,19);
    }

    public void move(){
    
        x+=speed;
    }

    public ImageIcon getImage(){
    
        return Images.obsersubm;
    }

    public int getScore(){
    
        return 10;
    }
}

package day07;
import javax.swing.ImageIcon;
//鱼雷潜艇
public class TorpedoSubmarine extends SeaObject implements EnemyScore {
    
    public TorpedoSubmarine(){
    
        super(64,20);
    }

    public void move(){
    
        x+=speed;
    }

    public ImageIcon getImage(){
    
        return Images.torpesubm;
    }

    public int getScore(){
    
        return 40;
    }
}

package day07;
import javax.swing.ImageIcon;
//水雷潜艇
public class MineSubmarine extends SeaObject implements EnemyLife {
    
    public MineSubmarine(){
    
        super(63,19);
    }

    public void move(){
    
        x+=speed;
    }

    public ImageIcon getImage(){
    
        return Images.minesubm;
    }

    public Mine shootMine(){
    
        int x = this.x+this.width; //x:潜艇的x+潜艇的宽
        int y = this.y-11;          //y:潜艇的y-11
        return new Mine(x,y);
    }

    public int getLife(){
    
        return 1;
    }
}

//注:其余类没有变化,此处省略

八、第八天

1、水雷入场:后半段

参考代码:

package cn.tedu.submarine;
import javax.swing.JFrame;
import javax.swing.JPanel; //1.
import java.awt.Graphics;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Random;
import java.util.Arrays;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

/** 整个游戏世界  */
public class World extends JPanel {
     //2.
    public static final int WIDTH = 641;  /** 窗口的宽 */
    public static final int HEIGHT = 479; /** 窗口的高 */

    //如下这一堆为窗口中所显示的对象
    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    };        //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)数组
    private Mine[] mines = {
    };                  //水雷数组
    private Bomb[] bombs = {
    };                  //深水炸弹数组

    /** 生成潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)对象 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random(); //随机数对象
        int type = rand.nextInt(20); //0到19
        if(type<10){
     //0到9时,返回侦察潜艇对象
            return new ObserveSubmarine();
        }else if(type<15){
     //10到14,返回鱼雷潜艇对象
            return new TorpedoSubmarine();
        }else{
     //15到19时,返回水雷潜艇对象
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0; //潜艇入场计数
    /** 潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++; //每10毫秒增1
        if(subEnterIndex%40==0) {
     //每400(40*10)毫秒走一次
            SeaObject obj = nextSubmarine(); //获取潜艇对象
            submarines = Arrays.copyOf(submarines,submarines.length+1); //扩容
            submarines[submarines.length-1] = obj; //将obj添加到submarines的最后一个元素上
        }
    }

    private int mineEnterIndex = 0; //水雷入场计数
    /** 水雷入场 */
    public void mineEnterAction(){
     //每10毫秒走一次
        mineEnterIndex++; //每10毫秒增1
        if(mineEnterIndex%100==0){
     //每1秒(100*10)走一次
            for(int i=0;i<submarines.length;i++){
     //遍历所有潜艇
                if(submarines[i] instanceof MineSubmarine){
     //若潜艇为水雷潜艇
                    MineSubmarine ms = (MineSubmarine)submarines[i]; //将潜艇强转为水雷潜艇类型
                    Mine obj = ms.shootMine(); //获取水雷对象
                    mines = Arrays.copyOf(mines,mines.length+1); //扩容
                    mines[mines.length-1] = obj; //将obj添加到最后一个元素上
                }
            }
        }
    }

    /** 海洋对象移动 */
    public void moveAction(){
     //每10毫秒走一次
        for(int i=0;i<submarines.length;i++){
     //遍历所有潜艇
            submarines[i].move(); //潜艇移动
        }
        for(int i=0;i<mines.length;i++){
     //遍历所有水雷
            mines[i].move(); //水雷移动
        }
        for(int i=0;i<bombs.length;i++){
     //遍历所有深水炸弹
            bombs[i].move(); //深水炸弹移动
        }
    }

    /** 删除越界的海洋对象 */
    public void outOfBoundsAction(){
     //每10毫秒走一次
        for(int i=0;i<submarines.length;i++){
     //遍历所有潜艇
            if(submarines[i].isOutOfBounds()){
     //越界了
                submarines[i] = submarines[submarines.length-1]; //将越界潜艇替换为最后一个元素
                submarines = Arrays.copyOf(submarines,submarines.length-1); //缩容(缩掉最后一个元素)
            }
        }

        for(int i=0;i<mines.length;i++){
     //遍历所有水雷
            if(mines[i].isOutOfBounds()){
     //越界了
                mines[i] = mines[mines.length-1]; //将越界水雷替换为最后一个元素
                mines = Arrays.copyOf(mines,mines.length-1); //缩容(缩掉最后一个元素)
            }
        }

        for(int i=0;i<bombs.length;i++){
     //遍历所有深水炸弹
            if(bombs[i].isOutOfBounds()){
     //越界了
                bombs[i] = bombs[bombs.length-1]; //将越界炸弹替换为最后一个元素
                bombs = Arrays.copyOf(bombs,bombs.length-1); //缩容(缩掉最后一个元素)
            }
        }
    }

    /** 启动程序的执行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter() {
     //不要求掌握
            /** 重写keyReleased()按键抬起事件 */
            public void keyReleased(KeyEvent e) {
     //当按键抬起时会自动触发--不要求掌握
                if(e.getKeyCode()==KeyEvent.VK_SPACE){
     //若抬起的是空格键--不要求掌握
                    Bomb obj = ship.shoot(); //获取深水炸弹对象
                    bombs = Arrays.copyOf(bombs,bombs.length+1); //扩容
                    bombs[bombs.length-1] = obj; //将obj添加到bombs的最后一个元素上
                }
                if(e.getKeyCode()==KeyEvent.VK_LEFT){
     //若抬起的是左键头--不要求掌握
                    ship.moveLeft(); //战舰左移
                }
                if(e.getKeyCode()==KeyEvent.VK_RIGHT){
     //若抬起的是右键头--不要求掌握
                    ship.moveRight(); //战舰右移
                }
            }
        };
        this.addKeyListener(k); //不要求掌握

        Timer timer = new Timer(); //定时器对象
        int interval = 10; //定时间隔(以毫秒为单位)
        timer.schedule(new TimerTask() {
    
            public void run() {
     //定时干的事(每10毫秒自动发生)
                submarineEnterAction(); //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)入场
                mineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                outOfBoundsAction();    //删除越界的海洋对象
                repaint();              //重画(重新调用paint()画)
            }
        }, interval, interval); //定时计划
    }

    /** 重写paint()画  g:画笔 */
    public void paint(Graphics g){
     //每10毫秒走一次
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g); //画战舰
        for(int i=0;i<submarines.length;i++){
     //遍历潜艇数组
            submarines[i].paintImage(g); //画潜艇
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }
    
    public static void main(String[] args) {
    
        JFrame frame = new JFrame(); //3.
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true); //1)设置窗口可见  2)尽快调用paint()方法

        world.action(); //启动程序的执行
    }
}

//注:其余类没有变化,此处省略

2、深水炸弹与潜艇的碰撞

参考代码:

package day08;
import javax.swing.ImageIcon;
import java.awt.Graphics;
import java.util.Random;
//海洋对象
public abstract class SeaObject {
    
    public static final int LIVE = 0;
    public static final int DEAD = 1;
    protected int state = LIVE; //当前状态

    protected int width;
    protected int height;
    protected int x;
    protected int y;
    protected int speed;
    public SeaObject(int width,int height){
    
        this.width = width;
        this.height = height;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(World.HEIGHT-height-150)+150;
        speed = rand.nextInt(3)+1;
    }
    public SeaObject(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;
    }

    public abstract void move();

    public abstract ImageIcon getImage();

    public boolean isLive(){
    
        return state==LIVE;
    }
    public boolean isDead(){
    
        return state==DEAD;
    }

    public void paintImage(Graphics g){
    
        if(isLive()){
    
            this.getImage().paintIcon(null,g,x,y);
        }
    }

    /** 检测潜艇越界 */
    public boolean isOutOfBounds(){
    
        return x>= World.WIDTH; //x>=窗口宽,即为越界了
    }
    
    /** 检测碰撞 */
    public boolean isHit(SeaObject other){
    
        //假设this指代潜艇,other指代炸弹
        int x1 = this.x-other.width;  //x1:潜艇的x-炸弹的宽
        int x2 = this.x+this.width;   //x2:潜艇的x+潜艇的宽
        int y1 = this.y-other.height; //y1:潜艇的y-炸弹的高
        int y2 = this.y+this.height;  //y2:潜艇的y+潜艇的高
        int x = other.x; //x:炸弹的x
        int y = other.y; //y:炸弹的y

        return x>=x1 && x<=x2
               &&
               y>=y1 && y<=y2; //x在x1与x2之间,并且,y在y1与y2之间,即为撞上了
    }

    /** 飞行物去死 */
    public void goDead(){
    
        state = DEAD; //将状态修改为DEAD死了的
    }
}

package day08;
import javax.swing.ImageIcon;
//战舰
public class Battleship extends SeaObject {
    
    private int life;
    public Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }

    public void step(){
    
        System.out.println("战舰移动");
    }

    public ImageIcon getImage(){
    
        return Images.battleship;
    }

    public Bomb shoot(){
    
        return new Bomb(this.x,this.y);
    }

    public void moveLeft(){
    
        x-=speed;
    }
    public void moveRight(){
    
        x+=speed;
    }
    
    public void addLife(int num){
    
        life += num;
    }
}

package day08;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            for(int i=0;i<submarines.length;i++){
    
                if(submarines[i] instanceof MineSubmarine){
    
                    MineSubmarine ms = (MineSubmarine)submarines[i];
                    Mine obj = ms.shootMine();
                    mines = Arrays.copyOf(mines,mines.length+1);
                    mines[mines.length-1] = obj;
                }
            }
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }
    
    /** 删除越界的对象 */
    public void outOfBoundsAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            if(submarines[i].isOutOfBounds() || submarines[i].isDead()){
    
                submarines[i] = submarines[submarines.length-1];
                submarines = Arrays.copyOf(submarines,submarines.length-1);
            }
        }

        for(int i=0;i<mines.length;i++){
    
            if(mines[i].isOutOfBounds() || mines[i].isDead()){
    
                mines[i] = mines[mines.length-1];
                mines = Arrays.copyOf(mines,mines.length-1);
            }
        }

        for(int i=0;i<bombs.length;i++){
    
            if(bombs[i].isOutOfBounds() || bombs[i].isDead()){
    
                bombs[i] = bombs[bombs.length-1];
                bombs = Arrays.copyOf(bombs,bombs.length-1);
            }
        }
    }
    
    private int score = 0; //玩家得分
    //深水炸弹与潜艇的碰撞
    public void bombBangAction(){
    
        for(int i=0;i<bombs.length;i++){
    
            Bomb b = bombs[i];
            for(int j=0;j<submarines.length;j++){
    
                SeaObject s = submarines[j];
                if(b.isLive() && s.isLive() && s.isHit(b)){
    
                    b.goDead();
                    s.goDead();
                    if(s instanceof EnemyScore){
    
                        EnemyScore es = (EnemyScore)s;
                        score += es.getScore();
                    }
                    if(s instanceof EnemyLife){
    
                        EnemyLife ea = (EnemyLife)s;
                        int num = ea.getLife();
                        ship.addLife(num);
                    }
                }
            }
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                    Bomb obj = ship.shoot(); //深水炸弹入场
                    bombs = Arrays.copyOf(bombs,bombs.length+1);
                    bombs[bombs.length-1] = obj;
                }
                if(e.getKeyCode() == KeyEvent.VK_LEFT){
    
                    ship.moveLeft();
                }
                if(e.getKeyCode() == KeyEvent.VK_RIGHT){
    
                    ship.moveRight();
                }
            }
        };
        this.addKeyListener(k);
        
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                outOfBoundsAction();    //删除越界的对象
                bombBangAction();       //深水炸弹与潜艇的碰撞
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

3、画分和画命

参考代码:

package day08;
import javax.swing.ImageIcon;
//战舰
public class Battleship extends SeaObject {
    
    private int life;
    public Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }

    public void step(){
    
        System.out.println("战舰移动");
    }

    public ImageIcon getImage(){
    
        return Images.battleship;
    }

    public Bomb shoot(){
    
        return new Bomb(this.x,this.y);
    }

    public void moveLeft(){
    
        x-=speed;
    }
    public void moveRight(){
    
        x+=speed;
    }

    public void addLife(int num){
    
        life += num;
    }
    
    public int getLife(){
    
        return life;
    }
}

package day08;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            for(int i=0;i<submarines.length;i++){
    
                if(submarines[i] instanceof MineSubmarine){
    
                    MineSubmarine ms = (MineSubmarine)submarines[i];
                    Mine obj = ms.shootMine();
                    mines = Arrays.copyOf(mines,mines.length+1);
                    mines[mines.length-1] = obj;
                }
            }
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }
    
    /** 删除越界的对象 */
    public void outOfBoundsAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            if(submarines[i].isOutOfBounds() || submarines[i].isDead()){
    
                submarines[i] = submarines[submarines.length-1];
                submarines = Arrays.copyOf(submarines,submarines.length-1);
            }
        }

        for(int i=0;i<mines.length;i++){
    
            if(mines[i].isOutOfBounds() || mines[i].isDead()){
    
                mines[i] = mines[mines.length-1];
                mines = Arrays.copyOf(mines,mines.length-1);
            }
        }

        for(int i=0;i<bombs.length;i++){
    
            if(bombs[i].isOutOfBounds() || bombs[i].isDead()){
    
                bombs[i] = bombs[bombs.length-1];
                bombs = Arrays.copyOf(bombs,bombs.length-1);
            }
        }
    }
    
    private int score = 0; //玩家得分
    //深水炸弹与潜艇的碰撞
    public void bombBangAction(){
    
        for(int i=0;i<bombs.length;i++){
    
            Bomb b = bombs[i];
            for(int j=0;j<submarines.length;j++){
    
                SeaObject s = submarines[j];
                if(b.isLive() && s.isLive() && s.isHit(b)){
    
                    b.goDead();
                    s.goDead();
                    if(s instanceof EnemyScore){
    
                        EnemyScore es = (EnemyScore)s;
                        score += es.getScore();
                    }
                    if(s instanceof EnemyLife){
    
                        EnemyLife ea = (EnemyLife)s;
                        int num = ea.getLife();
                        ship.addLife(num);
                    }
                }
            }
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                    Bomb obj = ship.shoot(); //深水炸弹入场
                    bombs = Arrays.copyOf(bombs,bombs.length+1);
                    bombs[bombs.length-1] = obj;
                }
                if(e.getKeyCode() == KeyEvent.VK_LEFT){
    
                    ship.moveLeft();
                }
                if(e.getKeyCode() == KeyEvent.VK_RIGHT){
    
                    ship.moveRight();
                }
            }
        };
        this.addKeyListener(k);
        
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                outOfBoundsAction();    //删除越界的对象
                bombBangAction();       //深水炸弹与潜艇的碰撞
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
        
        g.drawString("SCORE: "+score,200,50);
        g.drawString("LIFE: "+ship.getLife(),400,50);
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

九、第九天

1、水雷与战舰的碰撞

完整代码:

package day09;
import javax.swing.ImageIcon;
//战舰
public class Battleship extends SeaObject {
    
    private int life;
    public Battleship(){
    
        super(66,26,270,124,20);
        life = 5;
    }

    public void step(){
    
        
    }

    public ImageIcon getImage(){
    
        return Images.battleship;
    }

    public Bomb shoot(){
    
        return new Bomb(this.x,this.y);
    }

    public void moveLeft(){
    
        x-=speed;
    }
    public void moveRight(){
    
        x+=speed;
    }

    public void addLife(int num){
    
        life += num;
    }
    
    public int getLife(){
    
        return life;
    }
    
    public void subtractLife(){
    
        life--;
    }
}

package day09;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            for(int i=0;i<submarines.length;i++){
    
                if(submarines[i] instanceof MineSubmarine){
    
                    MineSubmarine ms = (MineSubmarine)submarines[i];
                    Mine obj = ms.shootMine();
                    mines = Arrays.copyOf(mines,mines.length+1);
                    mines[mines.length-1] = obj;
                }
            }
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }
    
    /** 删除越界的对象 */
    public void outOfBoundsAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            if(submarines[i].isOutOfBounds() || submarines[i].isDead()){
    
                submarines[i] = submarines[submarines.length-1];
                submarines = Arrays.copyOf(submarines,submarines.length-1);
            }
        }

        for(int i=0;i<mines.length;i++){
    
            if(mines[i].isOutOfBounds() || mines[i].isDead()){
    
                mines[i] = mines[mines.length-1];
                mines = Arrays.copyOf(mines,mines.length-1);
            }
        }

        for(int i=0;i<bombs.length;i++){
    
            if(bombs[i].isOutOfBounds() || bombs[i].isDead()){
    
                bombs[i] = bombs[bombs.length-1];
                bombs = Arrays.copyOf(bombs,bombs.length-1);
            }
        }
    }
    
    private int score = 0; //玩家得分
    //深水炸弹与潜艇的碰撞
    public void bombBangAction(){
    
        for(int i=0;i<bombs.length;i++){
    
            Bomb b = bombs[i];
            for(int j=0;j<submarines.length;j++){
    
                SeaObject s = submarines[j];
                if(b.isLive() && s.isLive() && s.isHit(b)){
    
                    b.goDead();
                    s.goDead();
                    if(s instanceof EnemyScore){
    
                        EnemyScore es = (EnemyScore)s;
                        score += es.getScore();
                    }
                    if(s instanceof EnemyLife){
    
                        EnemyLife ea = (EnemyLife)s;
                        int num = ea.getLife();
                        ship.addLife(num);
                    }
                }
            }
        }
    }
    
    //水雷与战舰的碰撞
    public void mineBangAction(){
    
        for(int i=0;i<mines.length;i++){
    
            Mine m = mines[i];
            if(m.isLive() && ship.isLive() && m.isHit(ship)){
    
                m.goDead();
                ship.subtractLife();
            }
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                    Bomb obj = ship.shoot(); //深水炸弹入场
                    bombs = Arrays.copyOf(bombs,bombs.length+1);
                    bombs[bombs.length-1] = obj;
                }
                if(e.getKeyCode() == KeyEvent.VK_LEFT){
    
                    ship.moveLeft();
                }
                if(e.getKeyCode() == KeyEvent.VK_RIGHT){
    
                    ship.moveRight();
                }
            }
        };
        this.addKeyListener(k);
        
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                outOfBoundsAction();    //删除越界的对象
                bombBangAction();       //深水炸弹与潜艇的碰撞
                mineBangAction();       //水雷与战舰的碰撞
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
        
        g.drawString("SCORE: "+score,200,50);
        g.drawString("LIFE: "+ship.getLife(),400,50);
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

2、检测游戏结束

完整代码:

package day09;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    /** 随机生成潜艇 */
    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    /** 潜艇入场 */
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
     //每40毫秒
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }
    
    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            for(int i=0;i<submarines.length;i++){
    
                if(submarines[i] instanceof MineSubmarine){
    
                    MineSubmarine ms = (MineSubmarine)submarines[i];
                    Mine obj = ms.shootMine();
                    mines = Arrays.copyOf(mines,mines.length+1);
                    mines[mines.length-1] = obj;
                }
            }
        }
    }
    
    /** 海洋对象移动 */
    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }
    
    /** 删除越界的对象 */
    public void outOfBoundsAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            if(submarines[i].isOutOfBounds() || submarines[i].isDead()){
    
                submarines[i] = submarines[submarines.length-1];
                submarines = Arrays.copyOf(submarines,submarines.length-1);
            }
        }

        for(int i=0;i<mines.length;i++){
    
            if(mines[i].isOutOfBounds() || mines[i].isDead()){
    
                mines[i] = mines[mines.length-1];
                mines = Arrays.copyOf(mines,mines.length-1);
            }
        }

        for(int i=0;i<bombs.length;i++){
    
            if(bombs[i].isOutOfBounds() || bombs[i].isDead()){
    
                bombs[i] = bombs[bombs.length-1];
                bombs = Arrays.copyOf(bombs,bombs.length-1);
            }
        }
    }
    
    private int score = 0; //玩家得分
    //深水炸弹与潜艇的碰撞
    public void bombBangAction(){
    
        for(int i=0;i<bombs.length;i++){
    
            Bomb b = bombs[i];
            for(int j=0;j<submarines.length;j++){
    
                SeaObject s = submarines[j];
                if(b.isLive() && s.isLive() && s.isHit(b)){
    
                    b.goDead();
                    s.goDead();
                    if(s instanceof EnemyScore){
    
                        EnemyScore es = (EnemyScore)s;
                        score += es.getScore();
                    }
                    if(s instanceof EnemyLife){
    
                        EnemyLife ea = (EnemyLife)s;
                        int num = ea.getLife();
                        ship.addLife(num);
                    }
                }
            }
        }
    }
    
    //水雷与战舰的碰撞
    public void mineBangAction(){
    
        for(int i=0;i<mines.length;i++){
    
            Mine m = mines[i];
            if(m.isLive() && ship.isLive() && m.isHit(ship)){
    
                m.goDead();
                ship.subtractLife();
            }
        }
    }
    
    /** 检测游戏结束 */
    public void checkGameOverAction(){
    
        if(ship.getLife()<=0){
    
            state = GAME_OVER;
        }
    }

    /** 启动程序的运行 */
    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                if(state==RUNNING){
    
                    if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                        Bomb obj = ship.shoot();
                        bombs = Arrays.copyOf(bombs,bombs.length+1);
                        bombs[bombs.length-1] = obj;
                    }
                    if(e.getKeyCode() == KeyEvent.VK_LEFT){
    
                        ship.moveLeft();
                    }
                    if(e.getKeyCode() == KeyEvent.VK_RIGHT){
    
                        ship.moveRight();;
                    }
                }
            }
        };
        this.addKeyListener(k);
        
        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                MineEnterAction();      //水雷入场
                moveAction();           //海洋对象移动
                outOfBoundsAction();    //删除越界的对象
                bombBangAction();       //深水炸弹与潜艇的碰撞
                mineBangAction();       //水雷与战舰的碰撞
                checkGameOverAction();  //检测游戏结束
                repaint();
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        Images.sea.paintIcon(null,g,0,0); //画海洋图
        ship.paintImage(g);
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].paintImage(g);
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].paintImage(g);
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].paintImage(g);
        }
        
        g.drawString("SCORE: "+score,200,50);
        g.drawString("LIFE: "+ship.getLife(),400,50);
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

3、画状态

完整代码:

package day09;
import javax.swing.ImageIcon;
//图片类
public class Images {
    
    public static ImageIcon battleship; //战舰
    public static ImageIcon bomb;       //深水炸弹
    public static ImageIcon obsersubm;  //侦察潜艇
    public static ImageIcon torpesubm;  //鱼雷潜艇
    public static ImageIcon minesubm;   //水雷潜艇
    public static ImageIcon torpedo;    //鱼雷
    public static ImageIcon mine;       //水雷
    public static ImageIcon sea;       //海洋图
    public static ImageIcon gameover;   //游戏结束图
    static{
    
        battleship = new ImageIcon("img/battleship.png");
        bomb = new ImageIcon("img/bomb.png");
        obsersubm = new ImageIcon("img/obsersubm.png");
        torpesubm = new ImageIcon("img/torpesubm.png");
        minesubm = new ImageIcon("img/minesubm.png");
        torpedo = new ImageIcon("img/torpedo.png");
        mine = new ImageIcon("img/mine.png");
        sea = new ImageIcon("img/sea.png");
        gameover = new ImageIcon("img/gameover.png");
    }

    public static void main(String[] args){
    
        System.out.println(battleship.getImageLoadStatus());
        System.out.println(bomb.getImageLoadStatus());
        System.out.println(obsersubm.getImageLoadStatus());
        System.out.println(torpesubm.getImageLoadStatus());
        System.out.println(minesubm.getImageLoadStatus());
        System.out.println(torpedo.getImageLoadStatus());
        System.out.println(mine.getImageLoadStatus());
        System.out.println(gameover.getImageLoadStatus());
    }
}

package day09;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.util.Arrays;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
//整个游戏世界
public class World extends JPanel {
    
    public static final int WIDTH = 641;
    public static final int HEIGHT = 479;

    public static final int RUNNING = 0;
    public static final int GAME_OVER = 1;
    private int state = RUNNING;

    private Battleship ship = new Battleship(); //战舰
    private SeaObject[] submarines = {
    }; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
    private Mine[] mines = {
    }; //水雷
    private Bomb[] bombs = {
    }; //深水炸弹


    public SeaObject nextSubmarine(){
    
        Random rand = new Random();
        int type = rand.nextInt(20);
        if(type<10){
    
            return new ObserveSubmarine();
        }else if(type<15){
    
            return new TorpedoSubmarine();
        }else{
    
            return new MineSubmarine();
        }
    }

    private int subEnterIndex = 0;
    public void submarineEnterAction(){
     //每10毫秒走一次
        subEnterIndex++;
        if(subEnterIndex%40==0){
    
            SeaObject obj = nextSubmarine();
            submarines = Arrays.copyOf(submarines,submarines.length+1);
            submarines[submarines.length-1] = obj;
        }
    }

    private int mineEnterIndex = 0;
    /** 雷(鱼雷、水雷)入场 */
    public void MineEnterAction(){
    
        mineEnterIndex++;
        if(mineEnterIndex%100==0){
    
            for(int i=0;i<submarines.length;i++){
    
                if(submarines[i] instanceof MineSubmarine){
    
                    MineSubmarine ms = (MineSubmarine)submarines[i];
                    Mine obj = ms.shootMine();
                    mines = Arrays.copyOf(mines,mines.length+1);
                    mines[mines.length-1] = obj;
                }
            }
        }
    }

    public void moveAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            submarines[i].move();
        }
        for(int i=0;i<mines.length;i++){
    
            mines[i].move();
        }
        for(int i=0;i<bombs.length;i++){
    
            bombs[i].move();
        }
    }

    //删除越界的对象
    public void outOfBoundsAction(){
    
        for(int i=0;i<submarines.length;i++){
    
            if(submarines[i].isOutOfBounds() || submarines[i].isDead()){
    
                submarines[i] = submarines[submarines.length-1];
                submarines = Arrays.copyOf(submarines,submarines.length-1);
            }
        }

        for(int i=0;i<mines.length;i++){
    
            if(mines[i].isOutOfBounds() || mines[i].isDead()){
    
                mines[i] = mines[mines.length-1];
                mines = Arrays.copyOf(mines,mines.length-1);
            }
        }

        for(int i=0;i<bombs.length;i++){
    
            if(bombs[i].isOutOfBounds() || bombs[i].isDead()){
    
                bombs[i] = bombs[bombs.length-1];
                bombs = Arrays.copyOf(bombs,bombs.length-1);
            }
        }
    }

    private int score = 0; //玩家得分
    //深水炸弹与潜艇的碰撞
    public void bombBangAction(){
    
        for(int i=0;i<bombs.length;i++){
    
            Bomb b = bombs[i];
            for(int j=0;j<submarines.length;j++){
    
                SeaObject s = submarines[j];
                if(b.isLive() && s.isLive() && s.isHit(b)){
    
                    b.goDead();
                    s.goDead();
                    if(s instanceof EnemyScore){
    
                        EnemyScore es = (EnemyScore)s;
                        score += es.getScore();
                    }
                    if(s instanceof EnemyLife){
    
                        EnemyLife ea = (EnemyLife)s;
                        int num = ea.getLife();
                        ship.addLife(num);
                    }
                }
            }
        }
    }

    //水雷与战舰的碰撞
    public void mineBangAction(){
    
        for(int i=0;i<mines.length;i++){
    
            Mine m = mines[i];
            if(m.isLive() && ship.isLive() && m.isHit(ship)){
    
                m.goDead();
                ship.subtractLife();
            }
        }
    }

    /** 检测游戏结束 */
    public void checkGameOverAction(){
    
        if(ship.getLife()<=0){
    
            state = GAME_OVER;
        }
    }

    public void action(){
    
        KeyAdapter k = new KeyAdapter(){
    
            public void keyPressed(KeyEvent e) {
    
                    if(e.getKeyCode() == KeyEvent.VK_SPACE){
    
                        Bomb obj = ship.shoot();
                        bombs = Arrays.copyOf(bombs,bombs.length+1);
                        bombs[bombs.length-1] = obj;
                    }
                    if(e.getKeyCode() == KeyEvent.VK_LEFT){
    
                        ship.moveLeft();
                    }
                    if(e.getKeyCode() == KeyEvent.VK_RIGHT){
    
                        ship.moveRight();;
                    }
            }
        };
        this.addKeyListener(k);

        Timer timer = new Timer();
        int interval = 10;
        timer.schedule(new TimerTask() {
    
            public void run() {
    
                submarineEnterAction(); //潜艇入场
                MineEnterAction();      //水雷入场
                moveAction();           //动
                outOfBoundsAction();    //删除越界的对象
                bombBangAction();       //深水炸弹撞潜艇
                mineBangAction();       //水雷与战舰的碰撞
                checkGameOverAction();  //检测游戏结束
                repaint();              //重画
            }
        }, interval, interval);
    }

    public void paint(Graphics g){
    
        switch(state){
    
            case GAME_OVER:
                Images.gameover.paintIcon(null,g,0,0);
                break;
            case RUNNING:
                Images.sea.paintIcon(null,g,0,0); //画海洋图
                ship.paintImage(g);
                for(int i=0;i<submarines.length;i++){
    
                    submarines[i].paintImage(g);
                }
                for(int i=0;i<mines.length;i++){
    
                    mines[i].paintImage(g);
                }
                for(int i=0;i<bombs.length;i++){
    
                    bombs[i].paintImage(g);
                }
                g.drawString("SCORE: "+score,200,50);
                g.drawString("LIFE: "+ship.getLife(),400,50);
        }
    }

    public static void main(String[] args) {
    
        JFrame frame = new JFrame();
        World world = new World();
        world.setFocusable(true);
        frame.add(world);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(WIDTH+16, HEIGHT+39);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        world.action();
    }
}

//注:其余类没有变化,此处省略

4、运行界面

游戏启动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-maqPrWwC-1642769396433)(C:\Users\TEDU\Desktop\QQ截图20220121204822.png)]

游戏结束

      if(b.isLive() && s.isLive() && s.isHit(b)){
                b.goDead();
                s.goDead();
                if(s instanceof EnemyScore){
                    EnemyScore es = (EnemyScore)s;
                    score += es.getScore();
                }
                if(s instanceof EnemyLife){
                    EnemyLife ea = (EnemyLife)s;
                    int num = ea.getLife();
                    ship.addLife(num);
                }
            }
        }
    }
}

//水雷与战舰的碰撞
public void mineBangAction(){
    for(int i=0;i<mines.length;i++){
        Mine m = mines[i];
        if(m.isLive() && ship.isLive() && m.isHit(ship)){
            m.goDead();
            ship.subtractLife();
        }
    }
}

/** 检测游戏结束 */
public void checkGameOverAction(){
    if(ship.getLife()<=0){
        state = GAME_OVER;
    }
}

public void action(){
    KeyAdapter k = new KeyAdapter(){
        public void keyPressed(KeyEvent e) {
                if(e.getKeyCode() == KeyEvent.VK_SPACE){
                    Bomb obj = ship.shoot();
                    bombs = Arrays.copyOf(bombs,bombs.length+1);
                    bombs[bombs.length-1] = obj;
                }
                if(e.getKeyCode() == KeyEvent.VK_LEFT){
                    ship.moveLeft();
                }
                if(e.getKeyCode() == KeyEvent.VK_RIGHT){
                    ship.moveRight();;
                }
        }
    };
    this.addKeyListener(k);

    Timer timer = new Timer();
    int interval = 10;
    timer.schedule(new TimerTask() {
        public void run() {
            submarineEnterAction(); //潜艇入场
            MineEnterAction();      //水雷入场
            moveAction();           //动
            outOfBoundsAction();    //删除越界的对象
            bombBangAction();       //深水炸弹撞潜艇
            mineBangAction();       //水雷与战舰的碰撞
            checkGameOverAction();  //检测游戏结束
            repaint();              //重画
        }
    }, interval, interval);
}

public void paint(Graphics g){
    switch(state){
        case GAME_OVER:
            Images.gameover.paintIcon(null,g,0,0);
            break;
        case RUNNING:
            Images.sea.paintIcon(null,g,0,0); //画海洋图
            ship.paintImage(g);
            for(int i=0;i<submarines.length;i++){
                submarines[i].paintImage(g);
            }
            for(int i=0;i<mines.length;i++){
                mines[i].paintImage(g);
            }
            for(int i=0;i<bombs.length;i++){
                bombs[i].paintImage(g);
            }
            g.drawString("SCORE: "+score,200,50);
            g.drawString("LIFE: "+ship.getLife(),400,50);
    }
}

public static void main(String[] args) {
    JFrame frame = new JFrame();
    World world = new World();
    world.setFocusable(true);
    frame.add(world);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WIDTH+16, HEIGHT+39);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
    world.action();
}

}

//注:其余类没有变化,此处省略

源代码在我的资源中

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_59219574/article/details/122629184

智能推荐

剑指 Offer(专项突击版)- 剑指 Offer II 052. 展平二叉搜索树(20220729)-程序员宅基地

文章浏览阅读95次。剑指 Offer II 052. 展平二叉搜索树

Xilinx AXI Interconnect_axi interconnect不同位宽-程序员宅基地

文章浏览阅读1.2w次,点赞12次,收藏118次。目录0、绪论1、AXI Crossbar1.1、几种可以选择的Crossbar 互联结构1.1.1、Crossbar mode (Performance Optimized)1.1.2、Shared Access mode (Area optimized)2、AXI Data Width Converter3、AXI Clock Converter4、AXI Pr..._axi interconnect不同位宽

Linux部署Django_Vue_linux 安装django vue3-程序员宅基地

文章浏览阅读340次。linux宝塔_linux 安装django vue3

win7访问smb文件服务器,win7系统配置smb服务器-程序员宅基地

文章浏览阅读1.3k次。win7系统配置smb服务器 内容精选换一换首次开机时,缺省进入遥控器配置向导界面。遥控器操作界面选择“系统设置 > 配置向导”,进入“配置向导”界面。网线连接:当终端有插入网线时,进入“LAN”界面(仅支持IPv4格式),如图3所示。请联系管理员获取网络配置方式,配置方式请参见表1。配置方式配置项操作自动获取终端通过DHCP(Dynamic Host Configuration操作系统镜像..._win7 设置smb访问方式

win10总显示打印机未连接服务器,win10系统打印机共享提示连接失败的解决方法...-程序员宅基地

文章浏览阅读1w次。win10系统打印机共享提示连接失败的解决方法?我们在操作win10系统电脑的时候,常常会遇到win10系统打印机共享提示连接失败的问题。那么出现win10系统打印机共享提示连接失败的问题该怎么解决呢?很多对电脑不太熟悉的小伙伴不知道win10系统打印机共享提示连接失败到底该如何解决?其实只需要通常打印机安装在一台电脑主机上,然后由别的电脑通过局域网共享这台打印机,首先要知道安装打印机的电脑主机的..._win10连接win10共享打印机一直打印机服务未开启

国密算法-SM4加解密工具类_sm4在线加密-程序员宅基地

文章浏览阅读7.5k次。国密算法-SM4加解密算法工具类_sm4在线加密

随便推点

CountDownLatch闭锁_countdownlatch illegate-程序员宅基地

文章浏览阅读176次。11_countdownlatch illegate

Android初步进阶之MVVM框架使用_android mvvm的进阶用法-程序员宅基地

文章浏览阅读199次。MVVM模式引入双向绑定。首先,看一看MVVM的模式的图示。![在这里插入图片描述](https://img-blog.csdnimg.cn/20201108124734892.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjUxNDE2Mg==,size_16,color_FFFFFF,t_70#pic_center_android mvvm的进阶用法

18家银行的数字化转型行动-程序员宅基地

文章浏览阅读2.1k次。1. 中国工商银行开始采用蚂蚁自研数据库OceanBase9月25日消息,中国工商银行开始采用蚂蚁自研数据库OceanBase,其对公(法人)理财系统已完成从大型主机到OceanBase分..._深交所云行情sdk

《数论概论》读书笔记(第二章)勾股数组_数论讲义读后感-程序员宅基地

文章浏览阅读1.2w次。本章主要讨论的是勾股数组,也就是关于满足a2+b2=c2a^2+b^2=c^2的三元组(a,b,c)(a,b,c)的问题。 这章中提到一个概念:本原勾股数组(PPT)是一个三元组(a,b,c)(a,b,c),其中a,b,ca,b,c没有公因子,且满足a2+b2=c2a^2+b^2=c^2,就是gcd(a,b,c)=1gcd(a,b,c)=1。 对于本原勾股数组,显然aa 和 bb 奇偶性不同只需_数论讲义读后感

android开发笔记之reflect使用_android reflect-程序员宅基地

文章浏览阅读810次。前言在看此文章前,请先查看下面几篇文章,理解一下reflect和Systemproperties系统属性的操作: 1.java核心技术之reflect(一):一个系统学习reflect的Demo(精) 2.github项目之读取系统属性 3.android开发笔记之system.prop使用(1)问题公司在搞应用apk化,也就是把android提供的应用导入androidstudio中,使用a_android reflect

Typora_Markdown_图片标题(题注)_markdown 图片标题-程序员宅基地

文章浏览阅读1.1w次,点赞39次,收藏52次。Typora图片标题(题注)总体有两种方法,一种是简单粗暴的,直接在图片下加文字作标题,而另一种是封装可拓展性强。1 直接下加标题图1 Typora-Logo代码如下:<img src="这里放图片路径" alt="这里放图片显示不出的时候出现的文字" style="zoom:这里写缩放的百分比,比如:30%"/><!--上面的是Typora默认的,不用自己写--><center><p>这里放标题</p>&_markdown 图片标题

推荐文章

热门文章

相关标签