java扫雷的源程序,出现几个问题。。。

问题描述

首先我在菜单里设置了开始,里面有初中高级,但是每次点击就重画一个窗口,下面我注释了有问题的那两行,感觉程序逻辑有问题,希望大神们呢帮忙解决,简单说就是点击初中高级,程序就有问题了。importjava.awt.*;importjava.awt.event.*;importjava.util.Scanner;importjavax.swing.*;publicclasssaoleiextendsJFrame{privateintrow=9;//不设初始值。按下开始按钮,就卡死了privateintcol=9;//不设初始值。按下开始按钮,就卡死了Bomb[][]buttons;//没个按钮初始看做为雷按钮privateJButtonstart;privateJLabellabel1,label2;//雷数标签,时间标签privateintBombNum=8;//设置雷的数目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){row=10;col=10;BombNum=10;initButtons();}});begin.add(primary);begin.addSeparator();medium=newJMenuItem("中级");medium.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){row=15;col=15;BombNum=15;initButtons();}});begin.add(medium);begin.addSeparator();senior=newJMenuItem("高级");senior.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){row=20;col=20;BombNum=20;initButtons();}});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();//这两行,我要是使用第一行,那第一次就调用10,10,10的初始化,点击初级程序没有问题,但是点击中高级就有问题了//initButtons();//我要使用这一行,不用上一行,那9,9,9,没有问题,但是点击初中高级就都不好使了this.setSize(1000,1000);setBounds(400,100,450,500);setResizable(false);setVisible(true);}publicvoidinitButtons(){label1=newJLabel("设置当前雷数");start=newJButton("开始");//label2=newJLabel("已用时间:");panel1=newJPanel();panel1.add(label1);panel1.add(start);//panel1.add(label2);container.add(panel1,BorderLayout.NORTH);panel2=newJPanel();panel2.setLayout(newGridLayout(row,col,2,2));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.remove(panel2);container.add(panel2,BorderLayout.CENTER);this.validate();startBomb();//窗口完成后开始布雷}/*开始,布雷*/publicvoidstartBomb(){label1.setText("设置当前雷数:"+BombNum);//label2.setText("已用时间:"+newtimertask(5));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();initButtons();}}}/*右键点击*/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);}}

解决方案

时间: 2016-03-01

java扫雷的源程序,出现几个问题。。。的相关文章

Java扫雷程序,初试Java

程序 自定义JButton子类: //ExtendButton.java package ly.java; import java.awt.*;import java.awt.event.*;import javax.swing.*; public class ExtendButton extends JButton{ private int Button_Pos; private boolean Button_Status; private boolean Button_Visited; pu

一个Java记事本的源程序

/****************************************************************/ /* @(#)busyworkBook.java 1.0.0 2004-06-04 */ /* */ /* Email: pqdb123@yahoo.com.cn */ /* */ /* Copyright (c) 2004-2006 by ZhangYunFeng All Rights Reserved. */ /************************

关于Java中文问题的几条分析原则

问题|中文   引言 尽管对于Java中文处理问题的讨论已不乏其数,但由于Java技术涉及内容广(J2EE包含了十几种相关技术),技术供应商繁多,面向Java的Web服务器.应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文过程中出了存在固有的问题外也存在随着选用的服务器,驱动程序的不同而带来的Java中文问题的多变性,增加了问题的复杂度.那么,我们如何在这么纷繁的现象中找到问题的症结呢? Java中文问题的一般解决办法 事实上,Java的中文问题都是由于Java应用

Java中文问题及最优解决方法

解决|问题|中文 1.中文问题的来源 计算机最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是以单字节编码的英文为准进行处理.随着计算机的发展,为了适应世界其它民族的语言(当然包括我们的汉字),人们提出了UNICODE编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符编码,所以,目前,大多数国际性的软件内部均采用UNICODE编码,在软件运行时,它获得本地支持系统(多数时间是操作系统)默认支持的编码格式,然后再将软件内部的UNICODE转化为本地系统默认支持

java中文解决大全(下)

解决|中文 4.中文问题的分类及其建议最优解决办法     了解以上JAVA处理文件的原理之后,我们就可以提出了一套建议最优的解决汉字问题的办法.    我们的目标是:我们在中文系统中编辑的含有中文字符串或进行中文处理的JAVA源程序经编译后可以移值到任何其它的操作系统中正确运行,或拿到其它操作系统中编译后能正确运行,能正确地传递中文和英文参数,能正确地和数据库交流中英文字符串.    我们的具体思路是:在JAVA程序转码的入口和出口及JAVA程序同用户有输入输出转换的地方限制编码方法使之正确即

Java编程的中文问题的几条分析原则

尽管关于Java中文问题的讨论已经相当多了,但由于Java的相关技术标准繁多,面向Java的Web服务器.应用服务器以及JDBC数据库驱动等都没有官方的标准,所以Java应用在处理中文时所存在的问题不仅没有消失而且随着所选用的服务器.驱动程序以及运行环境等因素的不同而变化.那么我们如何从众多现象中找出问题所在,并进行分析和解决呢?与大部分的讨论不同,本文将主要从如何预测.发现和检查问题的角度给出建议,帮助开发人员找出可能引起问题的各种源头,从而更好地解决Java的中文问题. 引言 尽管对于Jav

分享java打印简单图形的实现代码_java

我们平时都是使用的画图工具进行简单图形的绘制,今天我们使用java打印一些简单的图形 实现代码如下 package test; /** * * @author hanzel * @打印图形 * */ public class Array { public static void main(String[] args) { //打印长方形 int[] a = new int[10]; for(int i=0 ;i<a.length;i++){ for(int j=0;j<a.length;j++

java实现短地址服务的方法(附代码)_java

假设下面是你的视频网站链接列表,如果别人想爬取你的数据十分轻松,看规则就知道数据库是序列自增的 http://www.xxxx.com/video/1 http://www.xxxx.com/video/2 http://www.xxxx.com/video/3 那么解决这一问题,我们可以使用短地址,不对外暴露真实链接,使用对称加密是一个很好的方案. Hashids是一个很好的选择,它提供了JS/PHP/JAVA/PYTHON等编程语言的实现,这里我使用的就是它. 下面是我基于blade框架搭建

Apache CXF 在 WebLogic 9.2 上的问题定位分析及权宜之计

http://yulimin.javaeye.com/blog/129015 同样的程序在 Tomcat 5.5.16/25 以及 Jetty 5.1.12 上都能够成功部署及运行,但是部署到 WebLogic 9.2 上时出错 org.springframework.web.context.ContextLoader initWebApplicationContext FATAL: Context initialization failed org.springframework.beans.

java源程序有操作mysql中表的语句怎么打包jar

问题描述 java源程序有操作mysql中表的语句怎么打包jar 5C 1 怎样在装有mysql的电脑运行2 怎样在没mysql的电脑运行 解决方案 MySQL装在哪个电脑都可以,只要可以远程访问就行. 解决方案二: http://blog.csdn.net/liuwei_blog/article/details/3567292 解决方案三: 不知道你是用的什么构建工具,http://blog.csdn.net/c_4818/article/details/6700950 解决方案四: http