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

📄 minesweeper.java

📁 This is a game using numbers.There are many boxes.select number and fill it in each box.
💻 JAVA
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package media;/** * * @author Internet */import java.awt.* ;import java.awt.event.* ;import java.awt.geom.* ;import javax.swing.* ;import javax.swing.event.* ;/**MineSweeper by SciWizEH*//**MineSweeper by SciWizEH*/public class MineSweeper extends JFrame implements ActionListener ,		MouseListener {	int rows = 10 ;	int cols = 10 ;	int numMines = 10 ;	GridLayout layout = new GridLayout ( rows , cols ) ;	/*type[][] name = new type[rows][cols];	 * type[x][y];	 * is 1d	 * type[] name = new type[rows*cols];	 * type[(rows*y)+x];*/	boolean [ ] mines = new boolean [ rows * cols ] ;	boolean [ ] clickable = new boolean [ rows * cols ] ;	boolean lost = false ;	boolean won = false ;	int [ ] numbers = new int [ rows * cols ] ;	JButton [ ] buttons = new JButton [ rows * cols ] ;	boolean [ ] clickdone = new boolean [ rows * cols ] ;	JMenuItem newGameButton = new JMenuItem ( "new game" ) ;	JMenuItem difficulty = new JMenuItem ( "options" ) ;	JLabel mineLabel = new JLabel ( "mines: " + numMines + " marked: 0" ) ;	JPanel p = new JPanel ( ) ;	public MineSweeper ( ) {		p.setLayout ( layout ) ;		setupI ( ) ;		for ( int i = 0 ; i < ( rows * cols ) ; i ++ ) {			p.add ( buttons [ i ] ) ;		}		JMenuBar mb = new JMenuBar ( ) ;		JMenu m = new JMenu ( "file" ) ;		newGameButton.addActionListener ( this ) ;		m.add ( newGameButton ) ;		difficulty.addActionListener ( this ) ;		m.add ( difficulty ) ;		mb.add ( m ) ;		this.setJMenuBar ( mb ) ;		this.add ( p ) ;		this.add ( mineLabel , BorderLayout.SOUTH ) ;		this.pack ( ) ;		this.setVisible ( true ) ;	}	public void fillMines ( ) {		int needed = numMines ;		while ( needed > 0 ) {			int x = ( int ) Math.floor ( Math.random ( ) * rows ) ;			int y = ( int ) Math.floor ( Math.random ( ) * cols ) ;			if ( ! mines [ ( rows * y ) + x ] ) {				mines [ ( rows * y ) + x ] = true ;				needed -- ;			}		}	}	public void fillNumbers ( ) {		for ( int x = 0 ; x < rows ; x ++ ) {			for ( int y = 0 ; y < cols ; y ++ ) {				int cur = ( rows * y ) + x ;				if ( mines [ cur ] ) {					numbers [ cur ] = 0 ;					continue ;				}				int temp = 0 ;				boolean l = ( x - 1 ) >= 0 ;				boolean r = ( x + 1 ) < rows ;				boolean u = ( y - 1 ) >= 0 ;				boolean d = ( y + 1 ) < cols ;				int left = ( rows * ( y ) ) + ( x - 1 ) ;				int right = ( rows * ( y ) ) + ( x + 1 ) ;				int up = ( rows * ( y - 1 ) ) + ( x ) ;				int upleft = ( rows * ( y - 1 ) ) + ( x - 1 ) ;				int upright = ( rows * ( y - 1 ) ) + ( x + 1 ) ;				int down = ( rows * ( y + 1 ) ) + ( x ) ;				int downleft = ( rows * ( y + 1 ) ) + ( x - 1 ) ;				int downright = ( rows * ( y + 1 ) ) + ( x + 1 ) ;				if ( u ) {					if ( mines [ up ] ) {						temp ++ ;					}					if ( l ) {						if ( mines [ upleft ] ) {							temp ++ ;						}					}					if ( r ) {						if ( mines [ upright ] ) {							temp ++ ;						}					}				}				if ( d ) {					if ( mines [ down ] ) {						temp ++ ;					}					if ( l ) {						if ( mines [ downleft ] ) {							temp ++ ;						}					}					if ( r ) {						if ( mines [ downright ] ) {							temp ++ ;						}					}				}				if ( l ) {					if ( mines [ left ] ) {						temp ++ ;					}				}				if ( r ) {					if ( mines [ right ] ) {						temp ++ ;					}				}				numbers [ cur ] = temp ;			}		}	}	public void setupI ( ) {		for ( int x = 0 ; x < rows ; x ++ ) {			for ( int y = 0 ; y < cols ; y ++ ) {				mines [ ( rows * y ) + x ] = false ;				clickdone [ ( rows * y ) + x ] = false ;				clickable [ ( rows * y ) + x ] = true ;				buttons [ ( rows * y ) + x ] = new JButton ( /*"" + ( x * y )*/) ;				buttons [ ( rows * y ) + x ].setPreferredSize ( new Dimension (						45 , 45 ) ) ;				buttons [ ( rows * y ) + x ].addActionListener ( this ) ;				buttons [ ( rows * y ) + x ].addMouseListener ( this ) ;			}		}		fillMines ( ) ;		fillNumbers ( ) ;	}	public void setupI2 ( ) {		this.remove ( p ) ;		p = new JPanel ( ) ;		layout = new GridLayout ( rows , cols ) ;		p.setLayout ( layout ) ;		buttons = new JButton [ rows * cols ] ;		mines = new boolean [ rows * cols ] ;		clickdone = new boolean [ rows * cols ] ;		clickable = new boolean [ rows * cols ] ;		numbers = new int [ rows * cols ] ;		setupI ( ) ;		for ( int i = 0 ; i < ( rows * cols ) ; i ++ ) {			p.add ( buttons [ i ] ) ;		}		this.add ( p ) ;		this.pack ( ) ;		fillMines ( ) ;		fillNumbers ( ) ;	}	public void setup ( ) {		for ( int x = 0 ; x < rows ; x ++ ) {			for ( int y = 0 ; y < cols ; y ++ ) {				mines [ ( rows * y ) + x ] = false ;				clickdone [ ( rows * y ) + x ] = false ;				clickable [ ( rows * y ) + x ] = true ;				buttons [ ( rows * y ) + x ].setEnabled ( true ) ;				buttons [ ( rows * y ) + x ].setText ( "" ) ;			}		}		fillMines ( ) ;		fillNumbers ( ) ;		lost = false ;		mineLabel.setText ( "mines: " + numMines + " marked: 0" ) ;	}	public static void main ( String [ ] args ) {		new MineSweeper ( ) ;	}	public void actionPerformed ( ActionEvent e ) {		if ( e.getSource ( ) == difficulty ) {			rows = Integer.parseInt ( ( String ) JOptionPane.showInputDialog (					this , "Rows" , "Rows" , JOptionPane.PLAIN_MESSAGE , null ,					null , 10 ) ) ;			cols = Integer.parseInt ( ( String ) JOptionPane.showInputDialog (					this , "Columns" , "Columns" , JOptionPane.PLAIN_MESSAGE ,					null , null , 10 ) ) ;			numMines = Integer.parseInt ( ( String ) JOptionPane					.showInputDialog ( this , "Mines" , "Mines" ,							JOptionPane.PLAIN_MESSAGE , null , null , 10 ) ) ;			setupI2 ( ) ;		}		if ( ! won ) {			for ( int x = 0 ; x < rows ; x ++ ) {				for ( int y = 0 ; y < cols ; y ++ ) {					if ( e.getSource ( ) == buttons [ ( rows * y ) + x ]							&& ! won && clickable [ ( rows * y ) + x ] ) {						doCheck ( x , y ) ;						break ;					}				}			}		}		if ( e.getSource ( ) == newGameButton ) {			setup ( ) ;			won = false ;			return ;		}		checkWin ( ) ;	}	public void mouseEntered ( MouseEvent e ) {	}	public void mouseExited ( MouseEvent e ) {	}	public void mousePressed ( MouseEvent e ) {		if ( e.getButton ( ) == 3 ) {			int n = 0 ;			for ( int x = 0 ; x < rows ; x ++ ) {				for ( int y = 0 ; y < cols ; y ++ ) {					if ( e.getSource ( ) == buttons [ ( rows * y ) + x ] ) {						clickable [ ( rows * y ) + x ] = ! clickable [ ( rows * y )								+ x ] ;					}					if ( ! clickdone [ ( rows * y ) + x ] ) {						if ( ! clickable [ ( rows * y ) + x ] ) {							buttons [ ( rows * y ) + x ].setText ( "X" ) ;							n ++ ;						} else {							buttons [ ( rows * y ) + x ].setText ( "" ) ;						}						mineLabel.setText ( "mines: " + numMines + " marked: "								+ n ) ;					}				}			}		}	}	public void mouseReleased ( MouseEvent e ) {	}	public void mouseClicked ( MouseEvent e ) {	}	public void doCheck ( int x , int y ) {		int cur = ( rows * y ) + x ;		boolean l = ( x - 1 ) >= 0 ;		boolean r = ( x + 1 ) < rows ;		boolean u = ( y - 1 ) >= 0 ;		boolean d = ( y + 1 ) < cols ;		int left = ( rows * ( y ) ) + ( x - 1 ) ;		int right = ( rows * ( y ) ) + ( x + 1 ) ;		int up = ( rows * ( y - 1 ) ) + ( x ) ;		int upleft = ( rows * ( y - 1 ) ) + ( x - 1 ) ;		int upright = ( rows * ( y - 1 ) ) + ( x + 1 ) ;		int down = ( rows * ( y + 1 ) ) + ( x ) ;		int downleft = ( rows * ( y + 1 ) ) + ( x - 1 ) ;		int downright = ( rows * ( y + 1 ) ) + ( x + 1 ) ;		clickdone [ cur ] = true ;		buttons [ cur ].setEnabled ( false ) ;		if ( numbers [ cur ] == 0 && ! mines [ cur ] && ! lost && ! won ) {			if ( u && ! won ) {				if ( ! clickdone [ up ] && ! mines [ up ] ) {					clickdone [ up ] = true ;					buttons [ up ].doClick ( ) ;				}				if ( l && ! won ) {					if ( ! clickdone [ upleft ] && numbers [ upleft ] != 0							&& ! mines [ upleft ] ) {						clickdone [ upleft ] = true ;						buttons [ upleft ].doClick ( ) ;					}				}				if ( r && ! won ) {					if ( ! clickdone [ upright ] && numbers [ upright ] != 0							&& ! mines [ upright ] ) {						clickdone [ upright ] = true ;						buttons [ upright ].doClick ( ) ;					}				}			}			if ( d && ! won ) {				if ( ! clickdone [ down ] && ! mines [ down ] ) {					clickdone [ down ] = true ;					buttons [ down ].doClick ( ) ;				}				if ( l && ! won ) {					if ( ! clickdone [ downleft ] && numbers [ downleft ] != 0							&& ! mines [ downleft ] ) {						clickdone [ downleft ] = true ;						buttons [ downleft ].doClick ( ) ;					}				}				if ( r && ! won ) {					if ( ! clickdone [ downright ]							&& numbers [ downright ] != 0							&& ! mines [ downright ] ) {						clickdone [ downright ] = true ;						buttons [ downright ].doClick ( ) ;					}				}			}			if ( l && ! won ) {				if ( ! clickdone [ left ] && ! mines [ left ] ) {					clickdone [ left ] = true ;					buttons [ left ].doClick ( ) ;				}			}			if ( r && ! won ) {				if ( ! clickdone [ right ] && ! mines [ right ] ) {					clickdone [ right ] = true ;					buttons [ right ].doClick ( ) ;				}			}		} else {			buttons [ cur ].setText ( "" + numbers [ cur ] ) ;			if ( ! mines [ cur ] && numbers [ cur ] == 0 ) {				buttons [ cur ].setText ( "" ) ;			}		}		if ( mines [ cur ] && ! won ) {			buttons [ cur ].setText ( "0" ) ;			doLose ( ) ;		}	}	public void checkWin ( ) {		for ( int x = 0 ; x < rows ; x ++ ) {			for ( int y = 0 ; y < cols ; y ++ ) {				int cur = ( rows * y ) + x ;				if ( ! clickdone [ cur ] ) {					if ( mines [ cur ] ) {						continue ;					} else {						return ;					}				}			}		}		doWin ( ) ;	}	public void doWin ( ) {		if ( ! lost && ! won ) {			won = true ;			JOptionPane.showMessageDialog ( null ,					"you win!\nstarting a new game" , "you lose" ,					JOptionPane.INFORMATION_MESSAGE ) ;			newGameButton.doClick ( ) ;		}	}	public void doLose ( ) {		if ( ! lost && ! won ) {			lost = true ;			for ( int i = 0 ; i < rows * cols ; i ++ ) {				if ( ! clickdone [ i ] ) {					buttons [ i ].doClick ( 0 ) ;				}			}			JOptionPane.showMessageDialog ( null ,					"you lose!\nstarting a new game" , "you lose" ,					JOptionPane.ERROR_MESSAGE ) ;			setup ( ) ;		}	}}

⌨️ 快捷键说明

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