import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Connect4 { /** * Program: Connect4.java * Purpose: Stacking disk game for 2 players * Creator: Chris Clarke * Created: 19.08.2007 * Modified: 29.11.2012 (JFrame) */ public static void main(String[] args) { Connect4JFrame frame = new Connect4JFrame(); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } class Connect4JFrame extends JFrame implements ActionListener { private Button btn1, btn2, btn3, btn4, btn5, btn6, btn7; private Label lblSpacer; MenuItem newMI, exitMI, redMI, yellowMI; int[][] theArray; boolean end=false; boolean gameStart; public static final int BLANK = 0; public static final int RED = 1; public static final int YELLOW = 2; public static final int MAXROW = 6; // 6 rows public static final int MAXCOL = 7; // 7 columns public static final String SPACE = " "; // 18 spaces int activeColour = RED; public Connect4JFrame() { setTitle("Connect4 by Chris Clarke"); MenuBar mbar = new MenuBar(); Menu fileMenu = new Menu("File"); newMI = new MenuItem("New"); newMI.addActionListener(this); fileMenu.add(newMI); exitMI = new MenuItem("Exit"); exitMI.addActionListener(this); fileMenu.add(exitMI); mbar.add(fileMenu); Menu optMenu = new Menu("Options"); redMI = new MenuItem("Red starts"); redMI.addActionListener(this); optMenu.add(redMI); yellowMI = new MenuItem("Yellow starts"); yellowMI.addActionListener(this); optMenu.add(yellowMI); mbar.add(optMenu); setMenuBar(mbar); // Build control panel. Panel panel = new Panel(); btn1 = new Button("1"); btn1.addActionListener(this); panel.add(btn1); lblSpacer = new Label(SPACE); panel.add(lblSpacer); btn2 = new Button("2"); btn2.addActionListener(this); panel.add(btn2); lblSpacer = new Label(SPACE); panel.add(lblSpacer); btn3 = new Button("3"); btn3.addActionListener(this); panel.add(btn3); lblSpacer = new Label(SPACE); panel.add(lblSpacer); btn4 = new Button("4"); btn4.addActionListener(this); panel.add(btn4); lblSpacer = new Label(SPACE); panel.add(lblSpacer); btn5 = new Button("5"); btn5.addActionListener(this); panel.add(btn5); lblSpacer = new Label(SPACE); panel.add(lblSpacer); btn6 = new Button("6"); btn6.addActionListener(this); panel.add(btn6); lblSpacer = new Label(SPACE); panel.add(lblSpacer); btn7 = new Button("7"); btn7.addActionListener(this); panel.add(btn7); add(panel, BorderLayout.NORTH); initialize(); // Set to a reasonable size. setSize(1024, 768); } // Connect4 public void initialize() { theArray=new int[MAXROW][MAXCOL]; for (int row=0; row0) break; if (row>0) { theArray[--row][n]=activeColour; if (activeColour==RED) activeColour=YELLOW; else activeColour=RED; repaint(); } } public void displayWinner(Graphics g, int n) { g.setColor(Color.BLACK); g.setFont(new Font("Courier", Font.BOLD, 100)); if (n==RED) g.drawString("Red wins!", 100, 400); else g.drawString("Yellow wins!", 100, 400); end=true; } public void check4(Graphics g) { // see if there are 4 disks in a row: horizontal, vertical or diagonal // horizontal rows for (int row=0; row0 && curr == theArray[row][col+1] && curr == theArray[row][col+2] && curr == theArray[row][col+3]) { displayWinner(g, theArray[row][col]); } } } // vertical columns for (int col=0; col0 && curr == theArray[row+1][col] && curr == theArray[row+2][col] && curr == theArray[row+3][col]) displayWinner(g, theArray[row][col]); } } // diagonal lower left to upper right for (int row=0; row0 && curr == theArray[row+1][col+1] && curr == theArray[row+2][col+2] && curr == theArray[row+3][col+3]) displayWinner(g, theArray[row][col]); } } // diagonal upper left to lower right for (int row=MAXROW-1; row>=3; row--) { for (int col=0; col0 && curr == theArray[row-1][col+1] && curr == theArray[row-2][col+2] && curr == theArray[row-3][col+3]) displayWinner(g, theArray[row][col]); } } } // end check4 public void actionPerformed(ActionEvent e) { if (e.getSource() == btn1) putDisk(1); else if (e.getSource() == btn2) putDisk(2); else if (e.getSource() == btn3) putDisk(3); else if (e.getSource() == btn4) putDisk(4); else if (e.getSource() == btn5) putDisk(5); else if (e.getSource() == btn6) putDisk(6); else if (e.getSource() == btn7) putDisk(7); else if (e.getSource() == newMI) { end=false; initialize(); repaint(); } else if (e.getSource() == exitMI) { System.exit(0); } else if (e.getSource() == redMI) { // don't change colour to play in middle of game if (!gameStart) activeColour=RED; } else if (e.getSource() == yellowMI) { if (!gameStart) activeColour=YELLOW; } } // end ActionPerformed } // class