实训报告书

实训报告书

实训名称:     JAVA扫雷小游戏     

(部):      信息工程系      

专业班级:           

学生姓名:                 

    号:           

指导教师:         ##         

完成日期:       20##.12.11      

山东科技大学泰山科技学院


目  录

1 实训目的......................................................................................... 1

2  扫雷游戏系统的分析与设计........................................................ 1

2.1  系统功能描述...................................................................... 1

2.2  系统模块设计...................................................................... 1

3  主要代码清单............................................................................... 3

4  程序运行与测试.......................................................................... 11

5  实训总结..................................................................................... 13

扫雷游戏系统的设计与实现

1 实训目的

随着社会的不断进步,人们所承受的压力不断上升,在游戏层出不穷的时刻,扫雷游戏仍受到不少人的青睐,其本身的性质,决定了人们对它的喜爱程度,不需要特殊的技巧,不需要不断地升级,不需要太多的时间进行初步的熟悉,简简单单却乐趣无穷。

2  扫雷游戏系统的分析与设计

2.1  系统功能描述

(1)该游戏具有计时功能,即扫完全部地雷所花费的时间。 

(2)用户可以选择是否有音效。 (3)用户可以自定义级别,还可以输入任意地雷数。 

(4)自动保存扫雷排行榜。

2.2  系统模块设计

系统的整体布局为:CardLayout布局,采用菜单、按钮、面板„„等组件,菜单项主要有开始,选择级别,自定义,标记,声音,扫雷排行榜,退出,按钮的功能是重新开始游戏(可以选择游戏菜单里的开局,也可以点击企鹅图标重新开始游戏)。

2.3  数据库结构设计

   

                                 系统结构图

                                系统流程图

