admin 管理员组

文章数量: 887021


2024年2月28日发(作者:mips汇编语言入门)

Java应用技术实训报告

一.总体设计

本系统共包括3个java源文件和4个图像文件。

1•类之间的关系如图1.1所示。

图1.1类之的关系

源文件及其功能如表1所示。

表1源文件及其功能

序号

1

2

文件名

主要功能

生成的类负责创建程序窗口,含有main方法,游戏从 该类开始执行。

为主类创建整个挖雷游戏的对象,包括窗口,布雷,判 断等等。

负责创建游戏所需要的按钮。

3

3.图像文件

:地雷方块上的图标。

:疑惑探雷是否正确。

bomb_:触雷时方块上的图标。

:探雷标记。

二、详细设计

1 .主类Main

(1)成员变量(见表2)

表2

成员变量描述

游戏运行

变量类型

MainBomb

备注

临时变量

(2)成员变量(见表3)

表3

名称

main

功能

备注

游戏开始

(3)源代码见文件

import .*;

import .*;

import .*;

/*主类*/

public class Main

(

public static void main(String args[])

(

(new MainBomb()).show();

)

)

2 .挖雷游戏MainBomb

(1)成员变量(见表4)

表4

成员变量描述

雷数设置

当前方块数

当前雷数

开始

踩雷

踩雷标记

雷标记

疑惑是否有雷

目录面板

变量类型

JTextField

int

int

JButton

Icon

Icon

Icon

Icon

Panel

Panel

名称

text

BlockNum

BombNum

start

icon_bomb

icon_bomb_big

icon_flag

icon_question

MenuPamel

mainPanel 主面板

该方块是否有雷

方块周围的雷数

方块上的雷标记

显示方块信息

方块在雷区的位置

布雷

判断标记是否正确

是否获得胜利

雷标数目

Bomb[][]

boolean

int

int

JLabel

Point

RandomSet

Determine

Winner

int

int

bombButton

周围无雷

周围的雷数

探雷标记

Label

P

set

Determine

Win

count

count1 周围方块的雷数

(2)方法见(表5)

表5

方法名

Game

newGame

创建程序窗口

新开局

接口方法

功能

bar

备注

actionPerformed 设置处理ActionEvent事件 设置雷的方块是否有雷 设置是雷值

时的图标 设置无雷时的设置label上的图标 设置label上图标 设置有雷时的名字

的图标 设置label上的文字 设置设置周围的雷数 获取名周围的雷数

字 获取周围雷数

返回方块label上的文字 返回周围的雷数

设置雷区位置 获取雷区位置

获取探雷标记

mousePressed

mouseClicked

mouseReleased

mouseExited

mouseEntered

MinesSquare

设置属性P 返回属性P

返回探雷标记

处理鼠标按下事件

处理鼠标双击事件

处理鼠标释放事件

处理鼠标退出事件

处理鼠标进入事件

接口方法

接口方法

接口方法

接口方法

接口方法

创建雷区

gameOver 判断雷标是游戏失败

否正确 布雷 判断是否成功

正确返回true错误返回false

随机布雷

成功返回true失败返回false

(3)源代码见文件

import .*;

import .*;

import .*;

/*窗口及算法实现类*/

class MainBomb extends JFrame implements

ActionListener,MouseListener

