扫雷代码中的三个问题,要疯了、、、

问题描述

importjava.awt.*;importjava.awt.event.*;importjava.util.Scanner;importjavax.swing.*;publicclasssaoleiextendsJFrame{privateintrow=10;//不设初始值。按下开始按钮,就卡死了privateintcol=10;//不设初始值。按下开始按钮,就卡死了Bomb[][]buttons;//没个按钮初始看做为雷按钮privateJButtonstart;privateJLabellabel1;//雷数标签privateintBombNum=10;//设置雷的数目privateJPanelpanel1;//标签面板privateJPanelpanel2;//雷面板intfoundBomb,restBomb,restbuttons;//找到的地雷数,剩余雷数,剩余按钮privateintlei[][];privateContainercontainer=getContentPane();//构造方法publicsaolei(){this.setTitle("扫雷小游戏");JMenuBarTestJMenuBar=newJMenuBar();JMenuItemprimary,medium,senior;this.setJMenuBar(TestJMenuBar);JMenubegin=newJMenu("开始");TestJMenuBar.add(begin);primary=newJMenuItem("初级");primary.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){initButtons(10,10,10);}});begin.add(primary);begin.addSeparator();medium=newJMenuItem("中级");medium.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){initButtons(15,15,20);//超过10程序运行就有问题、、、、}});begin.add(medium);begin.addSeparator();senior=newJMenuItem("高级");senior.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){initButtons(20,20,40);}});begin.add(senior);JMenuchoose=newJMenu("选项");TestJMenuBar.add(choose);choose.addSeparator();JMenuchange=newJMenu("改变颜色");choose.add(change);change.add(newJMenuItem("红色"));change.add(newJMenuItem("黄色"));change.add(newJMenuItem("紫色"));change.add(newJMenuItem("蓝色"));choose.addSeparator();JMenuhelp=newJMenu("帮助");TestJMenuBar.add(help);help.addSeparator();JMenuexit=newJMenu("退出");TestJMenuBar.add(exit);this.setDefaultCloseOperation(EXIT_ON_CLOSE);primary.doClick();}publicvoidinitButtons(introw,intcol,intBombNum){if(panel2!=null){this.remove(panel2);}label1=newJLabel("设置当前雷数");start=newJButton("开始");panel1=newJPanel();panel1.add(label1);panel1.add(start);container.add(panel1,BorderLayout.NORTH);panel2=newJPanel();panel2.setLayout(newGridLayout(row,col,2,2));container.add(panel2,BorderLayout.CENTER);start.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){startBomb();}});buttons=newBomb[row][col];for(inti=0;i<row;i++){for(intj=0;j<col;j++){buttons[i][j]=newBomb(i,j);buttons[i][j].addMouseListener(newBomb_mouseAdapter(this));buttons[i][j].addActionListener(newBomb_actionAdapter(this));panel2.add(buttons[i][j]);}}this.setSize(1000,1000);setBounds(400,100,450,500);setResizable(false);setVisible(true);startBomb();//窗口完成后开始布雷}/*开始,布雷*/publicvoidstartBomb(){label1.setText("设置当前雷数"+":"+BombNum);for(inti=0;i<row;i++){for(intj=0;j<col;j++){buttons[i][j].isBomb=false;buttons[i][j].isClicked=false;buttons[i][j].isRight=false;buttons[i][j].BombFlag=0;buttons[i][j].BombRoundCount=8;buttons[i][j].setEnabled(true);//设置的控件(这里是按钮buttons[i][j])是否被禁用,true是可用。buttons[i][j].setText("");foundBomb=0;restBomb=BombNum;restbuttons=row*col-BombNum;}}for(inti=0;i<BombNum;){intx=(int)(Math.random()*row);inty=(int)(Math.random()*col);if(buttons[x][y].isBomb!=true){buttons[x][y].isBomb=true;i++;}}CountRoundBomb();//周围雷的个数}publicvoidCountRoundBomb(){//周围雷的个数for(inti=0;i<row;i++){for(intj=0;j<col;j++){intcount=0;//当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数if(buttons[i][j].isBomb!=true){for(intx=i-1;x<i+2;x++){for(inty=j-1;y<j+2;y++){if((x>=0)&&(y>=0)&&(x<row)&&(y<col)){if(buttons[x][y].isBomb==true){count++;}}}}buttons[i][j].BombRoundCount=count;}}}}/*是否挖完了所有的雷就胜利啦*/publicvoidisWin(){restbuttons=row*col-BombNum;for(inti=0;i<row;i++){for(intj=0;j<col;j++){if(buttons[i][j].isClicked==true){restbuttons--;}}}if(foundBomb==BombNum||restbuttons==0){JOptionPane.showMessageDialog(this,"您挖完了所有的雷,您胜利了!","胜利",JOptionPane.INFORMATION_MESSAGE);startBomb();}}/*当选中的位置为空,则翻开周围的地图*/publicvoidisNull_turnRound(BombClickedButton){inti,j;i=ClickedButton.nx;//按钮的横坐标j=ClickedButton.ny;//按钮的纵坐标for(intx=i-1;x<i+2;x++){for(inty=j-1;y<j+2;y++){if(((x!=i)||(y!=j))&&(x>=0)&&(y>=0)&&(x<row)&&(y<col)){if(buttons[x][y].isBomb==false&&buttons[x][y].isClicked==false&&buttons[x][y].isRight==false){turn(buttons[x][y]);}}}}}/*翻开*/publicvoidturn(BombClickedButton){ClickedButton.setEnabled(false);ClickedButton.isClicked=true;if(ClickedButton.BombRoundCount>0){ClickedButton.setText(ClickedButton.BombRoundCount+"");}else{isNull_turnRound(ClickedButton);}}/*左键点击*/publicvoidactionPerformed(ActionEvente){if(((Bomb)e.getSource()).isClicked==false&&((Bomb)e.getSource()).isRight==false){if(((Bomb)e.getSource()).isBomb==false){turn(((Bomb)e.getSource()));isWin();}else{for(inti=0;i<row;i++){for(intj=0;j<col;j++){if(buttons[i][j].isBomb==true){buttons[i][j].setText("B");}}}((Bomb)e.getSource()).setForeground(Color.RED);//事件源的背景色((Bomb)e.getSource()).setText("X");JOptionPane.showMessageDialog(this,"你踩到地雷了,按确定重来","踩到地雷",2);startBomb();}}}/*右键点击*/publicvoidmouseClicked(MouseEvente){BombbombSource=(Bomb)e.getSource();booleanright=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;}}elseif(bombSource.BombFlag==2){restBomb++;bombSource.setText("");bombSource.isRight=false;}if(bombSource.isBomb==true){if(bombSource.BombFlag==1){foundBomb++;}elseif(bombSource.BombFlag==2){foundBomb--;}}label1.setText("当前雷数"+":"+restBomb);isWin();}}publicstaticvoidmain(String[]args){saoleim=newsaolei();m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}////////////////////////////////////////////////////////////////////////////////classBombextendsJButton{intnx,ny;//雷所在的坐标intBombRoundCount;//周围雷数booleanisBomb;//是否为雷booleanisClicked;//是否点击左键intBombFlag;//探雷标记booleanisRight;//是否点击右键publicBomb(intx,inty){nx=x;ny=y;BombFlag=0;BombRoundCount=8;isBomb=false;isClicked=false;isRight=false;}}classBomb_actionAdapterimplementsActionListener{privatesaoleiadaptee;Bomb_actionAdapter(saoleiadaptee){this.adaptee=adaptee;}publicvoidactionPerformed(ActionEvente){adaptee.actionPerformed(e);}}classBomb_mouseAdapterextendsMouseAdapter{privatesaoleiadaptee;Bomb_mouseAdapter(saoleiadaptee){this.adaptee=adaptee;}publicvoidmouseClicked(MouseEvente){adaptee.mouseClicked(e);}}

解决方案

时间: 2024-11-08 22:32:47

扫雷代码中的三个问题,要疯了、、、的相关文章

java代码中init method和destroy method的三种使用方式

在Java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. 周末对这两个方法进行了一点学习和整理,倒也不是专门为了这两个方法,而是在巩固spring相关知识的时候提到了,然后感觉自己并不是很熟悉这个,便好好的了解一下. 根据特意的去了解后,发现实际上可以有三种方式来实现init method和destroy method. 要用这两个方法,自然先要知道这两

在C#代码中应用Log4Net(三)Log4Net中配置文件的解释

一个完整的配置文件的例子如下所示,这个是"在C#代码中应用Log4Net(二)"中使用的配置文件. <log4net> <!-- 错误日志类--> <logger name="logerror"> <level value="ALL" /> <appender-ref ref="ErrorAppender" /> </logger> <!-- 信息日

求教:下面的代码中为何手动抛出异常

问题描述 求教:下面的代码中为何手动抛出异常 栈的pop方法,我们这样写:int pop(){ return array[top--];}然后我看jdk源代码,写法相当于:int pop(){ if(top<0)throw new ArrayIndexOutOfBoundsException(); return array[top--];}然而即使没有增加的那句话,当top等于-1时,Java运行环境仍然会自动帮我们抛出ArrayIndexOutOfBoundsException,那么还要自己手

c++-C#与C++位图保存方式的区别是什么?如何将C#中位图buffer正确传到C++代码中?求大神指导

问题描述 C#与C++位图保存方式的区别是什么?如何将C#中位图buffer正确传到C++代码中?求大神指导 C#中位图保存方式与C++中位图保存方式的区别是什么?如何将C#中位图buffer正确传到C++代码中?求大神指导 解决方案 C++中位图分为32/24/16位的三种位图数据存储方式,很多时候C++中主要使用32位和24位,如果你没有特别声明的话.C#中的位图 也多数是32位的.这些所谓的32位或者24位说的是位图中一个像素用多少位来表示,一个像素一般包含RGB三基色,也就是红(red)

Windows 8开发入门(七) Windows 8 中的三种进度条和两种定时器

在Windows 8中的默认进度条也与时俱进,和之前Silverlight中的不一样.本文将讲述三种不同的进度条 ,另外在本文中也会将两种定时器. 进度条 主要属性: Value:当前进度值. Maximum:最大进度值. IsIndeterminate:指定进度条是否确定. 确定进度条:进度明 确的进度条,已完成进度以另外一种颜色显示 关键代码: <ProgressBar Maximum="100" Value="0" Height="20&quo

在HTML代码中嵌入Flash文件的解决方案!(下)

关于我的SWFObject V1.5的使用过程,以上篇中的介绍暂时告一段落了,下面我将会带领SWFObject V2.1出场与大家见面,如果我早一点结识V2.1的话,或许就不会受到"等待HTML DOM加载"问题的侵扰了. 首先,给大家简要介绍一下V2.1语法的调用示例: <script type="text/javascript" src="swfobject.js"></script><script type=&

在后台代码中引入XAML的方法

本文将介绍三种方法用于在后台代码中动态加载XAML,其中有两种方法是加载已存在的XAML文件,一种方法是将包含XAML代码的字符串转换为WPF的对象. 这些是我在编写RegeX时获得的经验,它们将会给WPF程序带来更多的灵活性. 一.在资源字典中载入项目内嵌资源中的XAML文件 Application.Current.Resources.MergedDictionaries.Insert(0, Application.LoadComponent(new Uri("abc/Index.xaml&q

Tiger中的注释,第1部分: 向Java代码中添加元数据

编程的一个最新的趋势,尤其是在 Java 编程方面,是使用 元数据.简单地说,元数据就是 关于数据的数据.元数据可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.许多元数据工具,如 XDoclet(请参阅 参考资料),将这些功能添加到核心 Java 语言中,暂时成为 Java 编程功能的一部分. 直到可以使用 J2SE 5.0(也叫做 Tiger,现在是第二个 beta 版本),核心 Java 语言才最接近具有 Javadoc 方法的元数据工具.您使用特殊的标签集合来标记代码,并执行

Python中实现三目运算的方法

  这篇文章主要介绍了Python中实现三目运算的方法,本文用and/or 运算符模拟实现三目运算,需要的朋友可以参考下 C语言中三目运算符 代码如下: expression ?expr1:expr2; //expression 为真则取表达式expr1的值,否则取expr2的值 python三目实现方法: (1) expr=判断表达式 and expr1 or expr2 判断表达式为真,此时如果expr1为真则expr=expr1,为假则变成False or expr2,expr=expr2