您好,欢迎访问三七文档
扫雷游戏的设计与实现代码如下:(写出核心代码注释)/*-------Block------*/importjavax.swing.ImageIcon;//引入图片包publicclassBlock{Stringname;//名字,比如雷或数字intaroundMineNumber;//周围雷的数目ImageIconmineIcon;//雷的图标booleanisMine=false;//是否是雷booleanisMark=false;//是否被标记booleanisOpen=false;//是否被挖开publicvoidsetName(Stringname){//创建名称“雷”this.name=name;}publicvoidsetAroundMineNumber(intn){//创建周围雷数aroundMineNumber=n;}publicintgetAroundMineNumber(){//获取周围雷数returnaroundMineNumber;}publicStringgetName(){//获取名称returnname;}publicbooleanisMine(){returnisMine;//返回结果,默认制false}publicvoidsetIsMine(booleanb){//是否要建雷isMine=b;//参数赋给类的共有变量}publicvoidsetMineIcon(ImageIconicon){//创建图标mineIcon=icon;//参数赋给类的共有变量}publicImageIcongetMineicon(){//获得这个图片变量returnmineIcon;}publicbooleangetIsOpen(){//判断是否已排过returnisOpen;//返回判断结果}publicvoidsetIsOpen(booleanp){//排雷isOpen=p;//用参数实现是否已排}publicbooleangetIsMark(){//判断是否已做标记returnisMark;//返回判断结果}publicvoidsetIsMark(booleanm){//做标记isMark=m;}}/*-------------------BlockView----------------*/importjavax.swing.*;importjava.awt.*;publicclassBlockViewextendsJPanel{JLabelblockNameOrIcon;//用来显示Block对象的name、number和mineIcon属性JButtonblockCover;//用来遮挡blockNameOrIcon.CardLayoutcard;//卡片式布局,声明对象BlockView(){//构造函数实现初始化card=newCardLayout();//对象实例化setLayout(card);//布局为卡片式布局blockNameOrIcon=newJLabel(,JLabel.CENTER);//属性为无名标签居中blockNameOrIcon.setHorizontalTextPosition(AbstractButton.CENTER);//设置标签的文本相对其图像的水平位置。blockNameOrIcon.setVerticalTextPosition(AbstractButton.CENTER);//设置垂直文本位置blockCover=newJButton();//遮挡blockNameOrIcon.的实例化add(cover,blockCover);//添加覆盖层,覆盖雷周围的数字及雷的位置add(view,blockNameOrIcon);//添加显视雷位置及周围数字}publicvoidgiveView(Blockblock){//声明了一个Block类的对象作为参数if(block.isMine){//如果是雷blockNameOrIcon.setText(block.getName());//标签显示,这里显示“雷”blockNameOrIcon.setIcon(block.getMineicon());//显示雷的图标}else{intn=block.getAroundMineNumber();//获取周围的雷数if(n=1)blockNameOrIcon.setText(+n);//显示周围雷数elseblockNameOrIcon.setText();//显示空白}}publicvoidseeBlockNameOrIcon(){card.show(this,view);//card区域validate();}publicvoidseeBlockCover(){card.show(this,cover);//覆盖区域validate();//确保组件具有有效的布局。不写这句代码,也没有问题的。}publicJButtongetBlockCover(){returnblockCover;//返回覆盖区域}}/*-------------------LayMines---------------------*/importjava.util.*;importjavax.swing.*;publicclassLayMines{ImageIconmineIcon;//对雷图表声明LayMines(){mineIcon=newImageIcon(mine.gif);//造函数实现图表初始化}publicvoidlayMinesForBlock(Blockblock[][],intmineCount){introw=block.length;//获得行数intcolumn=block[0].length;//获得列数LinkedListBlocklist=newLinkedListBlock();//创建类型为block的链表对象for(inti=0;irow;i++){for(intj=0;jcolumn;j++)list.add(block[i][j]);//向链表增加行列}while(mineCount0){//如果雷数大于0intsize=list.size();//list返回节点的个数intrandomIndex=(int)(Math.random()*size);//获取一个随机数乘链表长度Blockb=list.get(randomIndex);//获得生成随机数所在的节点的数据b.setIsMine(true);//如果此点是雷b.setName(雷);//创建名称“雷”b.setMineIcon(mineIcon);//同事创建雷图表list.remove(randomIndex);//list删除索引值为randomIndex的节点,即删除随机节点mineCount--;//雷数减一}for(inti=0;irow;i++){for(intj=0;jcolumn;j++){if(block[i][j].isMine()){//对、i,j块进行判断,是雷则block[i][j].setIsOpen(false);//未排block[i][j].setIsMark(false);//未标记}else{//不是雷则intmineNumber=0;for(intk=Math.max(i-1,0);k=Math.min(i+1,row-1);k++){for(intt=Math.max(j-1,0);t=Math.min(j+1,column-1);t++){if(block[k][t].isMine())//是雷mineNumber++;//此块周围的雷数属性加一}}block[i][j].setIsOpen(false);block[i][j].setIsMark(false);block[i][j].setName(+mineNumber);block[i][j].setAroundMineNumber(mineNumber);}}}}}/*----------------------MineArea--------------*/importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;publicclassMineAreaextendsJPanelimplementsActionListener,MouseListener{JButtonreStart;//创建重新开始按钮Block[][]block;//对每个card块的属性创建一个二维表BlockView[][]blockView;//创建二维表LayMineslay;//声明对象introw,colum,mineCount,markMount;//雷区的行数、列数以及地雷个数和用户给出的标记数ImageIconmark;//声明标记对象intgrade;//得分JPanelpCenter,pNorth;//创建两个区域JTextFieldshowTime,showMarkedMineCount;//显示用时以及标记数Timertime;//计时器时间intspendTime=0;//记录花费Recordrecord;//声明得分记录对象publicMineArea(introw,intcolum,intmineCount,intgrade){reStart=newJButton(重新开始);//按钮名为重新开mark=newImageIcon(mark.gif);//探雷标记time=newTimer(1000,this);//计时器时间为1000showTime=newJTextField(5);//用时实例化showMarkedMineCount=newJTextField(5);//得分实例化showTime.setHorizontalAlignment(JTextField.CENTER);//用时布局方式showMarkedMineCount.setHorizontalAlignment(JTextField.CENTER);//得分布局方式showMarkedMineCount.setFont(newFont(Arial,Font.BOLD,16));//设置字体样式,及颜色showTime.setFont(newFont(Arial,Font.BOLD,16));//设置字体样式,及颜色pCenter=newJPanel();//布局的中间区域pNorth=newJPanel();//布局的北边区域lay=newLayMines();initMineArea(row,colum,mineCount,grade);//初始化雷区,见下面的LayMines()reStart.addActionListener(this);//对重新开始添加监听事件pNorth.add(showMarkedMineCount);//在北区添加得分记录pNorth.add(reStart);//在北区添加重新开始按钮pNorth.add(showTime);//在北区添加花费时间setLayout(newBorderLayout());//布局add(pNorth,BorderLayout.NORTH);//布局方式add(pCenter,BorderLayout.CENTER);//布局方式}publicvoidinitMineArea(introw,intcolum,intmineCount,intgrade){pCenter.removeAll();//作用是把JFrame上的所有控件都移除掉spendTime=0;markMount=mineCount;//参数传值,雷的个数this.row=row;//行数赋值this.colum=colum;//列数赋值this.mineCount=mineCou
本文标题:java扫雷源码
链接地址:https://www.777doc.com/doc-4805554 .html