实训报告书
实训名称: JAVA扫雷小游戏
系(部): 信息工程系
专业班级:
学生姓名:
学 号:
指导教师: ##
完成日期: 20##.12.11
山东科技大学泰山科技学院
1 实训目的......................................................................................... 1
2 扫雷游戏系统的分析与设计........................................................ 1
2.1 系统功能描述...................................................................... 1
2.2 系统模块设计...................................................................... 1
3 主要代码清单............................................................................... 3
4 程序运行与测试.......................................................................... 11
5 实训总结..................................................................................... 13
扫雷游戏系统的设计与实现
随着社会的不断进步,人们所承受的压力不断上升,在游戏层出不穷的时刻,扫雷游戏仍受到不少人的青睐,其本身的性质,决定了人们对它的喜爱程度,不需要特殊的技巧,不需要不断地升级,不需要太多的时间进行初步的熟悉,简简单单却乐趣无穷。
(1)该游戏具有计时功能,即扫完全部地雷所花费的时间。
(2)用户可以选择是否有音效。 (3)用户可以自定义级别,还可以输入任意地雷数。
(4)自动保存扫雷排行榜。
系统的整体布局为:CardLayout布局,采用菜单、按钮、面板„„等组件,菜单项主要有开始,选择级别,自定义,标记,声音,扫雷排行榜,退出,按钮的功能是重新开始游戏(可以选择游戏菜单里的开局,也可以点击企鹅图标重新开始游戏)。
系统结构图
系统流程图
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);}}
设置地雷数为10时没有踩到地雷
设置地雷数为10时 踩到地雷
设置地雷数为20时没有踩到地雷
在编写扫雷这个游戏的过程中,让我注意到许多以前没有在意的细节,这些细节在编程的过程中必不可少。以前自以为是的认为数据结构,算法不重要,只要学会编程就行了,但是在编写扫雷这个游戏中的部分都用到了算法,如雷区的布局,没有算法,基本就进行不下去。这是自己的不足之处,也是自己的待补处,特别是数据结构--必备品。算法可以多看一点,不必深究。虽然编写扫雷游戏困难重重,但所幸自己还是坚持了下来,万事开头难,有了第一次,第二次就不那么困难了。坚持自己的本心,坚持不懈地努力下去,总有收获的,哪怕再少,长久的积累总会有巨额自身资本的。
计算机技术系实训项目报告书20##20##学年第1学期实训项目名称:个人博客网页设计姓名:学号:所在专业:计算机技术系所在班级:1…
毕业实习报告书实习时间20xx年2月20日20xx年4月20日实习单位国美电器广西桂林分公司实习岗位营业员实习目的用过毕业实习了解…
附件1实训报告版面要求实训报告要求用A4纸打印页边距上下25cm左右30cm左侧装订一页眉页眉应居中臵于页面上部为系201届学生毕…
机械制造装备实训实训报告班级080311学号08031113姓名刘子承南昌航空大学机械制造装备实训一实训目的1提高学生综合应用所学…
实训报告书实训名称:JAVA扫雷小游戏系(部):信息工程系专业班级:学生姓名:学号:指导教师:##完成日期:20##.12.11山…
小学科学三年级下册演示实验报告单实验内容观察研究土壤年级三年级下册第一单元课题2了解土壤实验器材湿土块含较多腐殖质的土壤餐巾纸烧杯…
科学实验报告单科学实验报告单科学实验报告单科学实验报告单科学实验报告单科学实验报告单科学实验报告单科学实验报告单科学实验报告单
三上郴州市九完小科学实验报告单1郴州市九完小科学实验报告单16郴州市九完小科学实验报告单2郴州市九完小科学实验报告单3郴州市九完小…
四年级小学科学实验报告单第2课植物的根实验名称验证根的吸收作用实验目的会设计观察实验知道根有吸收作用实验器材一株生长好的植物玻璃杯…
科学实验报告单1科学实验报告单2科学实验报告单3科学实验报告单4九完小科学实验报告单10九完小科学实验报告单11九完小科学实验报告…
成都东软学院信管系专业技能综合实训报告项目名称:财务综合实训专业:学号:学生名字:班级:指导老师:年月日目录1项目概述......…