• 前言一、任务概述1.1目标1.2用例模型二、游戏规则
  • 三、游戏代码



前言

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

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


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

一、任务概述

1.1目标

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

1.2用例模型

  主界面:

java潜艇大战项目经验 潜艇大战下载_键盘监听

 单人游戏界面:

java潜艇大战项目经验 潜艇大战下载_java潜艇大战项目经验_02

 双人游戏界面:

java潜艇大战项目经验 潜艇大战下载_java_03

 游戏设定界面:

java潜艇大战项目经验 潜艇大战下载_小游戏_04

 游戏运行截图:

java潜艇大战项目经验 潜艇大战下载_小游戏_05

  

二、游戏规则

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

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

    }

    @Override
    public 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();

    }

    @Override
    public 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 {
    @Override
    public 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;//设置窗体高度
}