⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myframe.java

📁 扫雷游戏
💻 JAVA
字号:
package cleanMine;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.UIManager.LookAndFeelInfo;

public class MyFrame implements ActionListener
{
    JFrame jf;
	JMenuBar jmb;
	JLabel jl_1,jl_2,jl_3,jl_4;
	JButton restart;
	MineButton[][] mines;
	JPanel jp_center;
	int level=10;
	boolean isGoing=true;
	int countClick=level;
	timeThread tt;
	public MyFrame()
	{
		jf=new JFrame("扫雷 --JAVA版--");
		initMenuBar();
		jf.setLayout(new BorderLayout());
		initNorth();
		initMines();
		tt=new timeThread(jl_4);
		tt.start();
		showMe();
	}
	private void initMines()
	{
		isGoing=true;
		if(jp_center!=null)
		{
			jf.remove(jp_center);
		}
		mines=new MineButton[level][level];
		jp_center=new JPanel();
		jp_center.setLayout(new GridLayout(level,level));//将面板布局为设置为十行十列的网格.setLayout(new GridLayout(level,level));//将面板布局为设置为十行十列的网格
		jf.add(jp_center,BorderLayout.CENTER);
	    for(int i=0;i<mines.length;i++)
	    {
	    	for(int j=0;j<mines[i].length;j++)
	    	{
	    		mines[i][j]=new MineButton(i,j);
	    		jp_center.add(mines[i][j]);
	    		mines[i][j].addActionListener(this);
	    		mines[i][j].addMouseListener(new MouseAdapter(){
	    			public void mousePressed(MouseEvent arg0)
	    			{
	    				if(arg0.getButton()==3)
	    				{
	    					MineButton m=(MineButton)arg0.getSource();
	    					if(countClick>0)
	    					{
	    						if(!m.isChangD()&&!m.isFlagd())
		    					{
		    						m.setFlagd(true);
		    						m.setText("?");
		    						countClick--;
		    						jl_2.setText(""+countClick);
		    					}
		    					else if(!m.isChangD()&&m.isFlagd())
		    					{
		    						m.setFlagd(true);
		    						m.setText("");
		    						countClick++;
		    						jl_2.setText(""+countClick);
		    					}
	    						if(countClick==0)
	    						{
	    							boolean success=true;
	    							for(int i=0;i<level;i++)
	    								for(int j=0;j<level;j++)
	    								{
	    									if(mines[i][j].getText().equals("?")&&mines[i][j].getIsMines()!=-1)
	    									{
	    										success=false;
	    										break;
	    									}
	    								}
	    							if(success)
	    							{
	    								restart.setText("您成功了!");
	    								tt.stopTime();
	    							}
	    							else
	    							{
	    								restart.setText("您输了!");
	    								tt.stopTime();
	    							}
	    						}
	    					}
	    					
	    				}
	    			}
	    			
	    		});
	    	}
	    }
	    //布雷
	    int count=0;
	    while(count<level)
	    {
	    	int x=(int)(Math.random()*level);
	    	int y=(int)(Math.random()*level);
	    	if(mines[x][y].getIsMines()!=-1)
	    	{
	    		mines[x][y].setIsMines(-1);
	    		count++;
	    	}
	    }
	    //判断周围的雷数
	    for(int i=0;i<mines.length;i++)
		{
			for(int j=0;j<mines[i].length;j++)
			{
				if(mines[i][j].getIsMines()!=-1)
				{
					int countMines=0;
					if(i-1>-1&&j-1>-1&&mines[i-1][j-1].getIsMines()==-1)
						countMines++;
					if(i-1>-1&&j>-1&&mines[i-1][j].getIsMines()==-1)
						countMines++;
					if(i-1>-1&&j+1<mines[i-1].length&&mines[i-1][j+1].getIsMines()==-1)
						countMines++;
					if(j-1>-1&&mines[i][j-1].getIsMines()==-1)
						countMines++;
					if(j+1<mines[i].length&&mines[i][j+1].getIsMines()==-1)
						countMines++;
					if(i+1<mines.length&&j-1>-1&&mines[i+1][j-1].getIsMines()==-1)
						countMines++;
					if(i+1<mines.length&&mines[i+1][j].getIsMines()==-1)
						countMines++;
					if(i+1<mines.length&&j+1<mines[i+1].length&&mines[i+1][j+1].getIsMines()==-1)
						countMines++;
					mines[i][j].setIsMines(countMines);
				}				
			}			
		}
	    
	    //jf.add(jp,BorderLayout.CENTER);
	}
	private void initNorth()
	{
		jl_1=new JLabel("剩余雷数:");
		jl_2=new JLabel(level+"");
		jl_3=new JLabel("所用时间:");
		jl_4=new JLabel("0");
	    restart=new JButton("重新开始");
	    restart.addActionListener(this);
	    JPanel jp=new JPanel();    
	    jp.add(jl_1);
	    jp.add(jl_2);
	    jp.add(restart);
	    jp.add(jl_3);
	    jp.add(jl_4);
	    jf.add(jp,BorderLayout.NORTH);	    
	}
	private void initMenuBar()//初始化菜单栏
	{
		jmb=new JMenuBar();//创建菜单栏
		JMenu jm_1=new JMenu("游戏");//创建菜单项
		JMenuItem jm_1_1=new JMenuItem("开局");
		jm_1_1.addActionListener(this);
	    ButtonGroup bg_1=new ButtonGroup();//用于捆绑初高级菜单,使其只能二选一
		JCheckBoxMenuItem jm_1_2=new JCheckBoxMenuItem("初级",true);//单选菜单
		jm_1_2.addActionListener(this);
		bg_1.add(jm_1_2);
		JCheckBoxMenuItem jm_1_3=new JCheckBoxMenuItem("高级");//单选菜单
		jm_1_3.addActionListener(this);
		bg_1.add(jm_1_3);
		JMenuItem jm_1_4=new JMenuItem("退出");
		jm_1_4.addActionListener(this);
		jm_1.add(jm_1_1);
		jm_1.addSeparator();//添加横线
		jm_1.add(jm_1_2);
		jm_1.add(jm_1_3);
		jm_1.addSeparator();//添加横线
		jm_1.add(jm_1_4);
		
		JMenu jm_2=new JMenu("界面");//创建菜单项
		ButtonGroup bg_2=new ButtonGroup();
		JCheckBoxMenuItem jm_2_1=new JCheckBoxMenuItem("XP样式",true);
		jm_2_1.addActionListener(this);
		bg_2.add(jm_2_1);
		JCheckBoxMenuItem jm_2_2=new JCheckBoxMenuItem("经典样式",true);
		jm_2_2.addActionListener(this);
		bg_2.add(jm_2_2);
		jm_2.add(jm_2_1);
		jm_2.add(jm_2_2);
		
		jmb.add(jm_1);//加载菜单
		jmb.add(jm_2);//加载菜单
		
		jf.setJMenuBar(jmb);//加载菜单栏	
	}
	private void showMe()
	{
		tt.reset();
		jf.setLocation(300,100);
		jf.setSize(30*level,30*level+60);
		jf.setVisible(true);
		jf.setResizable(false);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭按钮生效
	}
	public static void main(String[] args) 
	{
		new MyFrame();
	}
	public void actionPerformed(ActionEvent e)
	{
		String comm=e.getActionCommand();
		if("开局".equals(comm))
		{
			jl_2.setText(level+"");
			jl_4.setText("0");
			initMines();
			countClick=level;
			restart.setText("重新开始");
			showMe();
			//isGoing=true;
		}
		else if("初级".equals(comm))
		{
			level=10;
			jl_2.setText(level+"");
			jl_4.setText("0");
			initMines();
			countClick=level;
			restart.setText("重新开始");
			showMe();
			//isGoing=true;
		}
		else if("高级".equals(comm))
		{
			level=20;
			jl_2.setText(level+"");
			jl_4.setText("0");
			initMines();
			countClick=level;
			restart.setText("重新开始");
			showMe();
			//isGoing=true;
		}
		else if("退出".equals(comm))
		{
			System.exit(1);
		}
		else if("XP样式".equals(comm))
		{
			LookAndFeelInfo[] infos=UIManager.getInstalledLookAndFeels();
			String[] names=new String[infos.length];
			for(int i=0;i<infos.length;i++)
			{
				names[i]=infos[i].getClassName();
			}
			try 
			{
				UIManager.setLookAndFeel(names[0]);
			} 
			catch (Exception e1) 
			{
				e1.printStackTrace();
			} 
			SwingUtilities.updateComponentTreeUI(jf);	
		}
		else if("经典样式".equals(comm))
		{
			LookAndFeelInfo[] infos=UIManager.getInstalledLookAndFeels();
			String[] names=new String[infos.length];
			for(int i=0;i<infos.length;i++)
			{
				names[i]=infos[i].getClassName();
			}
			try 
			{
				UIManager.setLookAndFeel(names[3]);
			} 
			catch (Exception e1) 
			{
				e1.printStackTrace();
			} 
			SwingUtilities.updateComponentTreeUI(jf);
		}
		else if("重新开始".equals(comm)||"您成功了!".equals(comm)||"您输了!".equals(comm))
		{
			jl_2.setText(level+"");
			jl_4.setText("0");
			initMines();
			countClick=level;
			restart.setText("重新开始");
			showMe();
			//isGoing=true;
		}
		else 
		{			
			if(isGoing)
			{			
				MineButton mine=(MineButton)e.getSource();
				if(mine.getText()!="?")
				{
					if(mine.getIsMines()==-1)
					{
						isGoing=false;
						for(int i=0;i<mines.length;i++)
							for(int j=0;j<mines[i].length;j++)
							{
								//mines[i][j].setEnabled(false);
								if(mines[i][j].getIsMines()==-1)
								{
									mines[i][j].setText("*");
									mines[i][j].setFont(new Font("comic Sans MS",27,27));
									restart.setText("您输了!");
									tt.stopTime();
								}
						
							}
					}
					else
					{
						showEmpty(mine.getRow(),mine.getCol());
					}
				}
				
			}
		}
		
		
	}
	private void showEmpty(int row,int col) 
	{
		MineButton m=mines[row][col];
		if(!m.isChangD())
		{
			if(m.getIsMines()==0)
			{
				//m.setText(""+m.getIsMines());
				m.setBackground(Color.WHITE);
				m.setChangD(true);
				if(row-1>-1&&col-1>-1)
					showEmpty(row-1,col-1);
				if(row-1>-1)
					showEmpty(row-1,col);
				if(row-1>-1&&col+1<level)
					showEmpty(row-1,col+1);
				if(col-1>-1)
					showEmpty(row,col-1);
				if(col+1<level)
					showEmpty(row,col+1);
				if(row+1<level&&col-1>-1)
					showEmpty(row+1,col-1);
				if(row+1<level)
					showEmpty(row+1,col);
				if(row+1<level&&col+1<level)
					showEmpty(row+1,col+1);
			}
			else if(m.getIsMines()==1)
			{
				m.setForeground(Color.BLUE);
				m.setText(""+m.getIsMines());
				m.setChangD(true);
			}
			else if(m.getIsMines()==2)
			{
				m.setForeground(Color.GREEN);
				m.setText(""+m.getIsMines());
				m.setChangD(true);
			}
			else
			{
				m.setForeground(Color.RED);
				m.setText(""+m.getIsMines());
				m.setChangD(true);
			}
			//m.setChangD(true);
		}	
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -