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、画海洋图、画对象
参考代码:
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();
}
}
//注:其余类没有变化,此处省略
源代码在我的资源中
文章浏览阅读9.8k次。举例说明_编码和解码
文章浏览阅读1.3k次,点赞6次,收藏9次。import PySimpleGUI as sg def 总体说明(): #下面这个layout变量就是控件的集合,里面放空间 #将来我们直接把这个变量传到窗口(屏幕)那里 #你可以把它当作实际内容 #以下是个简单的例子 layout = [[sg.Text("要显示在窗口上的文字")], [sg.Button("完成")]] #他还有参数,你懂的:title='Options',etitle_color='rd', #sg.Win..._pysimplegui教程
文章浏览阅读2.6k次。10.1 集群搭建nacos集群 的部署依赖docker swarm 集群,部署之前请先将nacos实例所在的docker 节点加入swarm集群,配置方式如下:选择其中一台服务器做docker swrm的masterdocker swarm init验证:剩余主机加入swarm集群将上一步的输出信息红框部分命令到剩余主机上执行,加入swarm集群验证:在master中查看node信息:验证:nacos集群至少需要3台主机,由于nacos属于"有状态服务"因此需要保证一致性(通过配_docker swarm nacos
文章浏览阅读1.8k次。0x00 前言Flutter的代码都是默认跑在root isolate上的,那么Flutter中能不能自己创建一个isolate呢?当然可以!,接下来我们就自己创建一个isolate!0x01 dart:isolate有关isolate的代码,都在isolate.dart文件中,里面有一个生成isolate的方法: external static Future<Isolate>..._flutter的isolate创建过程
文章浏览阅读101次。Linux系统设置Crontab定时任务创建一个sh脚本文件(输出语句重定向到txt文件中,并赋予权限):touch start.shchmod 777 start.sh创建txt文件,并赋予权限:touch content.txtchmod 777 content.txt编辑脚本文件(写入需要执行的脚本):echo hello world >> /home/zhouziyu/content.txt查看定时任务列表:crontab -l编辑定时任务,然后_sueue 系统怎么生效crontab
文章浏览阅读2.1k次。一、算法思想: 递归法判断一个二叉树是否平衡二叉树(AVL树),可以根据它的定义写出代码:(1)空树是一个AVL树;(2)只有一个根结点的树是一个AVL树;(2)左子树是一颗AVL树,且右子树是一个AVL树,且左子树的高度与右子树的高度差绝对值不超过1。二、代码:/*name:author:followStepdescription:date:2018/3/1..._如何判断一个二叉树是否为avl树
文章浏览阅读456次,点赞8次,收藏2次。じゃ、始めましょう。--最近在学外语,对于IT从业者来说,会是一项优势。_stm32f103c8t6csdn
文章浏览阅读7.1k次,点赞41次,收藏196次。文章目录1.Anaconda是什么2.Anaconda下载3.Anaconda安装4.Anaconda环境变量配置5.检验是否安装成功6.检验Anaconda Navifator是否安装成功7.修改Anaconda镜像修改为清华大学镜像移除清华大学镜像8.PyCharm配置Anaconda方式一(建立新的项目时)方式二(已经打开项目)9.总结1.Anaconda是什么Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。Anaconda也是P_anaconda环境变量e:\anaconda3\library\usr\bin
文章浏览阅读2k次,点赞11次,收藏44次。电脑快捷键不仅可以帮助我们熟练的操作电脑,还可以帮助我们快速提升自己的工作效率,从此跟加班说拜拜!但由于电脑快捷键过于繁多不方便我们记忆!那么今天小编为大家整理的70个Wordows、Ctrl、Alt、Shift组合快捷键,运用好的话能够帮你工作效率提升100倍!希望能为大家派上用途!下面以图片&文字的形式展现给大家!文字可以直接复制!图片也可以直接拿去收藏!..._快捷键可以帮助自己
文章浏览阅读2.2w次,点赞317次,收藏636次。明天就是女朋友的生日了, 是时候展现专属于程序员的浪漫了!你打算怎么给心爱的人表达爱意?鲜花礼物?代码表白?还是创意DIY?或者…无论那种形式,快来秀我们一脸吧!_用html做一个生日快乐网页
文章浏览阅读1.1k次。idea快捷键配置和常用快捷键_idea自定义快捷键
文章浏览阅读99次。y2.2隐藏英雄密码Say that I decide to sign up for an account an incredibly insecure password, ‘hi’. How does this become something stored in the database like this: 假设我决定为一个帐户注册一个非常不安全的密码“ hi ”。 它如何变成这样存储在数据..._$2y$10$y