Hi, i have to modify this code to declare Cell as a standalone class instead of an inner class, and, when the game is over, the user should not be able to click the empty cells to mark them. Can you give me a clue? Yes this is a class assignment!
// TicTacToe.java: Play the TicTacToe game package Chapter10; import java.awt.*; import Chapter8.MyFrameWithExitHandling; import java.awt.event.*; import javax.swing.*; import javax.swing.border.LineBorder; public class TicTacToe extends JApplet { // Indicate which player has a turn, initially it is the X player private char whoseTurn = 'X'; // Create and initialize cells private Cell[][] cell = new Cell[3][3]; // Create and initialized a status label private JLabel jlblStatus = new JLabel("X's turn playing"); // Initialize UI public void init() { // Panel p to hold cells JPanel p = new JPanel(); p.setLayout(new GridLayout(3, 3, 0, 0)); for (int i=0; i<3; i++) for (int j=0; j<3; j++) p.add(cell[i][j] = new Cell()); // Set line borders on the cells panel and the status label p.setBorder(new LineBorder(Color.red, 1)); jlblStatus.setBorder(new LineBorder(Color.yellow, 1)); // Place the panel and the label to the applet this.getContentPane().add(p, BorderLayout.CENTER); this.getContentPane().add(jlblStatus, BorderLayout.SOUTH); } // This main method enables the applet to run as an application public static void main(String[] args) { // Create a frame MyFrameWithExitHandling frame = new MyFrameWithExitHandling( "Mouse Drawing Demo"); // Create an instance of the applet TicTacToe applet = new TicTacToe(); // Add the applet instance to the frame frame.getContentPane().add(applet, BorderLayout.CENTER); // Invoke init() and start() applet.init(); applet.start(); // Display the frame frame.setSize(300, 300); frame.setVisible(true); } // Determine if the cells are all occupied public boolean isFull() { for (int i=0; i<3; i++) for (int j=0; j<3; j++) if (cell[i][j].getToken() == ' ') return false; return true; } // Determine if the player with the specified toekn wins public boolean won(char token) { for (int i=0; i<3; i++) if ((cell[i][0].getToken()==token) && (cell[i][1].getToken()==token) && (cell[i][2].getToken()==token)) { return true; } for (int j=0; j<3; j++) if ((cell[0][j].getToken()==token) && (cell[1][j].getToken()==token) && (cell[2][j].getToken()==token)) { return true; } if ((cell[0][0].getToken()==token) && (cell[1][1].getToken()==token) && (cell[2][2].getToken()==token)) { return true; } if ((cell[0][2].getToken()==token) && (cell[1][1].getToken()==token) && (cell[2][0].getToken()==token)) { return true; } return false; } // An inner class for a cell public class Cell extends JPanel implements MouseListener { // Token used for this cell private char token = ' '; public Cell() { setBorder(new LineBorder(Color.black, 1)); // Set cell's border addMouseListener(this); // Register listener } // The getter method for token public char getToken() { return token; } // The setter method for token public void setToken(char c) { token = c; repaint(); } // Paint the cell public void paintComponent(Graphics g) { super.paintComponent(g); if (token == 'X') { g.drawLine(10, 10, getSize().width-10, getSize().height-10); g.drawLine(getSize().width-10, 10, 10, getSize().height-10); } else if (token == 'O') { g.drawOval(10, 10, getSize().width-20, getSize().height-20); } } // Handle mouse click on a cell public void mouseClicked(MouseEvent e) { if (token == ' ') // If cell is not occupied { if (whoseTurn == 'X') // If it is the X player's turn { setToken('X'); // Set token in the cell whoseTurn = 'O'; // Change the turn jlblStatus.setText("O's turn"); // Display status if (won('X')) jlblStatus.setText("X won! The game is over"); else if (isFull()) jlblStatus.setText("Draw! The game is over"); } else if (whoseTurn == 'O') // If it is the O player's turn { setToken('O'); // Set token in the cell whoseTurn = 'X'; // Change the turn jlblStatus.setText("X's turn"); // Display status if (won('O')) jlblStatus.setText("O won! The game is over"); else if (isFull()) jlblStatus.setText("Draw! The game is over"); } } } public void mousePressed(MouseEvent e) { //TODO: implement this java.awt.event.MouseListener method; } public void mouseReleased(MouseEvent e) { //TODO: implement this java.awt.event.MouseListener method; } public void mouseEntered(MouseEvent e) { //TODO: implement this java.awt.event.MouseListener method; } public void mouseExited(MouseEvent e) { //TODO: implement this java.awt.event.MouseListener method; } } }
ryan burgdorfer
Ranch Hand
Joined: Jan 24, 2001
Posts: 219
posted
0
YIKES! That is alot of code to wade through. I suggest editing your post, enclosing the code within code tags and indenting it. Much more likely that someone will take the time to wade through it and point you in the right direction that way BTW, code tags look like this: (beginning and end, respectively) [ code ] insert code here [ /code ] Just remove the spaces inside the brackets. ------------------
Sorry!!! I know it's alot of code, but I was just wondering if there is some way to insert some code that will stop the player from being able to continue to click on cells after the game has been won. I think that is really all this program requires. thanks, Mary Ellen
You have the answer right there. Maybe if I rephrase it for you: "If the game has been won, ignore all mouse clicks on cells." or "If the game has been won, do nothing when user clicks on cells." J.Lacar
Originally posted by MaryEllen Volb: ...stop the player from being able to continue to click on cells after the game has been won.