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();
}
}
//注:其余类没有变化,此处省略
源代码在我的资源中
文章浏览阅读3.2w次,点赞16次,收藏90次。对于这个问题我也是从网上找了很久,终于解决了这个问题。首先遇到这个问题,应该确认虚拟机能不能正常的上网,就需要ping 网关,如果能ping通说明能正常上网,不过首先要用命令route -n来查看自己的网关,如下图:第一行就是默认网关。现在用命令ping 192.168.1.1来看一下结果:然后可以看一下电脑上面百度的ip是多少可以在linux里面ping 这个IP,结果如下:..._linux桥接ping不通baidu
文章浏览阅读512次。小妹在这里已经卡了2-3天了,研究了很多人的文章,除了低版本api 17有成功外,其他的不是channel null 就是没反应 (channel null已解决)拜托各位大大,帮小妹一下,以下是我的程式跟 gradle, 我在这里卡好久又没有人可问(哭)![image](/img/bVcL0Qo)public class MainActivity extends AppCompatActivit..._android 权限申请弹窗 横屏
文章浏览阅读1.4k次,点赞4次,收藏6次。valid padding(有效填充):完全不使用填充。half/same padding(半填充/相同填充):保证输入和输出的feature map尺寸相同。full padding(全填充):在卷积操作过程中,每个像素在每个方向上被访问的次数相同。arbitrary padding(任意填充):人为设定填充。..._cnn “相同填充”(same padding)
文章浏览阅读790次,点赞29次,收藏28次。手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长![外链图片转存中…(img-Qpoc4gOu-1712656009273)][外链图片转存中…(img-bSWbNeGN-1712656009274)]
文章浏览阅读469次。Date对象取得年份有getYear和getFullYear两种方法经 测试var d=new Date;alert(d.getYear())在IE中返回 2009,在Firefox中会返回109。经查询手册,getYear在Firefox下返回的是距1900年1月1日的年份,这是一个过时而不被推荐的方法。而alert(d.getFullYear())在IE和FF中都会返回2009。因此,无论何时都应使用getFullYear来替代getYear方法。例如:2016年用 getFullYea_getyear和getfullyear
文章浏览阅读182次。Unix传奇(上篇) 陈皓 了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。 Unix是目前还在存活的操作系_unix传奇pdf
文章浏览阅读308次。哈希算法:将字符串映射为数字形式,十分巧妙,一般运用为进制数,进制据前人经验,一般为131,1331时重复率很低,由于字符串的数字和会很大,所以一般为了方便,一般定义为unsigned long long,爆掉时,即为对 2^64 取模,可以对于任意子序列的值进行映射为数字进而进行判断入门题目链接:AC代码:#include<bits/stdc++.h>using na..._ac算法 哈希
文章浏览阅读952次,点赞13次,收藏27次。由于觉得Qt的编辑界面比较丑,所以想用vs2022的编辑器写Qt加MySQL的项目。_在vs中 如何装qt5sqlmysql模块
文章浏览阅读1k次。选择题题目:下面的哪个调研内容属于经济环境调研?()题目:()的目的就是加强与客户的沟通,它是是网络媒体也是网络营销的最重要特性。题目:4Ps策略中4P是指产品、价格、顾客和促销。题目:网络市场调研是目前最为先进的市场调研手段,没有任何的缺点或不足之处。题目:市场定位的基本参数有题目:市场需求调研可以掌握()等信息。题目:在开展企业网站建设时应做好以下哪几个工作。()题目:对企业网站首页的优化中,一定要注意下面哪几个方面的优化。()题目:()的主要作用是增进顾客关系,提供顾客服务,提升企业_画中画广告之所以能有较高的点击率,主要由于它具有以下特点
文章浏览阅读1k次,点赞2次,收藏5次。以爬取CSDN为例子:第一步:导入请求库第二步:打开请求网址第三步:打印源码import urllib.requestresponse=urllib.request.urlopen("https://www.csdn.net/?spm=1011.2124.3001.5359")print(response.read().decode('utf-8'))结果大概就是这个样子:好的,继续,看看打印的是什么类型的:import urllib.requestresponse=urllib.r_urlopen the read operation timed out
文章浏览阅读304次。修正sina.com/sina.cn邮箱获取不到联系人,并精简修改了其他邮箱代码,以下就是升级版版本的介绍:完整版本,整合了包括读取邮箱通讯录、MSN好友列表的的功能,目前读取邮箱通讯录支持如下邮箱:gmail(Y)、hotmail(Y)、 live(Y)、tom(Y)、yahoo(Y)(有点慢)、 sina(Y)、163(Y)、126(Y)、yeah(Y)、sohu(Y) 读取后可以发送邮件(完..._通讯录 应用读取 邮件 的相关
文章浏览阅读213次。云计算及虚拟化教程学习云计算、虚拟化和计算机网络的基本概念。此视频教程共2.0小时,中英双语字幕,画质清晰无水印,源码附件全课程英文名:Cloud Computing and Virtualization An Introduction百度网盘地址:https://pan.baidu.com/s/1lrak60XOGEqMOI6lXYf6TQ?pwd=ns0j课程介绍:https://www.aihorizon.cn/72云计算:概念、定义、云类型和服务部署模型。虚拟化的概念使用 Type-2 Hyperv_云计算与虚拟化技术 教改