Java练习之潜艇小游戏的实现

网友投稿 219 2022-10-21

Java练习之潜艇小游戏的实现

首先是主方法里定义的窗口(这些都是固定的格式,不会的也没什么事,直接Ctrl+c+v就行,基本上看一下数据都能看的懂)

写一个超类,超类里需要有潜艇,深水炸弹,水雷和战舰的宽,高,以及出场时的x,y坐标,和移动速度。所有对象的图片,所有对象的移动方法,以及碰撞

然后再写派生类,根据击败一个水雷潜艇,战舰会获得一条命,击败其他潜艇,战舰会获得分数,所以,需要定义两个接口,一个是用来加命,另一个用来加分

完整代码如下(图片什么的可以自己去找,只需要改一下Image类和各个对象的宽高就可以)

游戏世界World类

package cn.tedu.sunarine;

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(30);

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

if (submarines[i] instanceof MineSubmarine){

if (submarines[i].isLIVE()) {

MineSubmarine ms = (MineSubmarine) submarines[i];

Mine obj = ms.shootMine();

mines = Arrays.copyOf(mines, mines.length + 1);

mines[mines.length - 1] = obj;

}

}

}

}

}

public void gameOver(){

if (ship.getLife()<=0){

state = GAME_OVER;

}

}

//海洋对象移动

public void moveAction(){

for(int i=0;i

submarines[i].move();

}

for(int i=0;i

mines[i].move();

}

for(int i=0;i

bombs[i].move();

}

}

//删除越界对象

public void outOfBoundsAction(){

for(int i=0;i

if(submarines[i].isOutOfBounds()){

submarines[i] = submarines[submarines.length-1];

submarines = Arrays.copyOf(submarines,submarines.length-1);

}

}

for(int i=0;i

if(mines[i].isOutOfBounds()){

mines[i] = mines[mines.length-1];

mines = Arrays.copyOf(mines,mines.length-1);

}

}

for(int i=0;i

if(bombs[i].isOutOfBounds()){

bombs[i] = bombs[bombs.length-1];

bombs = Arrays.copyOf(bombs,bombs.length-1);

}

}

}

private int score = 0;

public void BombsBangAction(){

//深水炸弹炸潜艇

for (int i=0;i

Bomb b =bombs[i];

for (int j=0;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

Mine m= mines[i];

if (m.isLIVE()&& ship.isLIVE()&&m.isHit(ship)){

m.goDead();

ship.subtratLife();

}

}

}

/** 启动程序的运行 */

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();

}

}

};

YoxbcI this.addKeyListener(k);

Timer timer = new Timer();

int interval = 10;

timer.schedule(new TimerTask() {

public void run() {

submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场

MineEnterAction(); //水雷入场

moveAction(); //海洋对象移动

BombsBangAction(); //深水炸弹和潜艇碰撞

mineBangAction(); //水雷和战舰碰撞

outOfBoundsAction(); //删除越界的对象

gameOver();

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.setResizable(false);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setSize(WIDTH, HEIGHT+19);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

world.action();

}

}

定义一个SeaObject的类当作超类(父类),然后再写其他的派生类(子类)

package cn.tedu.sunarine;

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(497 - height - 150 + 1) + 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 void paintImage(Graphics g){

if (isLIVE()){

this.getImage().paintIcon(null,g,this.x,this.y);

}

}

public boolean isOutOfBounds(){

return 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;

}

public void goDead(){

state =DEAD;

}

}

在派生类的引用超类

鱼雷潜艇类

package cn.tedu.sunarine;

import javax.swing.ImageIcon;

//鱼雷潜艇

public class TorpedoSubmarine extends SeaObject implements EnemyScore{

TorpedoSubmarine(){

super(64,20);

}

@Override

public void move() {

x+=speed;

}

public ImageIcon getImage(){

return Images.torpedo;

}

public boolean isOutOfBounds() {

return x>=World.WIDTH;

}

public int getScore(){

return 20;

}

}

水雷潜艇类

package cn.tedu.sunarine;

import javax.swing.ImageIcon;

//水雷潜艇

