java集中上机实验报告.doc_第1页
java集中上机实验报告.doc_第2页
java集中上机实验报告.doc_第3页
java集中上机实验报告.doc_第4页
java集中上机实验报告.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

扫雷游戏一、实验实习目的及要求加强对C语言的深入理解,提高学生分析问题,解决综合问题的能力。二、实验实习设备(环境)及要求(软硬件条件)设备:操作系统:编译软件:三、实验实习内容简介:1、需求分析l 系统功能分析:(1) 游戏界面设计:游戏界面用BorderLayout和Gridlayout两个布局进行设计,界面中间使用Gridlayout设计成12行12列的雷区,界面菜单和雷区结合用BorderLayout设计,界面菜单有雷数的显示和雷数自定义输入的文本框,另外还有个开始按钮,用以确定雷数开始游戏。(2) 雷区设计: java.swing包中Jpanel容器创建对象:bombPanel,作为一个容器添加到继承了JFrame的Frame窗口的中心。其中bomb类继承了JButton按钮,进行方块的布置和地雷的布置。方块包括地雷用类Bomb继承JButton,定义雷区变量,包括方块或地雷的坐标,方块或地雷的状态等。1、重要的成员变量(1) BombRoundCount是bomb类属性,用来显示记录方块周围雷数的多少,然后显示在方块中央。(2) BombNum, BlockNum,rightBomb, restBomb, restBlock是int类型,分别负责记录游戏当前地雷数量、方块数、找到的地雷数、剩余的雷数、剩余的方块数。(3) bombButton是bomb类型的数组,负责设置数组中的哪些方块是雷或不是雷。2、方法(1) startBomb()方法可根据参数提供的数据设置雷区的雷数,其中方块数固定。(2) start_actionPerformed(ActionEvent e)是实现的ActionListener接口中的方法。当用户单击开始时,start_actionPerformed(ActionEvent e)方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若用户定义雷数少于5,将弹出错误提示,若不小于5则执行游戏。(3)CountRoundBomb()方法是一个计算周围雷数算法,当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数,记录到BombRoundCount中以数字形式显示在单元格。(4)mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。(5) isWin()方法用来判断用户是否扫雷成功,如果成功该方法负责让一个文本框弹出提示游戏胜利。所谓扫雷成功是指找到了全部的雷。(6) isNull(Bomb ClickedButton)方法是用来判断周围雷数是否为0的算法,是就用在turn(Bomb ClickedButton)方法中调用以翻开周围所有雷数为0的单元格。(7) turn(Bomb ClickedButton)方法是进行翻开单元格的动作,还有actionPerformed(ActionEvent e),mouseClicked(MouseEvent e) Frame1_start_action,AdapterBomb_action,AdapterBomb_mouseAdapter都是对事件的捕获及处理,其中有左键点击进行翻开动作或者还会弹出一个文本框提示,右键点击进行地雷的标记,还有界面开始的监听。2、系统设计l 系统应实现的主要功能:(1) 用户可以自定义雷数;(2) 用户可以按鼠标右键标记雷数并取消;(3) 用户通过左击小方块,进行扫雷。总体功能图:扫雷游戏主界面游戏菜单雷数选择开始扫雷地雷标记l 主要功能的概要设计:总体流程图:1、 扫雷游戏界面的设计:整体布局使用BorderLayout和Gridlayout,其中BorderLayout是总体的雷区和下方的菜单栏布局使用,Gridlayout是雷区进行网格布局使用,界面采用了按钮,面板,文本框,标签等组件,按钮主要是退出和开始选项,还有和用户进行交互的文本框。界面的大小设为高和宽都为600,初始显示雷数为10,雷区区域小方格布局为12行12列。布局GridlayoutBorderLayout雷区雷区菜单2、 雷区的设计:将地雷随机安放在小方格中,通过用户的鼠标点击,翻开小方格,处理它周围的信息并做出相应显示,点击过程中记录地雷剩余数量,不管扫雷游戏的输赢,又重新初始化游戏。布雷: 扫雷:否是否是3、进行雷区标记的设计:用户单击右键进行地雷的标记,这是对地雷位置的猜测,地雷数减1,而且被标记的位置不可以在点击,如需点击方块需要单击或双击右键才可以取消标记“F”显示空白或者“Q”,当显示“Q”的时候点击方块,“Q”字母会留在被翻开的方块上面。l 各个具体功能实现和简单算法:1、 扫雷游戏界面的实现:首先定义三个容器,整体界面c和菜单栏MenuPanel、雷区bombPanel。FrameJPanel MenuPanel=new JPanel();JPanel bombPanel=new JPanel();JPanel c;然后是三个容器的布置:JbInit()c.setLayout(borderLayout1);c.add(MenuPamel,BorderLayout.SOUTH);c.add(bombPanel, java.awt.BorderLayout.CENTER);最后是菜单栏,对“开始”按钮添加监听事件并检查是否自定义雷数符合规定,显示当前或剩余雷数,并设文本框自定义雷数:JbInit BombNum = 10; text = new JTextField(10, 3);/ nowBomb = new JLabel(当前雷数 + : + BombNum); setBomb = new JLabel(设置地雷数); start.addActionListener(new Frame1_start_actionAdapter(this);2、 雷区和扫雷的实现:随机数的生成函数random在已经初始设空(NULL)的区域内布10个雷。如果重复,重新布一次。当雷布好后,就进入了其他非雷区域设定阶段。由于雷是随机布放的,没有的地方被点击后就会显示一个数字,表示它周围有几个雷。因此,可以把整个雷区类似看成如下所示的一个二维数组:假若要知道a 3,4周围有几个雷,就必须检测下面8个雷区是否放上了雷。a2,3 a2,4 a2,5 a3,3 a3,5a4,3 a4,4 a4,5利用startBomb()方法实现:startBomb() 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 (bombButtonxy.isBomb != true) bombButtonxy.isBomb = true;i+;仔细观察它们存在的数学关系,发现ai,j周围的雷个数是由这样8个雷区决定的(如果超出了边界,应再加以判断): ai-1,j-1 ai-1,j ai-1,j+1ai,j-1 ai,j+1ai+1,j-1 ai+1,j ai+1,j+1利用CountRoundBomb()方法实现:CountRoundBomb() for (int x = i - 1; x i + 2; x+) for (int y = j - 1; y = 0) & (y = 0) & (x ( (int) Math.sqrt(BlockNum) & (y 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;if (bombSource.isBomb = true) if (bombSource.BombFlag = 1) rightBomb+; else if (bombSource.BombFlag = 2) rightBomb-;4、 游戏结束方式:用户点击窗口关闭按钮强行退出;用户点击雷块,游戏失败退出;用户找出所有的10个雷块,游戏胜利退出isWin(). public Frame() try setDefaultCloseOperation(EXIT_ON_CLOSE); jbInit();catch (Exception exception) exception.printStackTrace();isWin() if (rightBomb = BombNum | restBlock = 0) JOptionPane.showMessageDialog(this, 您挖完了所有的雷,您胜利了!, 胜利,JOptionPane.INFORMATION_MESSAGE); 。for (int i = 0; i (int) Math.sqrt(BlockNum); i+) for (int j = 0; j (int) Math.sqrt(BlockNum); j+) if (bombButtonij.isBomb = true) bombButtonij.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);四、源程序(代码)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);/Java的一个类,封装了一个构件的高度和宽度,这个类与一个构件的许多属性具有相关 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,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 = 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+) bombButtonij.isBomb=false;bombButtonij.isClicked = false; bombButtonij.isRight = false; bombButtonij.BombFlag = 0;bombButtonij.BombRoundCount = 9; bombButtonij.setEnabled(true); bombButtonij.setText(); bombButtonij.setFont(new Font(, Font.PLAIN, 14);/设置字体大小 bombButtonij.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 (bombButtonxy.isBomb != true) bombButtonxy.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 (bombButtonij.isBomb != true) for (int x = i - 1; x i + 2; x+) for (int y = j - 1; y = 0) & (y = 0)& (x ( (int) Math.sqrt(BlockNum) & (y ( (int) Math.sqrt(BlockNum) if (bombButtonxy.isBomb = true) count+; bombButtonij.BombRoundCount = count; /* 是否挖完了所有的雷 */ 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 (bombButtonij.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 = 0) & (y = 0) & (x ( (int) Math.sqrt(BlockNum) & (y 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 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.setVisib

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论