// Scott DeRuiter 1/23/01 // Minefield.java // Use the left, right, up, and down keys to navigate around the // minefield. // 3/13/2013 Greenstein: changed applet to JFrame import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Minefield implements KeyListener, FocusListener, MouseListener { private MinefieldCell [][] board; private int x = 0, y = 0; private int numberofbad = 6; private boolean done = false, firsttime; private JFrame frame; private PaintPanel canvas; public Minefield ( ) { SetUpBoard ( ); } public static void main(String[] args) { Minefield mf = new Minefield(); mf.Run(); } public void SetUpBoard ( ) { x = y = 0; numberofbad = 6; done = false; firsttime = true; board = new MinefieldCell[8][8]; for ( int i = 0; i < 8; i++ ) for ( int k = 0; k < 8; k++ ) board[i][k] = new MinefieldCell(); PlaceBadCells ( ); for ( int i = 0; i < 8; i++ ) for ( int k = 0; k < 8; k++ ) CountBadNeighbors (i, k); } public void Run () { // Create a frame to hold everything frame = new JFrame ("Minefield"); frame.setSize(600, 400); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //frame.setBackground(Color.black); // only needed if frame is larger than panel // Define panel to draw on canvas = new PaintPanel(); // create a panel to draw on canvas.setBackground(Color.gray); canvas.addFocusListener(this); canvas.addKeyListener(this); canvas.addMouseListener(this); // connects the MouseListerner to the panel window // Put frame together frame.getContentPane().add(canvas); // puts panel on frame frame.setVisible(true); } class PaintPanel extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); if ( firsttime ) { GiveDirections ( g ); } else { for ( int i = 0; i < 8; i++ ) for ( int k = 0; k < 8; k++ ) board[i][k].drawCell( g, i * 40 + 117, k * 40 + 17, 36, 36 ); board[x][y].changeToOnCell( ); board[x][y].changeToCellVisited( ); board[x][y].drawCell( g, x * 40 + 117, y * 40 + 17, 36, 36 ); } } } public void focusGained(FocusEvent evt) { firsttime = false; canvas.repaint(); } public void focusLost(FocusEvent evt) { firsttime = true; canvas.repaint(); } public void mousePressed(MouseEvent evt) { canvas.requestFocus(); } public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } public void mouseReleased(MouseEvent evt) { } public void mouseClicked(MouseEvent evt) { } public void keyTyped ( KeyEvent e ) {} public void keyPressed ( KeyEvent e ) { Graphics g = canvas.getGraphics(); int value = e.getKeyCode(); if ( value == KeyEvent.VK_SPACE ) { SetUpBoard ( ); firsttime = false; canvas.repaint ( ); } else if (( value == KeyEvent.VK_RIGHT || value == KeyEvent.VK_LEFT || value == KeyEvent.VK_UP || value == KeyEvent.VK_DOWN ) && !done ) { board[x][y].changeToOffCell( ); board[x][y].drawCell( g, x * 40 + 117, y * 40 + 17, 36, 36 ); if ( value == KeyEvent.VK_RIGHT && x < 7 ) x++; else if ( value == KeyEvent.VK_LEFT && x > 0 ) x--; else if ( value == KeyEvent.VK_UP && y > 0 ) y--; else if ( value == KeyEvent.VK_DOWN && y < 7 ) y++; board[x][y].changeToOnCell( ); board[x][y].changeToCellVisited( ); board[x][y].drawCell( g, x * 40 + 117, y * 40 + 17, 36, 36 ); if ( board[x][y].checkForBadCell ( ) || (x == 7 && y == 7) ) { done = true; DrawFinalBoard (g); } } public void keyReleased ( KeyEvent e ) {} public void GiveDirections ( Graphics g ) { Font direct = new Font ( "Serif", Font.BOLD, 40 ); g.setFont ( direct ); g.setColor ( Color.blue ); g.drawString ( "CLICK ON THE APPLET", 50, 100 ); g.drawString ( "TO BEGIN OR RESUME", 55, 200 ); g.drawString ( "THE GAME", 180, 300 ); } public void PlaceBadCells ( ) { int badx, bady; for ( int v = 1; v <= numberofbad; v++ ) { badx = (int)( Math.random() * 8 ); bady = (int)( Math.random() * 8 ); if ( (badx != 0 || bady != 0) && !board[badx][bady].checkForBadCell() && (badx != 7 || bady != 7) ) board[badx][bady].changeToBadCell( ); else v--; } } public void CountBadNeighbors (int i, int k) { for ( int j = -1; j < 2; j++ ) for ( int m = -1; m < 2; m++ ) if ( i + j >= 0 && i + j <= 7 && k + m >= 0 && k + m <= 7 ) if ( board[i+j][k+m].checkForBadCell( ) ) board[i][k].incrementBadNeighbors( ); } public void DrawFinalBoard ( Graphics g ) { for ( int i = 0; i < 8; i++ ) for ( int k = 0; k < 8; k++ ) { board[i][k].changeToCellVisited ( ); board[i][k].drawCell( g, i * 40 + 117, k * 40 + 17, 36, 36 ); WinOrLoseMessage ( g ); } } public void WinOrLoseMessage ( Graphics g ) { g.setColor ( Color.red ); Font letters = new Font("Serif", Font.BOLD, 20); g.setFont(letters); if ( x == 7 && y == 7 ) { g.drawString ( "YOU", 20, 40 ); g.drawString ( "ARE", 20, 70 ); g.drawString ( "A", 20, 100 ); g.drawString ( "WINNER!", 20, 130 ); } else { g.drawString ( "Sorry,",20, 40 ); g.drawString ( "but",20, 70 ); g.drawString ( "this",20, 100 ); g.drawString ( "time",20, 130 ); g.drawString ( "you",20, 160 ); g.drawString ( "lost.",20, 190 ); } g.drawString ( "Hit", 460, 40 ); g.drawString ( "Spacebar", 460, 70 ); g.drawString ( "to", 460, 100 ); g.drawString ( "play", 460, 130 ); g.drawString ( "again.", 460, 160 ); } } class MinefieldCell { private int badneighbors; private boolean visited; private boolean oncell; private boolean badcell; public MinefieldCell () { badneighbors = 0; visited = false; oncell = false; badcell = false; } public void drawCell ( Graphics g, int xvalue, int yvalue, int width, int height ) { g.setColor ( Color.blue ); if ( oncell ) g.setColor ( Color.red ); else if ( visited ) g.setColor ( Color.white ); g.fillRect ( xvalue, yvalue, width, height ); if ( oncell || visited ) { g.setColor ( Color.black ); Font letters = new Font("Serif", Font.BOLD, height); g.setFont(letters); if ( badcell ) g.drawString ( "*", xvalue + width / 4, yvalue + 11 * height / 12 ); else g.drawString ( "" + badneighbors, xvalue + width / 4, yvalue + 11 * height / 12 ); } } public void changeToOnCell ( ) { oncell = true; } public void changeToOffCell ( ) { oncell = false; } public void changeToCellVisited ( ) { visited = true; } public void changeToBadCell ( ) { badcell = true; } public void incrementBadNeighbors ( ) { badneighbors++; } public boolean checkForBadCell ( ) { if ( badcell ) return true; else return false; } }