当前位置:

首页 > 编程开发 > Java如何实现潜艇小游戏

Java如何实现潜艇小游戏

首先是主方法里定义的窗口(这些都是固定的格式,不会的也没什么事,直接Ctrl+c+v就行,基本上看一下数据都能看的懂)写一个超类,超类里需要有潜艇,深水炸弹,水雷和战舰的宽,高,以及出场时的x,y坐标,和移动速度。所有对象的图片,所有对象的移动方法,以及碰撞然后再写派生类,根据击败一个水雷潜艇,战舰会获得一条命,击败其他潜艇,战舰会获得分数,所以,需要定义两个接口,一个是用来加命,另一个用来加分完整代码如下(图片什么的可以自己去找,只需要改一下Image类和各个对象的宽高就可以)游戏世界World类pac

本文目录

    首先是主方法里定义的窗口(这些都是固定的格式,不会的也没什么事,直接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

    定义一个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(){
            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());
        }
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Yandex官网入口及网页搜索使用方法
    Yandex官网入口及网页搜索使用方法

    Yandex官网入口是https://www.yondex.net/,该平台支持多语言切换、智能搜索匹配、虚拟键盘变更及实时翻译,提供地图、图片、新闻、购物等垂直服务,并具备账户同步、隐私管理、个性化首页和云存储等功能。

    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。