public class MineSubmarine extends SeaObject implements EnemyScore{

MineSubmarine(){

super(63,19);

}

@Override

public void move() {

x+=speed;

}

public ImageIcon getImage(){

return Images.minesubm;

}

public Mine shootMine(){

int x = this.x+(this.width/2);

int y =this.y;

return new Mine(x,y);

}

public boolean isOutOfBounds() {

return x>=World.WIDTH;

}

public int getLife(){

return 1;

}

}

侦察潜艇类

package cn.tedu.sunarine;

import javax.swing.ImageIcon;

//侦察潜艇

public class ObserveSubmarine extends SeaObject implements EnemyScore{

ObserveSubmarine(){

super(63,19);

}

@Override

public void move() {

x+=speed;

}

public ImageIcon getImage(){

return Images.observesubm;

}

public boolean isOutOfBounds() {

return x>=World.WIDTH;

}

public int getScore(){

return 10;

}

}

鱼雷类

package cn.tedu.sunarine;

//鱼雷

import javax.swing.ImageIcon;

public class Mine extends SeaObject{

Mine(int x,int y){

super(11,11,x,y,1);

}

@Override

public void move() {

y-=speed;

}

public ImageIcon getImage(){

return Images.mine;

}

public boolean isOutOfBounds(){

return y<=150-(height/2);

}

}

深水炸弹类

package cn.tedu.sunarine;

//深水炸弹

import javax.swing.ImageIcon;

public class Bomb extends SeaObject{

Bomb(int x,int y){

super(9,12,x,y,3);

}

@Override

public void move() {

y+=speed;

}

public ImageIcon getImage(http://){

return Images.bomb;

}

public boolean isOutOfBounds(){

return y>=World.HEIGHT;

}

}

战舰类

package cn.tedu.sunarine;

import javax.swing.*;

//战舰

public class Battleship extends SeaObject{

int life;

Battleship(){

super(66,26,270,124,20);

life=1;

}

@Override

public void move() {

System.out.println("战舰移动");

}

public ImageIcon getImage(){

return Images.battleship;

}

public Bomb shoot(){

return new Bomb(this.x,this.y+height);

}

//限制移动范围

public void moveLeft(){

x-=speed;

x=Math.max(0,x);

}

public void moveRight(){

x+=speed;

x=Math.min(x,World.WIDTH-this.width);

}

public void addLife(int num){

life+=num;

}

public int getLife(){

return life;

}

public void subtratLife(){

life--;

}

}

加命接口

package cn.tedu.sunarine;

public interface EnemyLife {

public int getLife();

}

加分接口

package cn.tedu.sunarine;

public interface EnemyScore {

public int getScore();

}

最后,Image类(可根据自己的图片改)

package cn.tedu.sunarine;

import javax.swing.*;

public class Images {

public static ImageIcon battleship;

public static ImageIcon observesubm;

public static ImageIcon mine;

public static ImageIcon bomb;

public static ImageIcon sea;

public static ImageIcon torpedo;

public static ImageIcon minesubm;

public static ImageIcon gameover;

static {

battleship = new ImageIcon("./img/battleship.png");

bomb = new ImageIcon("./img/bomb.png");

gameover = new ImageIcon("./img/gameover.png");

mine = new ImageIcon("./img/mine.png");

minesubm = new ImageIcon("./img/minesubm.png");

observesubm = new ImageIcon("./img/obsersubm.png");

sea = new ImageIcon("./img/sea.png");

torpedo = new ImageIcon("./img/torpesubm.png");

}

public static void main(String[] args) {

System.out.println(battleship.getImageLoadStatus());

System.out.println(observesubm.getImageLoadStatus());

System.out.println(mine.getImageLoadStatus());

System.out.println(battleship.getImageLoadStatus());

System.out.println(bomb.getImageLoadStatus());

System.out.println(gameover.getImageLoadStatus());

System.out.println(minesubm.getImageLoadStatus());

System.out.println(sea.getImageLoadStatus());

}

}

以上就是Java练习之潜艇小游戏的实现的详细内容,更多关于Java潜艇游戏的资料请关注我们其它相关文章!

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Docker部署elaticsearch-7.17.2和kibana-7.17.2
下一篇:Docker部署Redis-5.0.12
相关文章

 发表评论

暂时没有评论,来抢沙发吧~