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

智能推荐

什么是编码和解码-程序员宅基地

文章浏览阅读9.8k次。举例说明_编码和解码

一文解决python的GUI--python程序员必会GUI库-神器PySimpleGUI良心总结_pysimplegui教程-程序员宅基地

文章浏览阅读1.3k次,点赞6次,收藏9次。import PySimpleGUI as sg def 总体说明(): #下面这个layout变量就是控件的集合,里面放空间 #将来我们直接把这个变量传到窗口(屏幕)那里 #你可以把它当作实际内容 #以下是个简单的例子 layout = [[sg.Text("要显示在窗口上的文字")], [sg.Button("完成")]] #他还有参数,你懂的:title='Options',etitle_color='rd', #sg.Win..._pysimplegui教程

基于docker swarm 的nacos集群_docker swarm nacos-程序员宅基地

文章浏览阅读2.6k次。10.1 集群搭建nacos集群 的部署依赖docker swarm 集群,部署之前请先将nacos实例所在的docker 节点加入swarm集群,配置方式如下:选择其中一台服务器做docker swrm的masterdocker swarm init验证:剩余主机加入swarm集群将上一步的输出信息红框部分命令到剩余主机上执行,加入swarm集群验证:在master中查看node信息:验证:nacos集群至少需要3台主机,由于nacos属于"有状态服务"因此需要保证一致性(通过配_docker swarm nacos

深入了解Flutter的isolate(2) --- 创建自己的isolate -程序员宅基地

文章浏览阅读1.8k次。0x00 前言Flutter的代码都是默认跑在root isolate上的,那么Flutter中能不能自己创建一个isolate呢?当然可以!,接下来我们就自己创建一个isolate!0x01 dart:isolate有关isolate的代码,都在isolate.dart文件中,里面有一个生成isolate的方法: external static Future&lt;Isolate&gt..._flutter的isolate创建过程

Linux系统设置Crontab定时任务_sueue 系统怎么生效crontab-程序员宅基地

文章浏览阅读101次。Linux系统设置Crontab定时任务创建一个sh脚本文件(输出语句重定向到txt文件中,并赋予权限):touch start.shchmod 777 start.sh创建txt文件,并赋予权限:touch content.txtchmod 777 content.txt编辑脚本文件(写入需要执行的脚本):echo hello world >> /home/zhouziyu/content.txt查看定时任务列表:crontab -l编辑定时任务,然后_sueue 系统怎么生效crontab

判断二叉树是否AVL树_如何判断一个二叉树是否为avl树-程序员宅基地

文章浏览阅读2.1k次。一、算法思想: 递归法判断一个二叉树是否平衡二叉树(AVL树),可以根据它的定义写出代码:(1)空树是一个AVL树;(2)只有一个根结点的树是一个AVL树;(2)左子树是一颗AVL树,且右子树是一个AVL树,且左子树的高度与右子树的高度差绝对值不超过1。二、代码:/*name:author:followStepdescription:date:2018/3/1..._如何判断一个二叉树是否为avl树

随便推点

stm32入门学习(基于STM32F103C8T6)_stm32f103c8t6csdn-程序员宅基地

文章浏览阅读456次,点赞8次,收藏2次。じゃ、始めましょう。--最近在学外语,对于IT从业者来说,会是一项优势。_stm32f103c8t6csdn

Anaconda安装_anaconda环境变量e:\anaconda3\library\usr\bin-程序员宅基地

文章浏览阅读7.1k次,点赞41次,收藏196次。文章目录1.Anaconda是什么2.Anaconda下载3.Anaconda安装4.Anaconda环境变量配置5.检验是否安装成功6.检验Anaconda Navifator是否安装成功7.修改Anaconda镜像修改为清华大学镜像移除清华大学镜像8.PyCharm配置Anaconda方式一(建立新的项目时)方式二(已经打开项目)9.总结1.Anaconda是什么Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。Anaconda也是P_anaconda环境变量e:\anaconda3\library\usr\bin

70个常用电脑快捷键,帮你工作效率提升100倍!职场新人必备!_快捷键可以帮助自己-程序员宅基地

文章浏览阅读2k次,点赞11次,收藏44次。电脑快捷键不仅可以帮助我们熟练的操作电脑,还可以帮助我们快速提升自己的工作效率,从此跟加班说拜拜!但由于电脑快捷键过于繁多不方便我们记忆!那么今天小编为大家整理的70个Wordows、Ctrl、Alt、Shift组合快捷键,运用好的话能够帮你工作效率提升100倍!希望能为大家派上用途!下面以图片&amp;文字的形式展现给大家!文字可以直接复制!图片也可以直接拿去收藏!..._快捷键可以帮助自己

用HTML语言制作一个非常浪漫的生日祝福网,手把手教你制作炫酷生日祝福网页_用html做一个生日快乐网页-程序员宅基地

文章浏览阅读2.2w次,点赞317次,收藏636次。明天就是女朋友的生日了, 是时候展现专属于程序员的浪漫了!你打算怎么给心爱的人表达爱意?鲜花礼物?代码表白?还是创意DIY?或者…无论那种形式,快来秀我们一脸吧!_用html做一个生日快乐网页

idea快捷键配置和常用快捷键_idea自定义快捷键-程序员宅基地

文章浏览阅读1.1k次。idea快捷键配置和常用快捷键_idea自定义快捷键

y2.2隐藏英雄密码_从嗨到2y 10 tmnkr您的密码发生了什么-程序员宅基地

文章浏览阅读99次。y2.2隐藏英雄密码Say that I decide to sign up for an account an incredibly insecure password, ‘hi’. How does this become something stored in the database like this: 假设我决定为一个帐户注册一个非常不安全的密码“ hi ”。 它如何变成这样存储在数据..._$2y$10$y

推荐文章

热门文章

相关标签