3  主要代码清单

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Frame

 extends JFrame {

  JTextField text;

  JLabel nowBomb, setBomb;

  int BombNum, BlockNum; // 当前雷数,当前方块数

  int rightBomb, restBomb, restBlock; // 找到的地雷数,剩余雷数,剩余方块

  JButton start = new JButton(" 开始 ");

  JPanel MenuPamel = new JPanel();

  JPanel bombPanel = new JPanel();

  Bomb[][] bombButton;

  JPanel c;

  BorderLayout borderLayout1 = new BorderLayout();

  GridLayout gridLayout1 = new GridLayout();

  public Frame() {

    try {

      setDefaultCloseOperation(EXIT_ON_CLOSE);

      jbInit();}

    catch (Exception exception) {

      exception.printStackTrace(); }}

private void jbInit() throws Exception {

    c = (JPanel) getContentPane();

    setTitle("扫雷");

    c.setBackground(Color.WHITE);

    MenuPamel.setBackground(Color.GRAY);

    c.setLayout(borderLayout1);

    setSize(new Dimension(600, 600));

    setResizable(false);

    BlockNum = 144;

    BombNum = 10;

    text = new JTextField("10 ", 3);

    nowBomb = new JLabel("当前雷数" + ":" + BombNum);

    setBomb = new JLabel("设置地雷数");

    start.addActionListener(new Frame1_start_actionAdapter(this));

    MenuPamel.add(setBomb);

    MenuPamel.add(text);

    MenuPamel.add(start);

    MenuPamel.add(nowBomb);

    c.add(MenuPamel, java.awt.BorderLayout.SOUTH);

    bombPanel.setLayout(gridLayout1);

    gridLayout1.setColumns( (int) Math.sqrt(BlockNum));

    gridLayout1.setRows( (int) Math.sqrt(BlockNum));

    bombButton = new Bomb[ (int) Math.sqrt(BlockNum)][ (int) Math.sqrt(BlockNum)];

    for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {

      for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {

        bombButton[i][j] = new Bomb(i, j);

        //bombButton[i][j].setSize(10, 10);

        bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//设置字体

        bombButton[i][j].setForeground(Color.white);

        bombButton[i][j].addMouseListener(new Bomb_mouseAdapter(this));

        bombButton[i][j].addActionListener(new Bomb_actionAdapter(this));

        bombPanel.add(bombButton[i][j]); }}

    c.add(bombPanel, java.awt.BorderLayout.CENTER);

    startBomb();} /* 开始按钮 */

  public void start_actionPerformed(ActionEvent e) {

   int num=Integer.parseInt(text.getText().trim());

    if (num >= 5 && num < 50) {

      BombNum = num;

      startBomb();}

    else if (num < 5) {

      JOptionPane.showMessageDialog(null, "您设置的地雷数太少了,请重设!", "错误",

        JOptionPane.ERROR_MESSAGE);

          num=10;

      BombNum = num;}

    else {

      JOptionPane.showMessageDialog(null, "您设置的地雷数太多了,请重设!", "错误",

  JOptionPane.ERROR_MESSAGE);

     num=10;

BombNum = num; } }/* 开始,布雷 */

 public void startBomb() {

    nowBomb.setText("当前雷数" + ":" + BombNum);

    for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {

      for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {

        bombButton[i][j].isBomb = false;

        bombButton[i][j].isClicked = false;

        bombButton[i][j].isRight = false;

        bombButton[i][j].BombFlag = 0;

        bombButton[i][j].BombRoundCount = 9;

        bombButton[i][j].setEnabled(true);

        bombButton[i][j].setText("");

        bombButton[i][j].setFont(new Font("", Font.PLAIN, 14));//设置字体bombButton[i][j].setForeground(Color.BLUE);

        rightBomb = 0;

        restBomb = BombNum;

        restBlock = BlockNum - BombNum; }}

    for (int i = 0; i < BombNum; ) {

      int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));

      int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1));

      if (bombButton[x][y].isBomb != true) {

        bombButton[x][y].isBomb = true;

        i++; }

    CountRoundBomb();} /* 计算方块周围雷数 *

  public void CountRoundBomb() {

    for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {

      for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {

        int count = 0;

        // 当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数

        if (bombButton[i][j].isBomb != true) {

          for (int x = i - 1; x < i + 2; x++) {

            for (int y = j - 1; y < j + 2; y++) {

              if ( (x >= 0) && (y >= 0)

                  && (x < ( (int) Math.sqrt(BlockNum)))

                  && (y < ( (int) Math.sqrt(BlockNum)))) {

                if (bombButton[x][y].isBomb == true) {

                  count}

          bombButton[i][j].BombRoundCount = co}}

  /* 是否挖完了所有的雷 */

  public void isWin() {

    restBlock = BlockNum - BombNum;

    for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {

      for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {

        if (bombButton[i][j].isClicked == true) {

          restBlock--;} }

    if (rightBomb == BombNum || restBlock == 0) {

      JOptionPane.showMessageDialog(this, "您挖完了所有的雷,您胜利了!", "胜利",

                                 JOptionPane.INFORMATION_MESSAGE);

      startBomb();}}

/** 当选中的位置为空,则翻开周围的地图* */

  public void isNull(Bomb ClickedButton) {

    int i, j;

    i = ClickedButton.num_x;

    j = ClickedButton.num_y;

    for (int x = i - 1; x < i + 2; x++) {

      for (int y = j - 1; y < j + 2; y++) {

        if ( ( (x != i) || (y != j)) && (x >= 0) && (y >= 0)

            && (x < ( (int) Math.sqrt(BlockNum)))

            && (y < ( (int) Math.sqrt(BlockNum)))) {

          if (bombButton[x][y].isBomb == false

              && bombButton[x][y].isClicked == false

              && bombButton[x][y].isRight == false) {

            turn(bombButton[x][y]);} }} } /* 翻开 */

  public void turn(Bomb ClickedButton) {

    ClickedButton.setEnabled(false);

    ClickedButton.isClicked = true;

    if (ClickedButton.BombRoundCount > 0) {

      ClickedButton.setText(ClickedButton.BombRoundCount + "");}

    else {

      isNull(ClickedButton);} } /* 左键点击 */

  public void actionPerformed(ActionEvent e) {

    if ( ( (Bomb) e.getSource()).isClicked == false

        && ( (Bomb) e.getSource()).isRight == false) {

      if ( ( (Bomb) e.getSource()).isBomb == false) {

        turn( ( (Bomb) e.getSource()));

        isWin();}

      else {

        for (int i = 0; i < (int) Math.sqrt(BlockNum); i++) {

          for (int j = 0; j < (int) Math.sqrt(BlockNum); j++) {

            if (bombButton[i][j].isBomb == true) {

              bombButton[i][j].setText("b"); } } }

        ( (Bomb) e.getSource()).setForeground(Color.RED);

        ( (Bomb) e.getSource()).setFont(new Font("", Font.BOLD, 20));

        ( (Bomb) e.getSource()).setText("X");

        JOptionPane.showMessageDialog(this, "你踩到地雷了,按确定重来", "踩到地雷", 2);

        startBomb( } }}/* 右键点击 */

  public void mouseClicked(MouseEvent e) {

    Bomb bombSource = (Bomb) e.getSource();

    boolean right = SwingUtilities.isRightMouseButton(e);

    if ( (right == true) && (bombSource.isClicked == false)) {

      bombSource.BombFlag = (bombSource.BombFlag + 1) % 3;

      if (bombSource.BombFlag == 1) {

        if (restBomb > 0) {

          bombSource.setForeground(Color.RED);

          bombSource.setText("F");

          bombSource.isRight = true;

          restBomb--;}

        else {

          bombSource.BombFlag = 0; }}

      else if (bombSource.BombFlag == 2) {

        restBomb++;

        bombSource.setText("Q");

        bombSource.isRight = false;

      }

      else {

        bombSource.setText("");

      }

      if (bombSource.isBomb == true) {

        if (bombSource.BombFlag == 1) {

          rightBomb++;

        }

        else if (bombSource.BombFlag == 2) {

          rightBomb--; } }

      nowBomb.setText("当前雷数" + ":" + restBomb);

      isWin() } }

  public static void main(String[] args) {

    Frame frame = new Frame();

    frame.setVisible(true)}}

class Frame1_start_actionAdapter

    implements ActionListener {

  private Frame adaptee;

  Frame1_start_actionAdapter(Frame adaptee) {

    this.adaptee = adaptee; }

  public void actionPerformed(ActionEvent e) {

    adaptee.start_actionPerformed(e); }}

/class Bomb

    extends JButton {

  int num_x, num_y; // 第几号方块

  int BombRoundCount; // 周围雷数

  boolean isBomb; // 是否为雷

  boolean isClicked; // 是否被点击

  int BombFlag; // 探雷标记

  boolean isRight; // 是否点击右键

  public Bomb(int x, int y) {

    num_x = x;

    num_y = y;

    BombFlag = 0;

    BombRoundCount = 9;

    isBomb = false;

    isClicked = false;

    isRight = false; }}

class Bomb_actionAdapter

    implements ActionListener {

  private Frame adaptee;

  Bomb_actionAdapter(Frame adaptee) {

    this.adaptee = adaptee;}

  public void actionPerformed(ActionEvent e) {

    adaptee.actionPerformed(e); }}

class Bomb_mouseAdapter

    extends MouseAdapter {

  private Frame adaptee;

  Bomb_mouseAdapter(Frame adaptee) {

    this.adaptee = adaptee; }

  public void mouseClicked(MouseEvent e) {

    adaptee.mouseClicked(e);}}

4  程序运行与测试

                     设置地雷数为10时没有踩到地雷

                     设置地雷数为10时 踩到地雷

设置地雷数为20时没有踩到地雷

5  实训总结

在编写扫雷这个游戏的过程中,让我注意到许多以前没有在意的细节,这些细节在编程的过程中必不可少。以前自以为是的认为数据结构,算法不重要,只要学会编程就行了,但是在编写扫雷这个游戏中的部分都用到了算法,如雷区的布局,没有算法,基本就进行不下去。这是自己的不足之处,也是自己的待补处,特别是数据结构--必备品。算法可以多看一点,不必深究。虽然编写扫雷游戏困难重重,但所幸自己还是坚持了下来,万事开头难,有了第一次,第二次就不那么困难了。坚持自己的本心,坚持不懈地努力下去,总有收获的,哪怕再少,长久的积累总会有巨额自身资本的。 

相关推荐