潜艇大战
一、超类SeaObject(派生类有,战舰、敌舰、水雷、炸弹)
我这里面将一些属性进行了私有化处理,并且提供了get及set方法进行访问,
提高了程序安全性,还将一些代码继续进行简化处理
package javabean;
import javax.swing.*;
import java.awt.*;
import java.util.Random;
public abstract class SeaObject {
public static final int LIVE = 0;
public static final int DEAD = 1;
private int state = LIVE;
private int width;
private int height;
private int x;
private int y;
private int speed;
public SeaObject(int width, int height) {
this.width = width;
this.height = height;
x = -width;
Random random = new Random();
y = random.nextInt(World.HEIGHT - 150 - height + 1) + 150;
speed = random.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 int getWidth() {return width;}
public int getHeight() {return height;}
public int getX() {return x;}
public void setX(int x) {this.x = x;}
public int getY() {return y;}
public void setY(int y) {this.y = y;}
public int getSpeed() {return speed;}
public abstract void move();
public abstract ImageIcon getImage();
public boolean isLive() {
return state == LIVE;
}
public void goDead() {
state = DEAD;
}
public void paint(Graphics g) {
if (isLive()) {
this.getImage().paintIcon(null, g, x, y);
}
}
public boolean isOutOfBounds() {
return this.x >= World.WIDTH;
}
public boolean isHit(SeaObject other) {
int x1 = this.x - other.width;
int x2 = this.x + this.width;
int y1 = this.y - other.height;
int y2 = this.y + this.height;
int x = other.x;
int y = other.y;
return (x >= x1 && x <= x2) && (y >= y1 && y <= y2);
}
}
二、战舰BattleShip
package javabean;
import javax.swing.*;
public class Battleship extends SeaObject {
private int life;
private int score;
public Battleship() {
super(66, 26, 270, 124, 40);
life = 5;
}
public int getLife() {return life;}
public void setLife(int life) {this.life += life;}
public int getScore() {return score;}
public void setScore(int score) {this.score += score;}
@Override
public void move(){};
public void move(boolean flag) {
if (flag) {
setX(getX() + getSpeed());
} else {
setX(getX() - getSpeed());
}
}
@Override
public ImageIcon getImage() {
return Images.battleship;
}
public Bomb shootBomb() {
return new Bomb(this.getX() + this.getWidth() / 2, this.getY() + this.getHeight());
}
public boolean isLive() {
return life > 0;
}
}
三、敌舰
1.水雷潜艇Minesubmarine
package javabean;
import javax.swing.*;
public class MineSubmarine extends SeaObject implements EnemyLife{
public MineSubmarine() {
super(63, 19);
}
@Override
public void move() {
setX(getX() + getSpeed());
}
@Override
public ImageIcon getImage() {
return Images.minesubm;
}
public Mine shootMine() {
return new Mine(getX(), getY());
}
@Override
public int getLifes() {
return 1;
}
}
2.鱼雷潜艇Totpesubmarine
package javabean;
import javax.swing.*;
public class TorpeSubmarine extends SeaObject implements EnemyScore{
public TorpeSubmarine() {
super(64, 20);
}
@Override
public void move() {
setX(getX() + getSpeed());
}
@Override
public ImageIcon getImage() {
return Images.torpesubm;
}
@Override
public int getScores() {
return 200;
}
}
3.侦察潜艇Obsersubmarine
package javabean;
import javax.swing.*;
public class ObserSubmarine extends SeaObject implements EnemyScore{
public ObserSubmarine() {
super(63, 19);
}
@Override
public void move() {
setX(getX() + getSpeed());
}
@Override
public ImageIcon getImage() {
return Images.obsersubm;
}
@Override
public int getScores() {
return 100;
}
}
四、水雷Mine
package javabean;
import javax.swing.*;
public class Mine extends SeaObject{
public Mine(int x, int y) {
super(11, 11, x, y, 1);
}
@Override
public void move() {
setY(getY() - getSpeed());
}
@Override
public ImageIcon getImage() {
return Images.mine;
}
@Override
public boolean isOutOfBounds() {
return getY() <= 150 - getHeight();
}
}
五、炸弹Bomb
package javabean;
import javax.swing.*;
public class Bomb extends SeaObject{
public Bomb(int x, int y) {
super(9, 12, x, y, 12);
}
@Override
public void move() {
setY(getY() + getSpeed());
}
@Override
public ImageIcon getImage() {
return Images.bomb;
}
@Override
public boolean isOutOfBounds() {
return getY() >= World.HEIGHT;
}
}
六、图片类Images
package javabean;
import javax.swing.*;
import java.awt.*;
public class Images {
public static final ImageIcon sea = new ImageIcon("img/sea.png");
public static final ImageIcon battleship = new ImageIcon("img/battleship.png");
public static final ImageIcon bomb = new ImageIcon("img/bomb.png");
public static final ImageIcon gameover = new ImageIcon("img/gameover.png");
public static final ImageIcon mine = new ImageIcon("img/mine.png");
public static final ImageIcon minesubm = new ImageIcon("img/minesubm.png");
public static final ImageIcon obsersubm = new ImageIcon("img/obsersubm.png");
public static final ImageIcon torpesubm = new ImageIcon("img/torpesubm.png");
public static final ImageIcon sea1 = new ImageIcon("img/sea1.png");
public static void main(String[] args) {
System.out.println(sea.getImageLoadStatus());
System.out.println(battleship.getImageLoadStatus());
System.out.println(bomb.getImageLoadStatus());
System.out.println(minesubm.getImageLoadStatus());
System.out.println(mine.getImageLoadStatus());
System.out.println(torpesubm.getImageLoadStatus());
System.out.println(obsersubm.getImageLoadStatus());
System.out.println(gameover.getImageLoadStatus());
}
}
七、运行类World
package javabean;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
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;
public static final int RUNNING = 1;
public static final int GAME_OVER = 0;
private int state = RUNNING;
private Battleship ship = new Battleship();
private SeaObject[] subms = {};
private Bomb[] bombs = {};
private Mine[] mines = {};
private SeaObject getSubms() {
Random random = new Random();
int num = random.nextInt(20);
if (num < 10) {
return new MineSubmarine();
} else if (num < 16) {
return new ObserSubmarine();
} else {
return new TorpeSubmarine();
}
}
private int submsIndex = 0;
private void submsAction() {
submsIndex++;
if (submsIndex % 50 == 0) {
SeaObject obj = getSubms();
subms = Arrays.copyOf(subms, subms.length + 1);
subms[subms.length - 1] = obj;
}
}
private int minesIndex = 0;
private void minesAction() {
minesIndex++;
if (minesIndex % 100 == 0) {
for (int i = 0; i < subms.length; i++) {
if (subms[i] instanceof MineSubmarine) {
MineSubmarine obj = (MineSubmarine)subms[i];
mines = Arrays.copyOf(mines, mines.length + 1);
mines[mines.length - 1] = obj.shootMine();
}
}
}
}
private void moveAction(){
for(int i=0;i<subms.length;i++){
if(subms[i].isOutOfBounds() || !subms[i].isLive()){
subms[i] = subms[subms.length-1];
subms = Arrays.copyOf(subms,subms.length-1);
} else {
subms[i].move();
}
}
for(int i=0;i<mines.length;i++){
if(mines[i].isOutOfBounds() || !mines[i].isLive()){
mines[i] = mines[mines.length-1];
mines = Arrays.copyOf(mines,mines.length-1);
} else {
mines[i].move();
}
}
for(int i=0;i<bombs.length;i++){
if(bombs[i].isOutOfBounds() || !bombs[i].isLive()){
bombs[i] = bombs[bombs.length-1];
bombs = Arrays.copyOf(bombs,bombs.length-1);
} else {
bombs[i].move();
}
}
}
private void bombBangAction() {
for (int i = 0; i < bombs.length; i++) {
Bomb bomb = bombs[i];
for (int j = 0; j < subms.length; j++) {
SeaObject obj = subms[j];
if (obj.isLive() && obj.isHit(bomb)) {
bomb.goDead();
obj.goDead();
if (obj instanceof EnemyLife) {
EnemyLife el = (EnemyLife)obj;
ship.setLife(el.getLifes());
} else {
EnemyScore es = (EnemyScore)obj;
ship.setScore(es.getScores());
}
}
}
}
}
private void mineBangAction() {
for (int i = 0; i < mines.length; i++) {
Mine mine = mines[i];
if (mine.isLive() && ship.isLive() && ship.isHit(mine)) {
mine.goDead();
ship.setLife(-1);
}
}
}
private void checkGameOver() {
if (ship.getLife() == 0) {
state = GAME_OVER;
}
}
private void action() {
KeyAdapter k = new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE) {
Bomb bomb = ship.shootBomb();
bombs = Arrays.copyOf(bombs, bombs.length + 1);
bombs[bombs.length - 1] = bomb;
}
if (e.getKeyCode() == KeyEvent.VK_LEFT) {
ship.move(false);
}
if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
ship.move(true);
}
}
};
this.addKeyListener(k);
Timer timer = new Timer();
int interval = 1;
timer.schedule(new TimerTask() {
@Override
public void run() {
moveAction();
submsAction();
minesAction();
bombBangAction();
mineBangAction();
checkGameOver();
repaint();
}
}, interval, interval);
}
@Override
public void paint(Graphics g) {
switch (state) {
case GAME_OVER:
Images.gameover.paintIcon(null, g, 0, 0);
Images.sea1.paintIcon(null, g, 0, 0);
g.drawString("SCORE: " + ship.getScore(), 200, 50);
g.drawString("LIFE: " + ship.getLife(), 400, 50);
break;
case RUNNING:
Images.sea.paintIcon(null, g, 0, 0);
ship.paint(g);
for (int i = 0; i < subms.length; i++) {
subms[i].paint(g);
}
for (int i = 0; i < bombs.length; i++) {
bombs[i].paint(g);
}
for (int i = 0; i < mines.length; i++) {
mines[i].paint(g);
}
g.drawString("SCORE: " + ship.getScore(), 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.setSize(World.WIDTH + 6, World.HEIGHT + 28);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
world.action();
}
}
八、接口Interface
1.EnemyScore
package javabean;
public interface EnemyScore {
int getScores();
}
2.EnemyLife
package javabean;
public interface EnemyLife {
int getLifes();
}
九、附上百度网盘链接
潜艇大战源码及图片,百度网盘链接,提取码:7144