Java实训报告-扫雷.doc_第1页
Java实训报告-扫雷.doc_第2页
Java实训报告-扫雷.doc_第3页
Java实训报告-扫雷.doc_第4页
Java实训报告-扫雷.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

实训报告书实训名称: JAVA程序设计实训 系 (部): 信息工程系 专业班级: 计算机科学与技术08-1 学生姓名: 学 号: 指导教师: 完成日期: 山东科技大学泰山科技学院实训课题扫雷小游戏实训人姓名同组人员实训日期2011年1月10日至2011年1月13日实训成绩指导教师评语指导教师签名:_年 _ 月_日装订线目 录目 录I1 实训目的12 游戏“扫雷”系统的分析与设计12.1 系统功能描述12.2 系统模块设计13 主要代码清单23.1雷区布置23.2标记每一个板块周围雷的数量23.3游戏级别选择43.4雷数板+计时板43.5标左键单击事件53.6鼠标单击后64 程序运行与测试74.1游戏等级74.2游戏测试(以初级为例)85 实训总结8课程实训报告书“扫雷系统的设计与实现1 实训目的Java程序设计实训是计算机专业一门重要的专业技术基础实践课程。为了能够较好的完成实训任务,学生应具备软件开发技术的基础知识,实训的主要目的在于将理论与实际应用相结合,使用程序设计语言java,以及相关软件设计开发知识完成软件的设计开发任务。本实训课程将为整个专业的学习以及软件设计水平的提高打下良好的基础,提高学生项目分析、设计、编写、调试和测试的能力,并培养基本的、良好的团队合作能力。2 游戏“扫雷”系统的分析与设计2.1 系统功能描述该游戏是一个参考windows经典扫雷游戏的简化游戏,保留了其主要的游戏功能。通过此系统可以实现如下功能: (1) 扫雷游戏分为初级、中级和高级三个级别。单击游戏菜单可以选择“初级”、“中级”和“高级”。(2) 选择级别后将出现相应级别的扫雷区域,这是用户使用鼠标左键单击雷区中任何一个方块便启动计时器。(3) 用户要揭开某个方块,可单击它。若所揭方块下有雷,用户便输了这一局,若所揭方块下无雷,则显示一个数字,该数字代表方块的周围的8个方块中共有多少颗雷。(4) 如果用户认为某个方块下埋着雷,单击右键可以在方块上标识一个用户认为是雷的图标,即给出一个扫雷标记。用户每标记出一个扫雷标记(无论用户的标记是否正确),程序将显示的剩余雷数减少一个。(5)用户可以选择标记疑问的方块,此时双击右键并可出现“?”标记。(6)用户按下第一个方块时开始计时,当时间超过999秒游戏未完成时游戏自动结束,并判为输。2.2 系统模块设计系统的整体布局为:CardLayout布局, 采用了菜单、按钮、面板等组件,菜单主要包括开始,选择级别,标记,退出, 按钮的功能是重新开始新的游戏。 总体功能图 总体流程图 雷区设计流程图3 主要代码清单3.1雷区布置MineArea类是javax.swing包中Jpanel容器的子类,实现了ActionListener和MouseListener接口,所创建的对象:mineArea是MineGame类中最重要的成员之一,作为一个容器添加到MineGame窗口的中心。 雷区布置定义一个二维数组分别表示雷的X轴、Y轴的位置,采用随机数的方法Math.random随机生成雷的位置。/*取随机数,src:起始数 dst:终止数*/public int getRandomNumber(int src, int dst) return src + (int) (dst - src + 1) * Math.random();/*初始化:雷,向二维数组中内插入数字9(雷)*/public void initMine() int sum = 0;int mineX;int mineY;do do /随机生成一个雷的X,YmineX = getRandomNumber(0, wide - 1);mineY = getRandomNumber(0, high - 1); while (numsmineXmineY = 9);/不能重复设置类,否则不能满足用户要求的雷数numsmineXmineY = 9;sum+; while (sum mineCount);3.2标记每一个板块周围雷的数量 因为每一个板块周围最多有8个板块,所以可以9插入数组表示雷,遍历已经安置了9的数组,根据数组中9的数量向其中安置数字18/* 遍历已经安置了9(雷)的数组,根据雷数往内安置18数字*/public void initNumber() for (int l = 0; l wide; l+) /l:列for (int h = 0; h high ; h+) / h:行int num = 0;/存18数字if (numslh != 9) /不是雷if (l != 0 & h != 0 & numsl - 1h - 1 = 9) /左上角num+;if (l != 0 & numsl - 1h = 9) /左num+;if (l != 0 & h != high - 1 & numsl - 1h + 1 = 9) /左下num+;if (h != 0 & numslh - 1 = 9) /上num+;if (h != high - 1 & numslh + 1 = 9) /下num+;if (l != wide - 1 & h != 0 & numsl + 1h - 1 = 9) /右上num+;if (l != wide - 1 & numsl + 1h = 9) /右num+;if (l != wide - 1 & h != high - 1 & numsl + 1h + 1 = 9) /右下num+;numslh = num;/赋值3.3游戏级别选择通过菜单的选择初级、中级、高级、重新开始,w:新一局游戏的雷列数,h:新一局游戏的雷行数,c:新一局游戏的雷数public void replayByMenu(int w,int h,int c)wide=w;/重新为宽赋值high=h;/重新为高赋值mineCount=c;/重新为雷数赋值nums = new intwidehigh;boards = new intwidehigh;wrongMine= new intwidehigh;exploredMarker = new booleanwidehigh;frame.setSize(mineAreaX + wide * 16 + 5 * 2+4, mineAreaY + high * 16 + 5 * 2+ 55);/界面大小rePlay();3.4雷数板+计时板public void PLabel(Graphics2D g2d) g2d.setColor(new Color(128,128,128);/深灰g2d.fillRect(16, 16, 40, 1);/雷数板横g2d.fillRect(16, 17, 1, 23);/雷数板竖g2d.fillRect(wide*16-35, 16, 40, 1);/计分板横g2d.fillRect(wide*16-35, 17, 1, 23);/计分板竖g2d.setColor(Color.white);/白g2d.fillRect(17, 40, 40, 1);/雷数板横g2d.fillRect(56, 17, 1, 23);/雷数板竖g2d.fillRect(wide*16-34, 40, 40, 1);/计分板横g2d.fillRect(wide*16-34+39, 17, 1, 23);/计分板竖g2d.setColor(Color.black);/黑g2d.fillRect(17, 17, 39, 23);/雷数板底色g2d.fillRect(wide*16-34, 17, 39, 23);/计分板底色在时间板、雷数板上显示数字public void DrawLine(Graphics2D g2d,int x,int y,boolean fangxiang,int changdu) boolean colorSwitch=true;/深红int xPianyi=0;int yPianyi=0;for(int i=0;ichangdu;i+)if(colorSwitch=true)g2d.setColor(Color.red);/深红elseg2d.setColor(Color.black);/黑g2d.fillRect(x+xPianyi,y+yPianyi,1,1);if(fangxiang=true)xPianyi+;elseyPianyi+;if(colorSwitch=true)colorSwitch=false;elsecolorSwitch=true;3.5标左键单击事件leftClick()是MineArea类实现的ActionListener接口中的方法。当用户单击blockView中的某个方块时,leftClick()方法负责执行有关算法,例如,当用鼠标左键单击方块上的按钮后,若该方块下有雷,leftClick()方法将使用户输掉本局,若该方块下无雷,leftClick()方法将显示blockView对象中的标签,该标签上是一个数字,该数字代表当前方块的周围的8个方块中共有多少颗雷。public void leftClick() if(isStart=false)/如果游戏没有开始,那么创建新进程timerThread = new Thread(this);timerThread.start();/开启时间进程isStart=true;if (needCheckFirstCilck) /如果需要检测第一次是否点的是雷while(numscurrentXcurrentY = 9)/如果点的是雷,那么清空数据,重新造雷造数 clear(); initMine(); initNumber();needCheckFirstCilck = false;/不需要检测了,因为游戏已经开始了,只要保证第一次不点雷就行if (boardscurrentXcurrentY != 2) /如果点的不是旗switch (numscurrentXcurrentY) case 9:/如果是雷for (int l = 0; l wide; l+) for (int h = 0; h high; h+) if (numslh = 9) boardslh = 0;wrongMinecurrentXcurrentY=1;fail();break;case 0:/如果是空白clickZero(currentX, currentY);if (isWin() /判断是否赢了win();/赢break;default :/如果是18数字boardscurrentXcurrentY = 0;if (isWin() /判断是否赢了win();/赢3.6鼠标单击后mousePressed(MouseEvent)方法是MineArea类实现的MouseListener接口中的方法,当用户按下鼠标有件事mousePressed(MouseEvent)方法负责让方块上显示一个探雷标记。/*事件:鼠标按下*/public void mousePressed(MouseEvent e) mouseX = e.getX();mouseY = e.getY();getCurrent(mouseX,mouseY);if (e.getButton() = MouseEvent.BUTTON1 )/如果是左键mouseLeftIsDown=true;/左键按下标识=trueif(isOutOfContrl=false)/如果用户没有失去控制(失去控制:失败/胜利)if(mouseInMainButtonArea()/如果在笑脸按钮区域if(mouseLeftCanReleased=false)mouseLeftCanReleased=true;else if (e.getButton() = MouseEvent.BUTTON3) / 鼠标右键mouseRightIsDown=true;/右键按下标识=trueif (mouseInMineArea()&isOutOfContrl = false&mouseLeftIsDown=false) if (boardscurrentXcurrentY = 1) /如果是普通板boardscurrentXcurrentY = 2;/那么变旗板mineCountOfRemaining-;/没有探测的雷数减一 else if (boardscurrentXcurrentY = 2) /如果是旗板boardscurrentXcurrentY = 3;/那么变问号板mineCountOfRemaining+;/没有探测的雷数加一 else if (boardscurrentXcurrentY = 3) /如果是问号板boardscurrentXcurrentY = 1;/那么变变普通板frame.repaint();/重新绘制图像4 程序运行与测试4.1游戏等级 初级 (9*9) 中级(16*16) 高级(16*

温馨提示

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

评论

0/150

提交评论