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-cx_oracle报错"DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "_cx_oracle.databaseerror: dpi-1047: 64-bit oracle c-程序员宅基地

文章浏览阅读3.7w次。用python跑数据库脚本时,python报错"DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "原因是我的python2.7是64位的,并且装了cx_oracle6.1库,而数据库用了32位的instantclient-basic。解决方案:下载个64位的,然后解压,配置64位_cx_oracle.databaseerror: dpi-1047: 64-bit oracle client library cannot be lo

Trex学习(一)环境搭建和数据包回放说明_trex发包服务器搭建-程序员宅基地

文章浏览阅读1.4w次,点赞5次,收藏33次。目录1. 环境准备 1.1 OS选择和安装 1.2硬件网卡选择 1.3 Trex环境安装2. Trex环境调试 - stateless模式 2.1 stateless模式配置和启动 2.2 console连接环境确认3. 数据包回放 - stateful模式 3.1 pcap准备 3.2修改文件、回放脚本_trex发包服务器搭建

泰克Tektronix DPO2014示波器-程序员宅基地

文章浏览阅读354次,点赞7次,收藏8次。杰出的处理能力,迅速解决问题 - MSO2000和DPO2000系列数字荧光示波器 (DPO)为您查看信号和迅速解决问题提供了所需的性能和工具。DPO2000 系列是少有在所有通道上提供了1M 点可用记录长度、串行触发和解码分析选项、可变低通滤波器、允许直到示波器全部带宽查看信号细节及体积小巧的示波器。-体积小,重量轻,深仅5.3 英寸(134mm),重仅7 磅14 盎司(3.6 公斤)混合信号设计和分析(MSO2000 系列)-能够时间相关最多4 条模拟和16 条数字通道。-并行总线触发和分析。

Android百度地图(三):百度地图画运动轨迹及图层点击事件处理_百度地图polyline和轨迹-程序员宅基地

文章浏览阅读2.1w次,点赞11次,收藏107次。上篇文章讲述了如何在地图显示位置点,这篇文章主要讲述如何在地图上画运动轨迹,以及地图图层点击事件的处理。很多运动类的app都有画出跑步者运动轨迹的需求,拿咕咚来说,我们看一下它的效果图:咕咚运动轨迹图本篇将要实现的效果1.跑步结束后,静态的画出整个运动轨迹2.跑步过程中,时时动态的画运动轨迹效果图如何实现:1._百度地图polyline和轨迹

cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器-程序员宅基地

文章浏览阅读656次。在 cocos2d-x 中嵌入浏览器次阅读Embeds a browser in cocos2d-x在游戏中嵌入网页是很常见的需求,cocos2d-x 引擎官方并没有提供这个功能。我在网上转了一圈,把找到的资料做了一些修改,将其集成到我们使用的 quick-cocos2d-x 引擎中。主要代码来自:CCXWebview,这里 还有一篇专门讲解Android嵌入浏览器的文章,可以参考。集成的类叫做 ..._cocos2dx pc 内嵌网页

随便推点

java对象与json对象间的相互转换的方法_接收{}对象,此处接收数组对象会有异常-程序员宅基地

文章浏览阅读446次。String json=JSON.toJSONString(user);//关键1.简单的解析json字符串首先将json字符串转换为json对象,然后再解析json对象,过程如下。 1 JSONObject jsonObject = JSONObject.fromObject(jsonStr); 根据json中的键得到它的值 1 2 3 4 String name = jsonObject.get._接收{}对象,此处接收数组对象会有异常

【小沐学NLP】Python实现图片文字识别_机器学习如何图片中文字识别的程序-程序员宅基地

文章浏览阅读5.3k次,点赞12次,收藏87次。Tesseract最初由惠普实验室支持,用于电子版文字识别,1996年被移植到Windows上,1998年进行了C++化,在2005年Tesseract由惠普公司宣布开源。2006年到现在,由Google公司维护开发。最初Tesseract是用C语言写的,在1998年改用C++。..._机器学习如何图片中文字识别的程序

stm32 定时器输入捕获实验_stm32使用定时器对脉冲进行捕获和计数-程序员宅基地

文章浏览阅读2k次,点赞4次,收藏24次。输入捕获模式可以用来测量脉冲宽度或者测量频率原理图如图 所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中 t1~t2 时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道 x 为上升沿捕获,这样, t1 时刻,就会捕获到当前的 CNT 值,然后立即清零 CNT,并设置通道 x为下降沿捕获,这样到 t2 时刻,又会发生捕获事件,得到此时的 CNT 值,记为 CCRx2。这样,根据定时器的计数频率,我们就可以算出 t1~t2 的时间,从而得到高电平脉宽。_stm32使用定时器对脉冲进行捕获和计数

求二叉树最小结点_c语言非空二叉树最小值结点-程序员宅基地

文章浏览阅读5.7k次,点赞6次,收藏46次。struct BTNode{ int data; struct BTNode *lchild; struct BTNode *rchild;}BTNode * MinNode(BTNode *b){ if (b != NULL){ BTNode *min1, *min2, *min; if (b->lchild == NULL &..._c语言非空二叉树最小值结点

Vue.js初学_vue.js初学者-程序员宅基地

文章浏览阅读8.5k次,点赞63次,收藏392次。Vue.js从零开始1、简单认识Vue.jsVue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。2、Vue.js安装CDN引入直接下载然后引入,script方式引用npm方式安装注意开发环境版本(vue.js)和生产环境版_vue.js初学者

html数字跳动加载,【AE】加载动画和数字跳动-程序员宅基地

文章浏览阅读501次。原标题:【AE】加载动画和数字跳动转载一篇晓斌师兄的教程~最近都在研究动效,跟着师兄一起动手吧!转载:吴影浪技 作品:http://www.zcool.com.cn/work/ZMjExNzkxMDQ=.htmlHello,大家好,今天给大家分享一个小案例,就是上面那个图的制作思路,一如既往的,只分享思路,不要在意那些参数。教程分两部分,第一部分是简单说一些AE的工具,方便后面操作(其实是某土豪煤..._数字加载动画

推荐文章

热门文章

相关标签