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

智能推荐

python opencv resize函数_python opencv 等比例调整(缩放)图片分辨率大小代码 cv2.resize()...-程序员宅基地

文章浏览阅读1.3k次。# -*- coding: utf-8 -*-"""@File : 200113_等比例调整图像分辨率大小.py@Time : 2020/1/13 13:38@Author : Dontla@Email : [email protected]@Software: PyCharm"""import cv2def img_resize(image):height, width = image...._opencv小图等比例缩放

【OFDM、OOK、PPM、QAM的BER仿真】绘制不同调制方案的误码率曲线研究(Matlab代码实现)-程序员宅基地

文章浏览阅读42次。对于这些调制技术的误码率(BER)研究是非常重要的,因为它们可以帮助我们了解在不同信道条件下系统的性能表现。通过以上步骤,您可以进行OFDM、OOK、PPM和QAM的误码率仿真研究,并绘制它们的误码率曲线,以便更好地了解它们在不同信道条件下的性能特点。针对这些调制技术的BER研究是非常重要的,可以帮助我们更好地了解这些技术在不同信道条件下的性能表现,从而指导系统设计和优化。6. 分析结果:根据误码率曲线的比较,分析每种调制方案在不同信噪比条件下的性能,包括其容忍的信道条件和适用的应用场景。_ber仿真

【已解决】Vue的Element框架,日期组件(el-date-picker)的@change事件,不会触发。_el-date-picker @change不触发-程序员宅基地

文章浏览阅读2.5w次,点赞3次,收藏3次。1、场景照抄官方的实例,绑定了 myData.Age 这个值。实际选择某个日期后,从 vuetool(开发工具)看,值已经更新了,但视图未更新。2、尝试绑定另一个值: myData,可以正常的触发 @change 方法。可能是:值绑定到子对象时,组件没有侦测到。3、解决使用 @blur 代替 @change 方法。再判断下 “值有没有更新” 即可。如有更好的方法,欢迎评论!..._el-date-picker @change不触发

PCL学习:滤波—Projectlnliers投影滤波_projectinliers-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏8次。Projectlnliersclass pcl: : Projectlnliers< PointT >类 Projectlnliers 使用一个模型和一组的内点的索引,将内点投影到模型形成新的一个独立点云。关键成员函数 void setModelType(int model) 通过用户给定的参数设置使用的模型类型 ,参数 Model 为模型类型(见 mo..._projectinliers

未处理System.BadImageFormatException”类型的未经处理的异常在 xxxxxxx.exe 中发生_“system.badimageformatexception”类型的未经处理的异常在 未知模块。 -程序员宅基地

文章浏览阅读2.4k次。“System.BadImageFormatException”类型的未经处理的异常在 xxxx.exe 中发生其他信息: 未能加载文件或程序集“xxxxxxx, Version=xxxxxx,xxxxxxx”或它的某一个依赖项。试图加载格式不正确的程序。此原因是由于 ” 目标程序的目标平台与 依赖项的目标编译平台不一致导致,把所有的项目都修改到同一目标平台下(X86、X64或AnyCPU)进行编译,一般即可解决问题“。若果以上方式不能解决,可采用如下方式:右键选择配置管理器,在这里修改平台。_“system.badimageformatexception”类型的未经处理的异常在 未知模块。 中发生

PC移植安卓---2018/04/26_电脑软件移植安卓-程序员宅基地

文章浏览阅读2.4k次。记录一下碰到的问题:1.Assetbundle加载问题: 原PC打包后的AssetBundle导入安卓工程后,加载会出问题。同时工程打包APK时,StreamingAssets中不能有中文。解决方案: (1).加入PinYinConvert类,用于将中文转换为拼音(多音字可能会出错,例如空调转换为KongDiao||阿拉伯数字不支持,如Ⅰ、Ⅱ、Ⅲ、Ⅳ(IIII)、Ⅴ、Ⅵ、Ⅶ、Ⅷ、Ⅸ、Ⅹ..._电脑软件移植安卓

随便推点

聊聊线程之run方法_start 是同步还是异步-程序员宅基地

文章浏览阅读2.4k次。话不多说参考书籍 汪文君补充知识:start是异步,run是同步,start的执行会经过JNI方法然后被任务执行调度器告知给系统内核分配时间片进行创建线程并执行,而直接调用run不经过本地方法就是普通对象执行实例方法。什么是线程?1.现在几乎百分之百的操作系统都支持多任务的执行,对计算机来说每一个人物就是一个进程(Process),在每一个进程内部至少要有一个线程实在运行中,有时线..._start 是同步还是异步

制作非缘勿扰页面特效----JQuery_单击标题“非缘勿扰”,<dd>元素中有id属性的<span>的文本(主演、导演、标签、剧情-程序员宅基地

文章浏览阅读5.3k次,点赞9次,收藏34次。我主要用了层次选择器和属性选择器可以随意选择,方便简单为主大体CSS格式 大家自行构造网页主体<body> <div class='main' > <div class='left'> <img src="images/pic.gif" /> <br/><br/> <img src="images/col.gif" alt="收藏本片"/&_单击标题“非缘勿扰”,元素中有id属性的的文本(主演、导演、标签、剧情

有了这6款浏览器插件,浏览器居然“活了”?!媳妇儿直呼“大开眼界”_浏览器插件助手-程序员宅基地

文章浏览阅读901次,点赞20次,收藏23次。浏览器是每台电脑的必装软件,去浏览器搜索资源和信息已经成为我们的日常,我媳妇儿原本也以为浏览器就是上网冲浪而已,哪有那么强大,但经过我的演示之后她惊呆了,直接给我竖起大拇指道:“原来浏览器还能这么用?大开眼界!今天来给大家介绍几款实用的浏览器插件,学会之后让你的浏览器“活过来”!_浏览器插件助手

NumPy科学数学库_数学中常用的环境有numpy-程序员宅基地

文章浏览阅读101次。NumPy是Python中最常用的科学数学计算库之一,它提供了高效的多维数组对象以及对这些数组进行操作的函数NumPy的核心是ndarray(N-dimensional array)对象,它是一个用于存储同类型数据的多维数组Numpy通常与SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用,用于替代MatLabSciPy是一个开源的Python算法库和数学工具包;Matplotlib是Python语言及其Numpy的可视化操作界面'''_数学中常用的环境有numpy

dind(docker in docker)学习-程序员宅基地

文章浏览阅读1.1w次。docker in docker说白了,就是在docker容器内启动一个docker daemon,对外提供服务。优点在于:镜像和容器都在一个隔离的环境,保持操作者的干净环境。想到了再补充 :)一:低版本启动及访问启动1.12.6-dinddocker run --privileged -d --name mydocker docker:1.12.6-dind在其他容器访问d..._dind

推荐文章

热门文章

相关标签