• 前言

    一、任务概述

    1.1目标

    1.2用例模型

    二、游戏规则

  • 三、游戏代码


前言

随着经济的发展和社会节奏的加快,人们所面对的压力越来越大,总想寻求一种方式来释放自己的压力。而我国科技水平在高速发展,计算机已经广泛应用于人们的日常生活中。因此,现在越来越多的人想借着计算机来达到释放自己压力,给自己充电的目的。而电脑游戏尤其是休闲小游戏正好可以起到这种效果。因此,休闲小游戏一直深受人们的喜欢。

6人学生小团队用一周时间根据实训发布任务设计拓展一个潜艇大战的小游戏。该小游戏可以在游戏中选择自己喜欢的模式:“单人”“双人”以及难易程度,还可以查看游戏规则及说明,最终以分数为目标完成该游戏。


提示:以下是本篇文章正文内容,下面案例可供参考

一、任务概述

1.1目标

通过游戏程序增加编程兴趣,提高编程水平。随着编程水平的提高,力争设计出人们喜欢的休闲小游戏,给人们带来愉悦的心灵享受。给那些长期因学习工作压力比较大的人们提高一种释放压力的途径,使得他们更有激情工作同时实现他们的人生价值。

1.2用例模型

主界面:

单人游戏界面:

双人游戏界面:

游戏设定界面:

游戏运行截图:

二、游戏规则

本系统主要是完成潜艇大战游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求:

(1)利用方向键来改变军舰的运行方向(P2玩家根据WASD来控制战舰);

(2)按空格(S)发射导弹,击中敌人得分,P1,P2玩家分别计分,分数高者获胜;

(3)根据游戏设置难度(有两个选择“易”、“难”);

(4)主页的模式选择(有单人双人两种模式);

(5)游戏过程中,每个玩家3枚导弹,每使用一枚导弹自动恢复;

(6)玩家可根据菜单进行开始、暂停和退出的选择;

三、游戏代码

MainClass.java函数

package com.qt;public class MainClass {public MainClass() {}public static void main(String[] args) {String backgroundMusicPath = "music/bgm.wav";MusicBackground  musicBackgroundObject= new MusicBackground();musicBackgroundObject.playMusic(backgroundMusicPath);PanelObservable ob = new PanelObservable();new MainFrame(ob);}
}

MainFrame.java

package com.qt;import javax.swing.*;
import java.awt.*;
import java.util.Observable;
import java.util.Observer;public class MainFrame extends JFrame implements Observer,Constants {private GamePanelSingle gamePanelSingle;//玩游戏界面private PanelEndS panelEndS;private PanelEndD panelEndD;public static Container c1;//容器public static StartPanel startPanel;private JMenuBar bar1;public MainFrame(Observable ob){ob.addObserver(this);initMenuBar1();c1 = this.getContentPane();c1.setLayout(new BorderLayout());//开始游戏界面startPanel = new StartPanel(ob,this);gamePanelSingle = new GamePanelSingle(this);panelEndS = new PanelEndS(this.gamePanelSingle,this);panelEndD = new PanelEndD(StartPanel.gamePanelDouble,this);bar1.setVisible(false);//设置菜单条不可见c1.add(startPanel,BorderLayout.CENTER);c1.add(bar1,BorderLayout.NORTH);this.setSize(WINDOW_WIDE, WINDOW_HEIGHT);/*获取屏幕高、宽度*/int screenW = Toolkit.getDefaultToolkit().getScreenSize().width;int screenH = Toolkit.getDefaultToolkit().getScreenSize().height;/*设置窗体居中*/this.setLocation(screenW/2-WINDOW_WIDE/2,screenH/2- WINDOW_HEIGHT /2);/*设置默认关闭按钮*/this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setVisible(true);}/*初始化菜单条*/public void initMenuBar1(){bar1 = new JMenuBar();JMenu jMenu1 = new JMenu("菜单");JMenuItem item1 = new JMenuItem("开始");item1.addActionListener(e -> {gamePanelSingle.play();//开始游戏gamePanelSingle.start();});JMenuItem item2 = new JMenuItem("暂停");item2.addActionListener(e -> {gamePanelSingle.pause();//暂停游戏});JMenuItem item3 = new JMenuItem("退出");item3.addActionListener(e -> {System.exit(0);//结束游戏});jMenu1.add(item1);jMenu1.add(item2);jMenu1.add(item3);bar1.add(jMenu1);}@Overridepublic void update(Observable o, Object arg) {StartPanel startPanel = (StartPanel) arg;c1.remove(startPanel);bar1.setVisible(true);c1.add(gamePanelSingle,BorderLayout.CENTER);gamePanelSingle.requestFocus();//游戏面板获得焦点,才能响应键盘监听repaint();}public void singleEnd(){c1.remove(gamePanelSingle);c1.add(panelEndS,BorderLayout.CENTER);panelEndS.requestFocus();panelEndS.setVisible(true);repaint();}public void doubleEnd(){c1.remove(StartPanel.gamePanelDouble);c1.add(panelEndD,BorderLayout.CENTER);panelEndD.requestFocus();panelEndD.setVisible(true);repaint();}@Overridepublic void paint(Graphics g) {super.paint(g);super.paintComponents(g);}
}

