package 临时; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Font; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class 扫雷 extends JFrame{ JButton B[][]; JLabel L[][]; JFrame f; GridBagLayout layout; GridBagConstraints c=new GridBagConstraints(); JTextArea area1=new JTextArea(5,2); JTextArea area2=new JTextArea(5,2); JButton start=new JButton("开始"); JPanel panel=new JPanel(); int sizex,sizey; int nx,ny; Action action; Icon boomb=new ImageIcon("炸弹.png"); Boolean judge[][]; int num[][]; Font font=new Font("华云彩文",Font.BOLD,25); Color color=Color.red; int boombnum; Text t=new Text();; Boolean tB=false,b=false; final JFrame f1=new JFrame("设置面板"); public 扫雷() { initcountrol(); } public static void main(String[] arg) { 扫雷 a=new 扫雷(); } public int initcountrol() { JLabel Label=new JLabel("输入雷的数量"); final JTextField F=new JTextField(5); JLabel Label1=new JLabel("输入水平网格数"); JLabel Label2=new JLabel("输入垂直网格数"); final JTextField F1=new JTextField(5); final JTextField F2=new JTextField(5); F.setText("10"); F1.setText("9"); F2.setText("9"); F2.setEditable(false); JButton button=new JButton("保存设置"); f1.setLayout(new FlowLayout()); f1.add(Label); f1.add(F); f1.add(Label1); f1.add(F1); f1.add(Label2); f1.add(F2); f1.add(button); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(F.getText().equals("")) { JOptionPane.showMessageDialog(null, "请输入正确的雷数"); return;//阻断其他赋值操作避免重复提示 } else { boombnum=Integer.valueOf(F.getText()); } if(F1.equals("")) { JOptionPane.showMessageDialog(null, "请输入水平网格数"); return;//阻断其他赋值操作避免重复提示 }else { nx=Integer.valueOf(F1.getText()); F2.setText(F1.getText()); } if(F2.equals("")) { JOptionPane.showMessageDialog(null, "垂直网格数与水平的保持相同"); return;//阻断其他赋值操作避免重复提示 }else { ny=Integer.valueOf(F2.getText()); } if(boombnum>=nx*ny) { JOptionPane.showMessageDialog(null, "输入的雷数过大"); return; } // TODO 自动生成的方法存根 nx=ny; sizex=nx*60; sizey=ny*60+300; B=new JButton[nx+2][ny+2]; L=new JLabel[nx+2][ny+2]; action=new Action(nx,ny); judge=new Boolean[nx+2][ny+2]; num=new int[nx+2][ny+2]; initpanel(nx,ny,sizex,sizey); area2.setText(""+boombnum); f.setVisible(true); f1.setVisible(false); t.start(); tB=false; t.time=0; } }); f1.setVisible(true); f1.setLocation(800,200); f1.setSize(200,300); //f.pack(); return boombnum; } public void initpanel(int nx,int ny,int sizex,int sizey) { f=new JFrame("扫雷"); layout=new GridBagLayout();//防止二次打开界面时程序界面异常if初始化在外面初始化界面将会出错 f.setLayout(layout); c.fill=GridBagConstraints.BOTH; c.weightx=0.3; c.weighty=0.15; c.gridx=2; c.gridy=0; c.gridwidth=(int) (nx*0.4); c.gridheight=6; layout.setConstraints(area1, c); f.add(area1); c.gridheight=2; c.gridwidth=(int) (nx*0.2); c.gridx=(int) (nx*0.5+3); c.gridy=0; start.setPreferredSize(new Dimension((int)(800/nx-3),(int)(800/ny))); layout.setConstraints(start, c); c.gridx=(int) (nx*0.8+2); c.gridy=0; c.gridwidth=(int) (nx*0.4); c.gridheight=3; c.weighty=0.0; area2.setFont(new Font("微软雅黑",Font.BOLD,45)); area2.setBackground(Color.yellow); layout.setConstraints(area2, c); f.add(area2); f.add(start); c.ipadx=0; c.ipady=0; c.gridheight=1; c.gridwidth=1; c.weighty=0.3; for(int n=1;n<nx+1;n++) { for(int m=1;m<ny+1;m++) { L[m][n]=new JLabel(""+m+","); L[m][n].setPreferredSize(new Dimension((int)(sizex/nx-3),(int)(sizey/ny))); c.gridx=m+2; c.gridy=n+5; layout.setConstraints(L[m][n], c); f.add(L[m][n]); L[m][n].setVisible(false); num[m][n]=0; judge[m][n]=false; } } for(int n=0;n<nx+1;n++) {//边缘补偿防止越界便于setnum方法的实现 L[n][0]=new JLabel(""); L[0][n]=new JLabel(""); L[n][nx+1]=new JLabel(""); L[nx+1][n]=new JLabel(""); judge[0][n]=false; judge[n][0]=false; judge[nx+1][n]=false; judge[n][nx+1]=false; B[n][0]=new JButton(""); B[0][n]=new JButton(""); B[n][nx+1]=new JButton(""); B[nx+1][n]=new JButton(""); } setboomb(boombnum, nx, ny); setnum(nx,ny); for(int n=1;n<nx+1;n++) { for(int m=1;m<ny+1;m++) { B[m][n]=new JButton(); B[m][n].setPreferredSize(new Dimension((int)(sizex/nx-3),(int)(sizey/ny))); c.gridx=m+2; c.gridy=n+5; layout.setConstraints(B[m][n], c); B[m][n].addActionListener(action); B[m][n].setOpaque(false); f.add(B[m][n]); } } start.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { f1.setVisible(true); f.setVisible(false); t.time=0; // TODO 自动生成的方法存根 tB=false; } }); f.addWindowListener(new WindowListener() { @Override public void windowOpened(WindowEvent e) { JOptionPane.showMessageDialog(null, "本程序来自码源天空 用户名: gaojinlei"); // TODO 自动生成的方法存根 } @Override public void windowIconified(WindowEvent e) { // TODO 自动生成的方法存根 } @Override public void windowDeiconified(WindowEvent e) { // TODO 自动生成的方法存根 } @Override public void windowDeactivated(WindowEvent e) { // TODO 自动生成的方法存根 } @Override public void windowClosing(WindowEvent e) { // TODO 自动生成的方法存根 } @Override public void windowClosed(WindowEvent e) { JOptionPane.showMessageDialog(null, "程序退出"); // TODO 自动生成的方法存根 } @Override public void windowActivated(WindowEvent e) { // TODO 自动生成的方法存根 } }); f.setSize(sizex,sizey); f.setVisible(false); } private void setnum(int nx,int ny) { for(int n=0;n<nx+1;n++) { for(int m=0;m<ny+1;m++) { num[n][m]=0; }} for(int n=1;n<nx+1;n++) { for(int m=1;m<ny+1;m++) { if(judge[n][m]) { num[n-1][m-1]++; num[n-1][m]++; num[n-1][m+1]++; num[n][m-1]++; num[n][m+1]++; num[n+1][m-1]++; num[n+1][m]++; num[n+1][m+1]++; } } } for(int n=1;n<nx+1;n++) { for(int m=1;m<ny+1;m++) { L[n][m].setText(num[n][m]==0?"":""+num[n][m]); L[n][m].setFont(new Font("华云彩文",Font.BOLD,25)); if(L[n][m].getText().equals("2")){ L[n][m].setForeground(Color.blue); } if(L[n][m].getText().equals("3")){ L[n][m].setForeground(Color.orange); } if(L[n][m].getText().equals("4")){ L[n][m].setForeground(Color.pink); } } } pack(); // TODO 自动生成的方法存根 } public void setboomb(int num,int nx,int ny) { int m=num; while(m>0) { int x=(int) (Math.random()*nx+1); int y=(int) (Math.random()*nx+1); if(judge[x][y]) { }else { judge[x][y]=true; L[x][y].setIcon(boomb); m--; } } } class Action implements ActionListener{ int nx=0,ny=0; public Action(int x,int y) { nx=x; ny=y; } @Override public void actionPerformed(ActionEvent e) { for(int n=1;n<nx+1;n++) { for(int m=1;m<ny+1;m++) { if(e.getSource().equals(B[n][m])) { //System.out.println(e.getSource()); B[n][m].setVisible(false); L[n][m].setVisible(true); //System.out.println(11); linkopen(n,m,nx,ny); if(judge[n][m]) { tB=true; JOptionPane.showMessageDialog(null, "失败"); openAll(); return; } judgewin(); } } } } private void openAll() { for(int n=1;n<nx+1;n++) { for(int m=1;m<ny+1;m++) { B[n][m].setVisible(false); L[n][m].setVisible(true); } } } // TODO 自动生成的方法存根 public void judgewin() { int num=0; for(int n=1;n<nx;n++) { for(int m=1;m<ny;m++) { if(B[n][m].isVisible()) num++; System.out.println(num); } } if(num==boombnum) { tB=true; JOptionPane.showMessageDialog(null, "恭喜你完成了游戏用时"+area1.getText()); } } } // public void linkopen(int n,int m,int nx,int ny) { // for(int nn=-1;nn<=1;nn++) { // for(int mm=-1;mm<=1;mm++) { // if(!judge[n-nn][m-mm]&&mm!=nn&&mm!=-nn) { // B[n-nn][m-mm].setVisible(false); // if(n-nn>1&&m-mm>1&&n-nn<nx-1&&m-mm<ny-1) { // if(B[n-nn][m-mm].isVisible()) // linkopen(n-nn,m-mm,nx,ny);} // } // } // } // // } public void linkopen(int n,int m,int nx,int ny) { linkopentop(n,m,nx,ny); linkopenbottom(n,m,nx,ny); linkopenleft(n,m,nx,ny); linkopenright(n,m,nx,ny); } private void linkopenright(int n, int m, int nx, int ny) { for(int mm=1;m+mm<ny+1;mm++) { if(!judge[n][m+mm]&&B[n][m+mm].isVisible()) { B[n][m+mm].setVisible(false); L[n][m+mm].setVisible(true); linkopentop(n,m+mm,nx,ny); linkopenbottom(n,m+mm,nx,ny); if(!(L[n][m+mm].getText().equals(""))) return; }else { break; } } } private void linkopenleft(int n, int m, int nx, int ny) { for(int mm=-1;m+mm>0;mm--) { if(!judge[n][m+mm]&&B[n][m+mm].isVisible()) { B[n][m+mm].setVisible(false); L[n][m+mm].setVisible(true); linkopentop(n,m+mm,nx,ny); linkopenbottom(n,m+mm,nx,ny); if(!(L[n][m+mm].getText().equals(""))) return; }else { break; } } } private void linkopenbottom(int n, int m, int nx, int ny) { for(int nn=1;n+nn<nx+1;nn++) { if(!judge[n+nn][m]&&B[n+nn][m].isVisible()) { B[n+nn][m].setVisible(false); L[n+nn][m].setVisible(true); linkopenleft(n+nn,m,nx,ny); linkopenright(n+nn,m,nx,ny); if(!(L[n+nn][m].getText().equals(""))) return; }else { break; } } } public void linkopentop(int n,int m,int nx,int ny) { for(int nn=-1;n+nn>0;nn--) { if(!judge[n+nn][m]&&B[n+nn][m].isVisible()) { B[n+nn][m].setVisible(false); L[n+nn][m].setVisible(true); System.out.println(n+nn); linkopenleft(n+nn,m,nx,ny); linkopenright(n+nn,m,nx,ny); if(!(L[n+nn][m].getText().equals(""))) return; }else { break; } } } class Text extends Thread{ int time=0; public void run() { time=0; while(true){ try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } if(!tB) { area1.setText(time+""); area1.setFont(new Font("微软雅黑",Font.BOLD,25)); time++; area1.setBackground(new Color(125,(int)(255*Math.random()),(int)(255*Math.random()))); } } // TODO 自动生成的方法存根 } } }

fhjdbxjdj LV1
2024年12月27日
张德志 LV9
2023年12月27日
zhihong fan LV2
2023年12月26日
jiemomo LV12
2023年10月19日
liangge2115 LV27
2023年7月23日
喃喵xxxx LV6
2023年3月30日
总有人间一两风 LV8
2022年12月12日
xixiwoaini LV3
2022年11月30日
微信网友_5999549969633280 LV1
2022年6月12日
选了了 LV7
2021年12月14日

fhjdbxjdj LV1
2024年12月27日
13605416728 LV5
2024年12月13日
luoyanglin LV2
2024年9月14日
张德志 LV9
2023年12月27日
zhihong fan LV2
2023年12月26日
lshlsh
2023年12月25日
暂无贡献等级
jiemomo LV12
2023年10月19日
liangge2115 LV27
2023年7月20日
yangxb2 LV10
2023年7月11日
sdhfkh LV4
2023年6月12日