Herzlich Willkommen

Live processing contents

Friday, October 8, 2010

MINESWEEPER in JAVA

SYNTACS MINESWEEPER

import java.awt.* ;
import java.awt.event.* ;
import java.awt.geom.* ;
import javax.swing.* ;
import javax.swing.event.* ;
/**MineSweeper by XXX */
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 ( ) ;
        }
    }
}

*** Coba...Coba....Coba........ susaah jugaa.....

No comments:

Post a Comment