MusicBackground.java

package com.qt;import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;public class MusicBackground {public void playMusic(String path){try {File musicPath = new File(path);if(musicPath.exists()){AudioInputStream audioInput = AudioSystem.getAudioInputStream(musicPath);Clip clip = AudioSystem.getClip();clip.open(audioInput);clip.start();clip.loop(Clip.LOOP_CONTINUOUSLY);}} catch(Exception ex){ex.printStackTrace();}}
}

MusicExplode.java

package com.qt;import sun.audio.AudioPlayer;import java.io.FileInputStream;
import java.io.IOException;public class MusicExplode {private String musicFilePath;public MusicExplode(String musicFilePath) {this.musicFilePath = musicFilePath;try{AudioPlayer.player.start(new FileInputStream(musicFilePath));}catch(IOException iox) {System.out.printf("播放音效失败。"+musicFilePath+"文件出错!");iox.printStackTrace();}}
}

MyButton.java

package com.qt;import javax.swing.*;
import java.awt.*;public class MyButton extends JButton {public MyButton(String name) {/*设置按钮的名字、字体、背景颜色*/this.setText(name);Font font = new Font("楷体",Font.BOLD,28);this.setBackground(Color.GRAY);this.setFont(font);this.setForeground(Color.yellow);this.setMargin(new Insets(0,0,0,0));//设置无边距this.setForeground(Color.YELLOW);//设置字体颜色this.setHorizontalAlignment(CENTER);//居中对齐this.setContentAreaFilled(true);//填充背景颜色}
}

OptionPanel.java

package com.qt;import javax.swing.*;
import java.awt.*;import static com.qt.GamePanelSingle.OP;
import static com.qt.MainFrame.c1;public class OptionPanel extends JPanel {private Image image;private JButton btn1;private JButton btn2;private JButton btnB;private StartPanel o;public OptionPanel(StartPanel o){this.image = Utils.getImage("main4.png");this.o=o;this.btn1 = new MyButton("简单");this.btn2 = new MyButton("困难");this.btnB = new MyButton("返回主页");this.btn1.addActionListener(e -> Easy());this.btn2.addActionListener(e -> Diff());this.btnB.addActionListener(e -> Back());Dimension size1 = this.btn1.getPreferredSize();Dimension size2 = this.btn2.getPreferredSize();Dimension sizeB = this.btnB.getPreferredSize();this.setLayout(null);this.btn1.setBounds(320 - size1.width / 2, 340 - size1.height / 2 - 25, size1.width, size1.height);this.btn2.setBounds(320 - size2.width / 2, 340 - size2.height / 2 + 25,size2.width, size2.height);this.btnB.setBounds(320 - sizeB.width / 2, 340 - sizeB.height / 2 + 100,sizeB.width, sizeB.height);this.add(this.btn1);this.add(this.btn2);this.add(this.btnB);}public void paint(Graphics g) {super.paint(g);g.drawImage(this.image, 0, 0, 640, 680, null);super.paintComponents(g);}public void setV(){o.setVisible(false);this.setVisible(true);c1.remove(o);c1.add(this,BorderLayout.CENTER);this.requestFocus();//游戏面板获得焦点,才能响应键盘监听repaint();}public void Easy(){OP = 1;this.setVisible(false);o.setVisible(true);c1.remove(this);c1.add(o,BorderLayout.CENTER);this.requestFocus();//游戏面板获得焦点,才能响应键盘监听repaint();}public void Diff(){OP = 2;this.setVisible(false);o.setVisible(true);c1.remove(this);c1.add(o,BorderLayout.CENTER);this.requestFocus();//游戏面板获得焦点,才能响应键盘监听repaint();}public void Back(){this.setVisible(false);o.setVisible(true);c1.remove(this);c1.add(o,BorderLayout.CENTER);o.requestFocus();//游戏面板获得焦点,才能响应键盘监听repaint();}}

panelEndD.java

package com.qt;import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import static com.qt.MainFrame.c1;
import static com.qt.MainFrame.startPanel;public class PanelEndD extends JPanel implements Constants {private Image image;private JButton btn1;private Container c1;private final MainFrame frame;private final GamePanelDouble o;public PanelEndD(GamePanelDouble o,MainFrame frame){this.frame = frame;c1 = frame.getContentPane();this.image = Utils.getImage("main4.png");this.o=o;this.btn1 = new MyButton("继续游戏");this.btn1.addActionListener(e -> GoOn());Dimension size1 = this.btn1.getPreferredSize();this.setLayout(null);this.btn1.setBounds(320 - size1.width / 2, 340 - size1.height / 2+50, size1.width, size1.height);this.add(this.btn1);}public void paint(Graphics g) {super.paint(g);g.drawImage(this.image, 0, 0, 640, 680, null);super.paintComponents(g);drawScore(g);}//继续游戏public void GoOn(){this.setVisible(false);o.setVisible(true);c1.remove(this);c1.add(o,BorderLayout.CENTER);o.requestFocus();//游戏面板获得焦点,才能响应键盘监听Reset();repaint();}
//    public void setV(){
//        c1.add(this,BorderLayout.CENTER);
//        this.setVisible(true);
//        o.setVisible(false);
//        c1.remove(o);
//        this.requestFocus();//游戏面板获得焦点,才能响应键盘监听
//        repaint();
//    }public void drawScore(Graphics g){g.setColor(Color.white);g.setFont(new Font("楷体",Font.BOLD,30));
//        List<Integer> score;int score1 = o.getScore1();int score2 = o.getScore2();g.drawString("玩家1的得分:"+score1,100,250);g.drawString("玩家2的得分:"+ score2,100,300);}public void Reset(){o.Reset();}
}

PanelEndS.java

package com.qt;import javax.swing.*;
import java.awt.*;import static com.qt.MainFrame.c1;
import static com.qt.MainFrame.startPanel;public class PanelEndS extends JPanel implements Constants {private Image image;private JButton btn1;private Container c1;private final MainFrame frame;private GamePanelSingle o;public PanelEndS(GamePanelSingle o,MainFrame frame){this.frame = frame;c1 = frame.getContentPane();this.image = Utils.getImage("main4.png");this.o=o;this.btn1 = new MyButton("继续游戏");this.btn1.addActionListener(e -> GoOn());Dimension size1 = this.btn1.getPreferredSize();this.setLayout(null);this.btn1.setBounds(320 - size1.width / 2, 340 - size1.height / 2+50, size1.width, size1.height);this.add(this.btn1);}public void paint(Graphics g) {super.paint(g);g.drawImage(this.image, 0, 0, 640, 680, null);super.paintComponents(g);drawScore(g);
//        super.paint(g);
//        super.paintComponents(g);}//继续游戏public void GoOn(){this.setVisible(false);o.setVisible(true);c1.remove(this);c1.add(o,BorderLayout.CENTER);o.requestFocus();//游戏面板获得焦点,才能响应键盘监听Reset();repaint();}//    public void setV(){
//        c1.add(this,BorderLayout.CENTER);
//        this.setVisible(true);
//        o.setVisible(false);
//        c1.remove(o);
//        this.requestFocus();//游戏面板获得焦点,才能响应键盘监听
//        repaint();
//    }public void drawScore(Graphics g){g.setColor(Color.white);g.setFont(new Font("楷体",Font.BOLD,30));int score = o.getScore();g.drawString("玩家的得分:"+score,100,300);}public void Reset(){o.Reset();}
}

PanelObservable.java

package com.qt;import java.util.Observable;public class PanelObservable extends Observable {@Overridepublic void notifyObservers(Object arg) {this.setChanged();super.notifyObservers(arg);}
}

RulePanel.java

package com.qt;import javax.swing.*;
import java.awt.*;import static com.qt.MainFrame.c1;public class RulePanel extends JPanel {private Image image;private JButton btn1;private StartPanel o;public RulePanel(StartPanel o){this.image = Utils.getImage("main4.png");this.o=o;this.btn1 = new MyButton("返回主页");this.btn1.addActionListener(e -> Back());Dimension size1 = this.btn1.getPreferredSize();this.setLayout(null);this.btn1.setBounds(320 - size1.width / 2, 340 - size1.height / 2+100, size1.width, size1.height);this.add(this.btn1);}public void paint(Graphics g) {super.paint(g);g.drawImage(this.image, 0, 0, 640, 680, null);super.paintComponents(g);drawRule(g);}private void drawRule(Graphics g){g.setColor(Color.RED);g.setFont(new Font("楷体",Font.BOLD,30));g.drawString("方向键或者AD控制方向",100,300);g.drawString("空格或S发射子弹",150,350);}public void setV(){o.setVisible(false);this.setVisible(true);c1.remove(o);c1.add(this,BorderLayout.CENTER);this.requestFocus();//游戏面板获得焦点,才能响应键盘监听repaint();}public void Back(){this.setVisible(false);o.setVisible(true);c1.remove(this);c1.add(o,BorderLayout.CENTER);o.requestFocus();//游戏面板获得焦点,才能响应键盘监听repaint();}}

StartPanel.java

package com.qt;import javax.swing.*;
import java.awt.*;
import java.util.Observable;
public class StartPanel extends JPanel implements Constants {public static GamePanelDouble gamePanelDouble;private final Image image;private MainFrame frame;public StartPanel(final Observable ob,MainFrame frame) {this.frame = frame;this.image = Utils.getImage("main7.png");JButton btnS1 = new MyButton("单人游戏");JButton btnS2 = new MyButton("双人游戏");JButton btnR = new MyButton("游戏规则");JButton btnO = new MyButton("游戏设置");JButton btnE = new MyButton("结束游戏");OptionPanel OptionPanel = new OptionPanel(StartPanel.this) ;RulePanel RulePanel = new RulePanel(StartPanel.this) ;gamePanelDouble = new GamePanelDouble(StartPanel.this,frame);/*按钮按下触发事件*/btnE.addActionListener(e -> System.exit(0));btnS1.addActionListener(e -> ob.notifyObservers(StartPanel.this));/*双人模式*/btnS2.addActionListener(e -> gamePanelDouble.setV());/*规则*/btnR.addActionListener(e -> RulePanel.setV());/*设置*/btnO.addActionListener(e -> OptionPanel.setV() );/*按钮尺寸*/Dimension sizeS1 = btnS1.getPreferredSize();Dimension sizeS2 = btnS2.getPreferredSize();Dimension sizeR = btnR.getPreferredSize();Dimension sizeO= btnO.getPreferredSize();Dimension sizeE = btnE.getPreferredSize();this.setLayout(null);btnS1.setBounds(320 - sizeS1.width / 2, 340 - sizeS1.height / 2 - 25-50, sizeS1.width, sizeS1.height);btnS2.setBounds(320 - sizeS2.width / 2, 340 - sizeS2.height / 2 + 25-50,sizeS2.width, sizeS2.height);btnR.setBounds(320 - sizeR.width / 2, 340 - sizeR.height / 2 + 25, sizeR.width, sizeR.height);btnO.setBounds(320 - sizeO.width / 2, 340 - sizeO.height / 2 + 25+50, sizeO.width, sizeO.height);btnE.setBounds(320 - sizeE.width / 2, 340 - sizeE.height / 2 + 25+100, sizeE.width, sizeE.height);this.add(btnS1);this.add(btnS2);this.add(btnR);this.add(btnO);this.add(btnE);}public void paint(Graphics g) {super.paint(g);g.drawImage(this.image, 0, 0, 640, 680, null);super.paintComponents(g);}}

Utils.java

package com.qt;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Objects;public class Utils {/* 获取图片资源*/public static BufferedImage getImage(String path){try {/* 加载图片 */return ImageIO.read(Objects.requireNonNull(Utils.class.getResource("/"+path)));} catch (IOException e) {e.printStackTrace();}return null;}
}

Constants.java

package com.qt;public interface Constants {int WINDOW_WIDE = 640;//设置窗体宽度int WINDOW_HEIGHT = 680;//设置窗体高度
}

若需要源代码文件夹私聊

JAVA游戏——潜艇大战相关推荐

  1. 《游戏学习》 Java实现潜艇大战游戏源码

    项目目录 项目代码 启动类 SubmarineWarMain代码 package com.stj.views;import java.util.Observable;public class Subm ...

  2. Java项目:潜艇大战项目(java+swing)

    源码获取:博客首页 "资源" 里下载! 功能简介: Java swing实现的一款小游戏潜艇大战的项目源码 游戏界面: @SuppressWarnings({ "unus ...

  3. 小游戏-------------潜艇大战

    <--第一天   --> 潜艇游戏----潜艇大战图片 列表 创建战舰类.侦察潜艇类.鱼雷潜艇类.水雷潜艇类.水雷类.深水炸弹类,设计类中的成员变量和move()方法 创建World类,在 ...

  4. java实现潜艇大战(期末实训)

    java实现潜艇大战(期末实训作业) package com.util; import java.awt.BorderLayout; import java.awt.Color; import jav ...

  5. Java 编写潜艇大战游戏 窗体程序 完整源码

    今天为大家分享潜艇大战的开发与制作.整个系统界面漂亮,有完整源码提供,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步 开发环境 开发语言为Java,开发环境Eclipse或者IDEA都可以 ...

  6. 基于VC++实现游戏潜艇大战源码,潜艇大战一触即发

    C++编写的原汁原味的潜艇大战源码,这是一个国外VC++高手编写的潜艇大战,其玩法和界面效果均和windows电脑中自带的潜艇大战十分相似,从编译情况来看,游戏开发时未使用第三方控件,在VC6环境下, ...

  7. 基于VC++实现游戏潜艇大战源码,让您体会C/C++的魅力

    VC++编写的原汁原味的潜艇大战源码,这是一个国外VC++高手编写的潜艇大战,其玩法和界面效果均和windows电脑中自带的潜艇大战十分相似,从编译情况来看,游戏开发时未使用第三方控件,在VC6环境下 ...

  8. java实现潜艇大战游戏_基于Java实现的潜艇大战游戏

    一.需求分析 本次游戏课程设计小组成员团队合作的方式,通过游戏总体分析设计,场景画面的绘制,游戏事件的处理,游戏核心算法的分析实现,游戏的碰撞检测,游戏的反复测试,游戏的打包运行等一个完整的游戏设计编 ...

  9. java实现潜艇大战游戏_java潜艇大战游戏源码项目

    代码如下 package com.util; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimensio ...

  10. Java游戏 坦克大战

    package javabook; import java.util.Scanner; import java.util.Random; public class Fight { public sta ...

最新文章

  1. c语言宏嵌套和展开规则
  2. GPT-3再进化:通过浏览网页来提高事实准确率
  3. 学习Angular前了解下TypeScript
  4. 如何将自己写的verilog模块封装成IP核(一)
  5. 《企业的边界》的书摘
  6. 虚拟机拷贝出来_NETAPP存储虚拟机数据恢复案例
  7. PHP中如何配置smarty框架实现PHP代码和HTML代码分离
  8. leetcode1050. 合作过至少三次的演员和导演(SQL)
  9. RadioButtonList Enabled=false 文字背景
  10. JEECG整合JXLS步骤与开发
  11. TMM|车辆重识别的一些实践
  12. Linux下部署WordPress
  13. 单片机开发怎么把杜邦线弄整齐?
  14. 简单易懂的ROC曲线和AUC面积
  15. 时空本质性差异:两点间的距离不再是直线最短
  16. 边境的悍匪—机器学习实战:第八章 降维
  17. 阿里云大规模即时云渲染支撑天猫双11“直播未来城”
  18. 酷派android最新版本,酷云手机版下载
  19. 李沐精读论文:MAE 《Masked Autoencoders Are Scalable Vision Learners》
  20. Lambda表达式到底是什么?——简单了解Lambda表达式

热门文章

  1. 我的世界python造房子_创造属于自己的世界!教你如何在《我的世界》建造建筑...
  2. Vue简易购物车实例
  3. matlab单机无限大系统_MATLAB运用simulink建立简单的单机-无穷大系统仿真
  4. css 设置浏览器最小宽度
  5. xodo pdf android,Xodo PDF查看器和编辑器「Xodo PDF Viewer Editor」
  6. IDEA插件系列(46):PDF Viewer插件——PDF文档查看器
  7. 最新Java全套开发视频教程
  8. WiFi 抓包工具使用SOP(OmniPeek)
  9. afterburner功耗限制调不了_为啥我的MSIAfterburner很多项都拖不了
  10. python 离线安装numpy_Python本地安装numpy包