(

public JTextField text;

public Label nowBomb,setBomb;

public int BlockNum,BombNum;

//当前方块数当前雷数

public Icon icon_bomb = new ImageIcon("");

//踩雷

public Icon icon_bomb_big = new ImageIcon("bomb_");

//踩雷标记

public Icon icon_flag = new ImageIcon("");

//雷标记

public Icon icon_question = new ImageIcon("");

//疑惑是否有雷

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

public Panel MenuPamel = new Panel();

public Panel mainPanel = new Panel();

public Bomb[][] bombButton;

/*界面设计*/

public MainBomb()

super("成型04-2李超JAVA课程设计");

BlockNum = 64;

BombNum = 10;

Container c=getContentPane();

kground();

out(new BorderLayout());

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

nowBomb = new Label(%前雷数"+" "+BombNum+"");

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

ionListener(new ActionListener(){

public void actionPerformed(ActionEvent e)

{

BombNum = nt(t().trim());

if(BombNum >= 10 && BombNum < 50 )

replay();

else

{

JOptionPane msg = new JOptionPane();

ssageDialog(null,"您设置的地雷数太多了"错误",2);

)

)

});

(setBomb);

(text);

(start);

(nowBomb);

(MenuPamel,"North");

out(new GridLayout( (int)(BlockNum)

(int)(BlockNum)));

请重 设!", ,

bombButton=new Bomb[ (int)(BlockNum) ][];

for(int i = 0 ; i < (int)(BlockNum) ; i++)

(

bombButton[ i ]=new Bomb[ (int)(BlockNum)];

)

for(int i = 0 ; i < (int)(BlockNum) ; i++ )

for(int j = 0 ; j < (int)(BlockNum) ; j++ )

(

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

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

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

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

)

for(int i = 0 ; i < (int)(BlockNum) ; i++ )

for(int j = 0 ; j < (int)(BlockNum) ; j++ )

(bombButton[ i ][ j ]);

(mainPanel,"Center");

startBomb();

setSize(400,400);

setLocation(350,200);

setResizable(false);

)

/*布雷*/

public void startBomb()

for(int i=0;i

(

int x =(int)(()*(int)((BlockNum)-1));

int y =(int)(()*(int)((BlockNum)-1));

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

i--;

else

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

)

)

/*重新开始*/

public void replay()

(

t("当前雷数"+" "+BombNum+"");

for(int i = 0 ; i < (int)(BlockNum) ; i++)

for(int j = 0 ; j < (int)(BlockNum) ; j++)

(

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

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

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

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

bombButton[ i ][ j ].setIcon(null);

)

startBomb();

)

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

public void isWin()

(

int findBomb=0; //找至帕勺地雷数

for(int i=0;i< (int)(BlockNum); i++)

for(int j=0;j< (int)(BlockNum ); j++)

(

if(bombButton[ i ][ j ].isBomb == true && bombButton[ i ][ j ].isRight

==true)

findBomb++;

)

if( findBomb == nt(t().trim()))

(

JOptionPane msg = new JOptionPane();

ssageDialog(this,"您挖完了所有的雷,您胜利了 !",, 您胜利了”,2);

)

)

/*计算方块周围雷数*/

public void CountRoundBomb()

(

for (int i=0; i< (int)(BlockNum); i++)

(

for (int j = 0; j < (int)(BlockNum); j++)

(

int count = 0;

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

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

if ( (i - 1 >= 0) && (j - 1 >= 0)) {

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

count += 1; //检测左上方空格是否是地雷

)

)

if ( (i - 1 >= 0)) {

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

count += 1; //检测上方空格是否为地雷

)

)

if ( (i - 1 >= 0) && (j + 1 <= (int)(BlockNum)-1)) {

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

count += 1; //检测右上方是否为地雷

)

)

if ( (j - 1 >= 0)) {

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

count += 1; //检测左边是否为地雷

)

if ( (i >= 0) && (j + 1 <= (int)(BlockNum)-l)) {

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

count += 1; //右边

)

)

if ( (j - 1 >= 0) && (i + 1 <= (int)(BlockNum)-1)) {

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

count += 1; //左下

)

)

if ( (i + 1 <= (int)(BlockNum)-1)) {

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

count += 1; //下

)

)

if ( (j + 1 <= (int)(BlockNum)-1) &&

(BlockNum)-1)) {

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

count += 1; //右下

)

)

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

)

)

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

public void isNull(Bomb[][] bombButton,Bomb ClickecButton)

(

int i,j;

i=_x;

j=_y;

if (==true) {

)

+ <= (i 1

else {

if ( (i - 1 >= 0) && (j - 1 >= 0)) { //检测左上方空格是否是空

if (bombButton[i - 1][j - 1].isBomb == false && bombButton[i - 1][j -

1].isClicked == false && bombButton[i - 1][j - 1].isRight == false) {

bombButton[i-1][j-1].setText((bombButton[i-1][j-1].BombRoundCount)+"" );

bombButton[i - 1][j - 1].setEnabled(false);

bombButton[i - 1][j - 1].isClicked=true;

)

)

if ( (i - 1 >= 0)) { //检测上方空格是否为空

if (bombButton[i-1][ j].isBomb == false && bombButton[i - 1][ j ].isClicked ==

false && bombButton[i - 1][ j ].isRight == false)

{

bombButton[i-1][

1][ j ].BombRoundCount)+"");

bombButton[i - 1][ j ].setEnabled(false);

bombButton[i - 1][ j ].isClicked=true;

)

if ( (i - 1 >= 0) && (j + 1 <= ((int)(BlockNum)-l)) ) { //检测右上 方是否为空

if (bombButton[i - 1][j + 1] .isBomb == false && bombButton[i - 1][j +

1].isClicked == false && bombButton[i - 1][j + 1].isRight == false)

{

bombButton[i -

1].BombRoundCount)+"");

bombButton[i - 1][j + 1].setEnabled(false);

bombButton[i - 1][j + 1].isClicked=true;

)

)

1][j + 1].setText((bombButton[i - 1][j +

j].setText((bombButton[i-

if ( (j - 1 >= 0)) { //检测左边是否为空

if (bombButton[ i ][j - 1].isBomb == false && bombButton[ i ][j -

1].isClicked == false && bombButton[ i ][j - 1].isRight == false) {

bombButton[ i ][j

1].BombRoundCount)+"");

bombButton[ i ][j - 1].setEnabled(false);

bombButton[ i ][j - 1].isClicked=true;

)

)

if ( (i >= 0) && (j + 1 <= ((int)(BlockNum)-1)) ) {/检测右边空格 是否是空

if (bombButton[ i ][j + 1].isBomb == false && bombButton[ i ][j +

1].isClicked == false && bombButton[ i ][j + 1].isRight == false) {

bombButton[ i ][j

1].BombRoundCount)+"");

bombButton[ i ][j + 1].setEnabled(false);

bombButton[ i ][j + 1].isClicked=true;

)

)

if ( (j - 1 >= 0) && (i + 1 <= ((int)(BlockNum)-1)) ) { //检测左下 空格是否是空

if (bombButton[i + 1][j - 1].isBomb == false && bombButton[i + 1][j -

1].isClicked == false && bombButton[i + 1][j - 1].isRight == false) {

bombButton[i +

1].BombRoundCount)+"");

bombButton[i + 1][j - 1].setEnabled(false);

bombButton[i + 1][j - 1].isClicked=true;

)

)

if ( (i + 1 <= ((int)(BlockNum)-1)) ) { //检测下边空格是否是空

1][j - 1].setText((bombButton[i + 1][j -

+ 1].setText((bombButton[ i ][j +

- 1].setText((bombButton[ i ][j -

if (bombButton[i + 1][ j ].isBomb == false && bombButton[i +

1][ j ].isClicked == false && bombButton[i + 1][ j ].isRight == false) {

bombButton[i + 1][ j ].setText((bombButton[i +

1][ j ].BombRoundCount)+"");

bombButton[i + 1][ j ].setEnabled(false);

bombButton[i + 1][ j ].isClicked=true;

)

)

if ( (j + 1 <= ((int)(BlockNum)-1) ) && (i + 1

((int)(BlockNum)-1)) ) {//检测右下边空格是否是空

if (bombButton[i + 1][j + 1].isBomb == false && bombButton[i + 1][j +

1].isClicked == false && bombButton[i + 1][j + 1].isRight == false)

{

bombButton[i+1][j+1].setText((bombButton[i+1][j+1].BombRoundCo

unt)+"");

bombButton[i + 1][j + 1].setEnabled(false);

bombButton[i + 1][j + 1].isClicked=true;

)

)

if ( (i - 1 >= 0) && (j - 1 >= 0))//检测左上

isNull(bombButton,bombButton[i - 1][j - 1]);

if ( (i - 1 >= 0))

isNull( bombButton,bombButton[i - 1][ j ]);//检测上方

if ( (i - 1 >= 0) && (j + 1 <= (int)(BlockNum)-1))

isNull( bombButton,bombButton[i - 1][j + 1]);//检测右上

if ( (j - 1 >= 0))

isNull(bombButton,bombButton[i][j - 1]);//检测左边

if ( (i >= 0) && (j + 1 <= ((int)(BlockNum)-1)))

isNull(bombButton,bombButton[i][j + 1]);//检测右边

<=

if ( (j - 1 >= 0) && (i + 1 <= ((int)(BlockNum)-1)))

isNull(bombButton,bombButton[i + 1][j - 1]); //检测左下

if ( (i + 1 <= ((int)(BlockNum)-1)) ) //检测下

isNull(bombButton,bombButton[i + 1][ j ]);

if ( (j + 1 <= ((int)(BlockNum)-1)) && (i + 1 <=

((int)(BlockNum)-1)) )//检测右下

isNull(bombButton,bombButton[i + 1][j + 1]);

)

)

public void actionPerformed(ActionEvent e)

(

CountRoundBomb();

if(((Bomb)rce()).isBomb==false&&((Bomb)rce()).isClicked

==false)

( ((Bomb)rce()).setText(( ((Bomb)rce()).BombRoundCount)

+"”);

((Bomb)rce()).isClicked=true;

((Bomb)rce()).setIcon(null);

((Bomb)rce()).setEnabled(false);

if((((Bomb)rce()).BombRoundCount) == 0)

isNull(bombButton,(Bomb)rce());

isWin();

)

else if(((Bomb)rce()).isBomb == true)

(

for(int i=0;i<(int)(BlockNum);i++)

for(int j=0;j<(int)(BlockNum);j++)

(

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

bombButton[ i ][ j ].setIcon(icon_bomb);

)

((Bomb)rce()).setIcon(icon_bomb_big);

JOptionPane msg = new JOptionPane();

ssageDialog(this,"你踩至。地雷了,按确定重来","你踩 到地雷了”,2);

replay();

)

)

public void mouseClicked(MouseEvent e)

Bomb bombSource = (Bomb)rce();

boolean right = tMouseButton(e);

if((right == true) && (ked == false))

(

ag = (ag + 1)%3;

if(ag == 1)

(

if(BombNum > 0 && t == false ){

n(icon_flag);

t = true;

BombNum--;

)

isWin();

t("当前雷数"+" "+BombNum+"");

)

else if(ag == 2)

{

if( (BombNum!=0 ) ||(BombNum==0

&&(n()==icon_flag)))

BombNum++;

n(icon_question);

t("当前雷数"+" "+BombNum+"");

)

else if(ag == 0)

{

n(null);

t = false;

)

)

)

public void mouseEntered(MouseEvent e)

{}

public void mouseReleased(MouseEvent e)

{}

public void mouseExited(MouseEvent e)

{}

public void mousePressed(MouseEvent e)

{}

}

3.按钮Bomb

(1)成员变量(见表6)

表6

成员变量描述

第几号方块

是否点击右键

变量类型

int

boolean

boolean

名称

num_x,num_y

isRight

isClicked

是否被点击

(2)源代码见文件

import .*;

import .*;

import .*;

/*按扭类*/

class Bomb extends JButton

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

public int BombRoundCount; //周围雷数

public boolean isBomb;

public boolean isClicked;

public int BombFlag;

//是否为雷

//是否被点击

//探雷标记

public boolean isRight; //是否点击右键

public Bomb(int x,int y)

{ BombFlag = 0;

num_x = x;

num_y = y;

BombRoundCount = 0;

isBomb = false;

isClicked = false;

isRight = false;

三.运行效果

点击开始运行游戏,即可点选方格、根据方格数字推断雷的位置。如下图1-3。

图1

3

四.工作总结

通过此次课程设计,将我所学的JAVA知识得到巩固和应用,在设 计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思 考下还是很好的完成了。

这此课程设计不仅让我懂得了写程序不能闭门造车,要努力拓宽知

识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资 料。不过与其临渊羡鱼,不如退而结网。这次JAVA课程设计给我的最 大的收获就是如果让自己有了兴趣,那么任何困难在你的勇气和毅力下 都算不得什么。完成了课程设计只是一小步,未来的日子还要继续努力。

最后衷心感谢在课程设计过程中给予过我帮助的老师和同学们!没 有他们的帮助课程设计就不能圆满完成。


本文标签: 游戏 设置 是否 方块 地雷